如何在库中使用冲突命名空间

2 投票
1 回答
524 浏览
提问于 2025-04-17 18:59

我有一个类似这样的结构来管理我的包:

top/
├── __init__.py
└── io
    └── __init__.py

现在我在导入标准库 urllib3.filepost 时遇到了问题:

gonvaled@pegasus ~/top » python
Python 2.7.2 (default, Jan 11 2013, 17:58:01) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib3.filepost
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/gonvaled/.virtualenvs/python2.7.2-wavilon1/lib/python2.7/site-packages/urllib3/__init__.py", line 16, in <module>
    from .connectionpool import (
  File "/home/gonvaled/.virtualenvs/python2.7.2-wavilon1/lib/python2.7/site-packages/urllib3/connectionpool.py", line 42, in <module>
    from .request import RequestMethods
  File "/home/gonvaled/.virtualenvs/python2.7.2-wavilon1/lib/python2.7/site-packages/urllib3/request.py", line 12, in <module>
    from .filepost import encode_multipart_formdata
  File "/home/gonvaled/.virtualenvs/python2.7.2-wavilon1/lib/python2.7/site-packages/urllib3/filepost.py", line 11, in <module>
    from io import BytesIO
ImportError: cannot import name BytesIO

为什么标准库会去找 top.io 呢?我该怎么避免这个问题?我其实很想把 top.io 用作我的包名。

1 个回答

2

Python并没有在top.io里查找。

实际上,Python是在当前目录里查找。当前目录是Python查找导入内容时,sys.path列表中第一个要查看的位置。而文件io.py就在你的本地目录里。

切记,不要在你的包里面运行Python解释器(也就是说,确保当前工作目录不是top),另外,也不要给本地模块起一个和标准库同名的名字。

撰写回答