Python 包在调用入口点时引发 ModuleNotFoundError,除非以可编辑模式安装

Python package raises ModuleNotFoundError on calling an entry-point except if installed in editable mode

我有一个 Python 包,起初看起来安装得很好,但是当调用其中一个入口点时会引发 ModuleNotFoundException。该模块在其他方面被发现与来自交互式解释器的 import package 以及 python -m package.etc 都很好。 但是 如果我尝试直接调用入口点(类似 python -m package.etc.main),它会引发一个 AttributeError 说模块没有属性 __path__.

我可以看到包裹pip list

该项目目前使用“模板”pyproject.toml 并且仅 setup.cfg 设置,但行为基本相同(回溯看起来略有不同但错误相同)在 pyproject.toml 上使用 setup.py,既使用 pip,也使用 setup.py 直接调用。项目结构为:

package
├── __init__.py
├── cli
│   ├── __init__.py
│   ├── entry.py
├── file.py

如果在虚拟环境中执行此操作,我会得到与在用户空间 (--user) 安装时执行此操作相同的行为。

修改环境变量${PYTHONPATH}解决了问题,在可编辑模式下安装包就可以了。

原来问题是我遇到了类似的问题:

[options]
packages = find:

[options.packages.find]
include =
  README.md

在我的 setup.cfg 中,似乎 include 的声明是独占的,这导致该包未包含在安装中,但在以可编辑模式安装时仍然有效(大概因为可编辑模式只会设置某种链接或将源代码目录附加到某些路径。