在开发Python模块时使用绝对导入?

时间:2014-08-30 15:07:48

标签: python python-import

我知道不建议使用相对导入,例如引自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

会引发ImportError:

Traceback (most recent call last):
  File "package2/somescript.py", line 1, in <module>
    import package2.somemodule
ImportError: No module named package2.somemodule

2 个答案:

答案 0 :(得分:2)

您在哪里主要&#39;文件是。

如果你有:

myproject/
  package1/
     __init__.py
     somemodule.py
  package2/
     __init__.py
     somemodule.py
     somescript.py
main.py

somescript.py:

import package2.somemodule
import package1

main.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 ,你就没有问题。

答案 1 :(得分:1)

一种常见的做法是 pip install -e /path_to_your_pkg/,它会在 Python 站点包目录中创建包的符号链接(而不是像在标准安装中那样复制它),这样做将启用:

  • 在任何地方导入 your_pkg
  • 您可以继续开发/更新您的软件包,并且安装的版本始终是最新的

一个已知问题是,如果您遵循 PEP 517 并将 setup.py 替换为 setup.cfgpyproject.toml,则 pip install -e 不起作用。您需要如下转储 setup.py 来解决此兼容性问题(2021 年 1 月仍然存在问题):

import setuptools
setuptools.setup()