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

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

我知道不建议相对导入,例如引用自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
python python-import
2个回答
3
投票

取决于你的“主”文件所在的位置。

如果你有:

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


1
投票

一种常见的做法是

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

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

一个已知问题是,如果您遵循 PEP 517 并将

setup.py
替换为
setup.cfg
pyproject.toml
,则
pip install -e
不起作用。您需要如下转储
setup.py
来修复此兼容性问题(2021 年 1 月仍然是一个问题):

import setuptools
setuptools.setup()
© www.soinside.com 2019 - 2024. All rights reserved.