【发布时间】:2018-04-29 09:17:45
【问题描述】:
好的,场景很简单。我有这个文件结构:
.
├── interface.py
├── pkg
│ ├── __init__.py
│ ├── mod1.py
│ ├── mod2.py
现在,这些是我的条件:
- mod2 需要导入 mod1。
- interface.py 和 mod2 都需要作为主脚本独立运行。如果您愿意,可以将 interface 视为实际程序,将 mod2 视为包的内部测试人员。
因此,在 Python 2 中,我只需在 mod2.py 中执行 import mod1 即可,python2 mod2.py 和 python2 interface.py 都会按预期工作。
但是,这是我不太了解的部分,使用 Python 3.5.2,如果我这样做 import mod1;然后我可以做python3 mod2.py,但是python3 interface.py 抛出:ImportError: No module named 'mod1' :(
因此,显然,python 3 建议使用import pkg.mod1 来避免与内置模块发生冲突。好的,如果我使用它,我可以做到python3 interface.py;但后来我不能python3 mod2.py 因为:ImportError: No module named 'pkg'
同样,如果我使用相对导入:
from . import mod1 然后 python3 interface.py 工作;但是 mod2.py 说 SystemError: Parent module '' not loaded, cannot perform relative import :( :(
我发现唯一的“解决方案”是上一个文件夹并执行python -m pkg.mod2,然后它就可以工作了。但是我们是否必须将包前缀 pkg 添加到该包中其他模块的每个导入中?更重要的是,要运行包内的任何脚本,我是否必须记住向上一个文件夹并使用 -m 开关?这是唯一的方法吗??
我很困惑。这个场景在 python 2 中非常简单,但在 python 3 中看起来很尴尬。
更新:我已在此处上传带有(称为“解决方案”)工作源代码的这些文件:https://gitlab.com/Akronix/test_python3_packages。注意我还是不喜欢,而且看起来比python2的方案丑多了。
我已经阅读过的相关 SO 问题:
- Python -- import the package in a module that is inside the same package
- How to do relative imports in Python?
- Absolute import module in same package
相关链接:
【问题讨论】:
-
这是迄今为止我找到的最好(虽然令人失望)的答案:stackoverflow.com/a/8195271/2904315
-
在您的 mod2.py 中,您可以使用相对导入,而不是
from pkg.mod1 import fun,例如from .mod1 import fun或from . import mod1,这将减少提及包名称的需要。这些在 python2 和 3 中工作。很好的阅读,relative imports for the billionth time
标签: python-3.x import package