ModuleNotFoundError
运行 Python 3.8.x
我正在构建一个包含类和函数的 python 包,每个类和函数都带有详细的测试。在包中,我尝试使用这些构建块通过在这些文件顶部使用绝对导入来提供端到端使用和示例(就像在我的测试中一样)。
项目结构如下:
.
├── __init__.py
├── setup.py
├── examples
│ ├── __init__.py
│ └── end_to_end_1.py
├── tests
│ ├── __init__.py
│ └── utils
│ ├── __init__.py
│ ├── test_useful_one.py
│ └── test_useful_two.py
└── utils
├── __init__.py
├── useful_one.py
└── useful_two.py
我正在使用从包根目录运行所有测试,并且两个测试文件都包含来自这样python -m unittest tests/**/*.py
的绝对包导入,utils
from utils.useful_one import UsefulClass
这种方法在运行测试并将UsefulClass
类导入测试文件中是成功的。
examples/end_to_end_1.py
尝试在模块内使用相同的导入语句并使用执行文件(再次从包的根目录)时出现我的问题
python examples/end_to_end_1.py
现在我得到了一个运行时ModuleNotFoundError: No module named 'utils'
。
在尝试遵循 python 语言指南时,我尝试尽可能使用绝对导入,但无济于事。
我肯定误解了__init__.py
文件应该如何告诉运行时从哪里解析包。我不认为这个用例是异常的,因为我在节点包和 ruby gems 中一直看到同样的模式。
临时(临时)解决方案
目前,为了解决这个问题,我已经在 ModuleNotFoundError中应用了 Absolute import results 中的解决方案,尽管可以工作,但当存储库公开可用时,它似乎不太可扩展,我觉得 Python 生态系统将为这个问题提供解决方案。正如雷蒙德·赫廷格所说,感觉就像..
一定会有更好的办法!