Python包在安装后找不到其模块之一

2024-06-06 16:54:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构建一个Python包。为简化起见,我只会提及与问题有关的部分: 包(目录)称为moranpycess,其中有三个相关文件:

  1. 整个包的初始化文件__init__.py
from .Individual import Individual
from .MoranProcess import MoranProcess
  1. 一个名为Individual的模块,其中包含一个类Individual

  2. 一个名为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
然而,我不知道这是否是组织一个包的“正确”方式


Tags: 模块infrompyimportinitlineindividual
1条回答
网友
1楼 · 发布于 2024-06-06 16:54:27

相对进口比绝对进口更难准确。它们也更脆弱(例如,如果你移动一个文件进行导入,它会断开),所以除非你有充分的理由使用相对导入,否则我建议只使用绝对导入

接下来,在最顶层的__init__.py中定义的公共API如下所示:

from moranpycess.MoranProcess import MoranProcess

__all__ = ["MoranProcess"]  # import hint that some tools use

而非公共对象仍然可以通过以下方式在内部导入(例如在MoranProcess.py):

from moranpycess.Individual import Individual 

绝对进口的好处是,无论您在包中(或包外)什么地方,它们看起来总是一样的


如果这样做,安装了您的软件包的用户应该能够像这样使用您的对象:

from moranpycess import MoranProcess  # directly gets the object, not module

为了让导入工作,您应该尽量避免与sys.path混淆,主要是因为它不是必需的。如果您所做的只是编写以常规方式使用的常规python代码,那么内置导入机制应该可以很好地服务于您的用例

如果我要导入一个包并注意到sys.path发生了变化,我会怀疑这是个骗局,并开始寻找替代方案

相关问题 更多 >