我知道不建议相对导入,例如引用自PEP8:
强烈建议不要进行包内导入的相对导入。 始终对所有导入使用绝对包路径。即使现在 PEP 328在Python 2.5中完全实现,其显式风格 积极阻止相对进口;绝对进口量更多 便携且通常更具可读性。
如果我正在开发一个包(包含多个模块)怎么办?在开发过程中,如果不安装/部署包,绝对导入将无法工作。这是否意味着我必须定期安装/部署当前的 WIP 模块以进行测试?
这里是Cld提供的示例。给定一个 Python 项目/包:
myproject/
package1/
__init__.py
somemodule.py
package2/
__init__.py
somemodule.py
somescript.py
main.py
在
main.py
中,绝对导入效果很好:
import package1
import package2.somescript
import package2.somemodule
但是,对于模块,例如 package2 中的
somescript.py
,以下绝对导入:
import package2.somemodule
import package1
它会引发导入错误:
Traceback (most recent call last):
File "package2/somescript.py", line 1, in <module>
import package2.somemodule
ImportError: No module named package2.somemodule
取决于你的“主”文件所在的位置。
如果你有:
myproject/
package1/
__init__.py
somemodule.py
package2/
__init__.py
somemodule.py
somescript.py
main.py
somescript.py:
import package2.somemodule
import package1
主.py
import package1
import package2.somescript
import package2.somemodule
如果执行:python package2/somescript.py你会得到一个错误
Traceback (most recent call last):
File "package2/somescript.py", line 1, in <module>
import package2.somemodule
ImportError: No module named package2.somemodule
但是如果你执行python main.py,就没有问题。
一种常见的做法是
pip install -e /path_to_your_pkg/
,它将在 Python site-packages 目录中创建包的符号链接(而不是像标准安装那样复制它),这样做将启用:
一个已知问题是,如果您遵循 PEP 517 并将
setup.py
替换为 setup.cfg
和 pyproject.toml
,则 pip install -e
不起作用。您需要如下转储setup.py
来修复此兼容性问题(2021 年 1 月仍然是一个问题):
import setuptools
setuptools.setup()