我正在尝试构建一个Python包。为简化起见,我只会提及与问题有关的部分:
包(目录)称为moranpycess
,其中有三个相关文件:
__init__.py
:from .Individual import Individual
from .MoranProcess import MoranProcess
一个名为Individual
的模块,其中包含一个类Individual
一个名为MoranProcess
的模块,其中包含一个类MoranProcess
。在顶部,它导入前面的模块:import Individual
我使用python -m pip install .
安装包
然后我运行一个测试,看看包是否可以正确导入:python -c 'import moranpycess'
我得到:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/runner/work/angry-moran-simulator/angry-moran-simulator/moranpycess/__init__.py", line 18, in <module>
from .MoranProcess import MoranProcess
File "/home/runner/work/angry-moran-simulator/angry-moran-simulator/moranpycess/MoranProcess.py", line 22, in <module>
import Individual
ModuleNotFoundError: No module named 'Individual'
Error: Process completed with exit code 1.
这对我来说很奇怪,因为Python解释器似乎可以找到包,包导入相应的类,但解释器也尝试执行顶级模块导入,并且(我不知道为什么)它没有找到模块…
我做错什么了吗
目录结构:
└── moranpycess
├── Individual.py
├── MoranProcess.py
└── __init__.py
我正在考虑这里提出的解决方案:
https://stackoverflow.com/a/49375740/2340598
然而,我不知道这是否是组织一个包的“正确”方式
相对进口比绝对进口更难准确。它们也更脆弱(例如,如果你移动一个文件进行导入,它会断开),所以除非你有充分的理由使用相对导入,否则我建议只使用绝对导入
接下来,在最顶层的
__init__.py
中定义的公共API如下所示:而非公共对象仍然可以通过以下方式在内部导入(例如在
MoranProcess.py
):绝对进口的好处是,无论您在包中(或包外)什么地方,它们看起来总是一样的
如果这样做,安装了您的软件包的用户应该能够像这样使用您的对象:
为了让导入工作,您应该尽量避免与
sys.path
混淆,主要是因为它不是必需的。如果您所做的只是编写以常规方式使用的常规python代码,那么内置导入机制应该可以很好地服务于您的用例如果我要导入一个包并注意到
sys.path
发生了变化,我会怀疑这是个骗局,并开始寻找替代方案相关问题 更多 >
编程相关推荐