版本 = 属性:在 setup.cfg 中,ModuleNotFoundError

version = attr: in setup.cfg, ModuleNotFoundError

在我的 Python 目录布局项目中

.
├── justfile
├── pyproject.toml
├── README.md
├── setup.cfg
└── src
    └── foobar
        ├── __about__.py
        ├── __init__.py
        └── main.py

__about__.py 阅读

__version__ = "1.0.0"

我想在 setup.cfg 中使用此版本信息。我试过了

[metadata]
name = foobar
version = attr: foobar.__about__.__version__

[options]
package_dir =
    =src
packages = find:
install_requires =
    rich
python_requires = >=3.6

[options.packages.find]
where=src

但这仍然会尝试导入 foobar,导致在尝试评估版本字符串时来自 foobars 依赖项的 ModuleNotFoundErrors。

__init__.py 读取

from .main import solve
from .__about__ import __version__

我的印象是在 this PR has been merged, just the AST of the attr was evaluated. (See also 之后。)

知道哪里出了问题吗?

src 不是包导入路径的一部分(您不会对已安装的包执行 import src.foobar),它只是一个目录。

尝试

version = attr:foobar.__about__.__version__

相反(假设您 set up the src/ layout in setup.cfg)。

我发现了问题。在 __init__.py 中,__version__ 必须在 所有外部依赖项之前被导入 。这个

from .__about__ import __version__
from .main import solve

有效。