Python包在安装后找不到它的某个模块



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

  1. 整个包__init__.py的initfile:
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
但是我不知道这是不是";右";组织包裹的方式。。。

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

接下来,您的公共API在最上面的__init__.py中定义如下:

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发生了变化,我会怀疑这是恶作剧,并开始寻找替代方案。

相关内容

  • 没有找到相关文章

最新更新