gpt4 book ai didi

python-3.x - 使用 setup.cfg 和通过 attr 访问的版本时出现 ModuleNotFoundError

转载 作者:行者123 更新时间:2023-12-03 14:24:25 24 4
gpt4 key购买 nike

我有一个具有以下结构的 Python 包:

├── setup.cfg
├── setup.py
└── src
└── myproject
   ├── base.py
   ├── __init__.py
   └── version.py

setup.cfg , 版本定义为 attr :
[metadata]
name = myproject
version = attr: myproject.version.__version__

version.py很简单:

__version__ = "1.2.3"

该软件包具有在 setup.cfg 中列出的依赖项.另一方面,包的顶级 __init__.py导入包的一些对象:

from myproject.base import Stuff

__all__ = ["Stuff"]

而且,显然, base.py从依赖项中导入一些对象。

现在的问题是,如果我尝试使用 python setup.py当未安装依赖项时,我有一个 ModuleNotFoundError/ ImportError , 自 __init__.py导入导入这些依赖项的对象(这对于 the Python documentation on managing version file 中的案例 6 非常有用):

python setup.py --version
Traceback (most recent call last):
<snip>
ModuleNotFoundError: No module named 'dependency_module'

这使得无法安装依赖项。那么针对版本文件的最佳策略应该是什么?

到目前为止,我已经在 __init__.py 上尝试了这种奇怪的异常处理方法。 :

try:
from myproject.base import Stuff
except ImportError:
pass

有没有更好的办法?还是另一种方法?

最佳答案

看起来您遇到了此处提交的问题:https://github.com/pypa/setuptools/issues/1724
你最好在 VERSION.txt 中写下你的版本号, 从 setup.cfg 阅读与 version = file: VERSION.txt ,并从您的 __init__.py 加载它与 import importlib_metadata; __version__ = importlib_metadata.version('myproject') .

更新
包裹 importlib_metadata is on PyPI for current Python versions并以 Python 3.8 in the standard library as importlib.metadata 开头.
综上所述,可以重新考虑将版本字符串放在单独的文件中的必要性。由于有一种直接的方法可以从代码中读取版本字符串,version.py 的目的是或 VERSION.txt可能会丢失。
或者,我倾向于制作我的安装脚本 read the version string from the changelog反而。

更新 2020 年 11 月 3 日:
看起来像 attr: 的情况同时有所改善,多亏了这个 change .如果可能,使用 attr:实际上并没有导入代码,因此 ModuleNotFoundError最初在问题中报告不应该再发生了。已发布于 v46.4.0 on 16 May 2020 .

关于python-3.x - 使用 setup.cfg 和通过 attr 访问的版本时出现 ModuleNotFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58202909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com