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

时间:2019-04-16 03:31:25

标签: python-3.x pip

我有一个小的pip程序包(我们称其为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?

我真的很想了解为什么这些进口商品在将来无法避免类似问题的原因。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

原始海报在这里:

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

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