Python3导入 - 从pip差异运行本地vs

问题描述 投票:0回答:2

我有一个小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不兼容?

我真的很想知道为什么这些进口产品在未来不能避免类似的问题。

python-3.x pip
2个回答
0
投票

首先,阅读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


0
投票

原创海报:

问题是由于pip将在my_package级别安装软件包,因此依赖于将导入设置为.helpersmy_package.helpers,而运行脚本my_package.py不会安装软件包,因此需要编写导入不同。

我会尽快标记这是正确答案(我相信明天会这样)

© www.soinside.com 2019 - 2024. All rights reserved.