我有一个小pip-package(让我们称之为my_package),我在python3中用以下目录结构编写。我对在本地运行my_package.py
时遇到的差异感到困惑,当我通过从PyPI下载它,将其导入其他代码然后运行它来测试它时。
.
| README.md
| LICENSE
| setup.py
| build
| dist
| my_package
| -- __init__.py
| -- my_package.py
| -- helpers
| ---- __init__.py
| ---- helper1.py
| ---- helper2.py
| ---- helper3.py
| ---- helper4.py
在my_package.py
我有以下进口:
from helpers import helper1
from helpers import helper2
from helpers import helper3
from helpers import helper4
显然这些只是填充名称,但重点仍然是我试图从my_package.py
脚本的helpers目录中导入一些代码。
如果我在本地运行my_package.py,我的代码执行没有任何问题 - 我认为这是python3的预期行为。但是,如果我将其上传到PyPI然后导入包,我收到以下错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import my_package
File "/Users/fakeUser/.virtualenvs/pip-testing/lib/python3.7/site-packages/my_package/__init__.py", line 1, in <module>
from . my_package import main_function
File "/Users/fakeUser/.virtualenvs/pip-testing/lib/python3.7/site-packages/my_package/my_package.py", line 6, in <module>
from helpers import helper1
ModuleNotFoundError: No module named 'helpers'
要解决此问题,我将my_package.py
中的导入修改为如下所示:
from .helpers import helper1
from .helpers import helper2
from .helpers import helper3
from .helpers import helper4
据我所知,python3使用.
来帮助解决相对导入问题。这对我来说是有意义的,因为如果我正在运行my_package.py
,添加.
应该清楚地表明helpers
目录与my_package.py
在同一目录中。实际上,进行此修改确实解决了从pip下载软件包的问题,但是如果我在本地运行此代码,现在会引入以下问题:
Traceback (most recent call last):
File "my_package.py", line 6, in <module>
from .helpers import helper1
ModuleNotFoundError: No module named '__main__.helpers'; '__main__' is not a package
我想知道这里发生了什么。特别是如果有人可以解释以下内容:
.
会使代码与本地使用不兼容?.
会使代码与pip不兼容?我真的很想知道为什么这些进口产品在未来不能避免类似的问题。
首先,阅读modules首先使用以下模式
my_package
| README.md
| LICENSE
| setup.py
| build
| dist
| src
| --my_package
| ---- __init__.py
| ---- helpers
| ------__init__.py
| ------ helper1.py
| ------ helper2.py
| ------helper3.py
| ------helper4.py
您现在可以将顶级__init__.py
定义为空,根据__init__.py
的外观定义内部helperx.py
,然后在安装模块时,可以相应地调用helper1,例如from my_package.helpers import helper1
原创海报:
问题是由于pip将在my_package
级别安装软件包,因此依赖于将导入设置为.helpers
或my_package.helpers
,而运行脚本my_package.py
不会安装软件包,因此需要编写导入不同。
我会尽快标记这是正确答案(我相信明天会这样)