如何解决在setup.py
我正在尝试在工作环境中使用竹子管道构建python软件包。
要触发构建,我必须包含一个包含版本号的文件build.info.txt
。
该文件位于存储库的顶层,因此存储库结构如下
build.info.txt
setup.py
MANIFEST.in
README.md
package/
__init__.py
file1.py
file2.py
文件build.info.txt
的版本号
version=x.y.z
我想使用此文件来触发版本号,因此在__init__.py
中,我包括了一个简单的解析器
from pathlib import Path
path = Path(__file__).absolute().parent / "build.info.txt"
__version__ = open(path).readline()[0].split("=")[-1]
这在本地模式下工作正常。但是,当我创建一个程序包并将其推送到我们的pypi服务器上时,在运行时会出现以下错误(即pip install package
有效):
FileNotFoundError: [Errno 2] No such file or directory: '</PATH/TO/ENVIRONMENT>/python3.8/site-packages/build.info.txt'
我更改了setup.py
(我使用setuptools
)的行为,包括:
setup(**other_params,package_data={"": ["../build.info.txt"]},include_package_data=True)
MANIFEST.in
看起来像
include build.info.txt
问题是使用build.info.txt
的{{1}}位于顶层:
pip install
此文件在多个软件包中共享,而我希望将其放入
</PATH/TO/ENVIRONMENT>/python3.8/site-packages/build.info.txt
(然后,我必须在</PATH/TO/ENVIRONMENT>/python3.8/site-packages/<PACKAGE>/build.info.txt
中管理解析器,以便解析正确的文件,但这很简单)
我该如何管理?
谢谢
解决方法
我的建议是使用importlib.metadata
来读取项目的版本。
有人试图对PEP 396中设置__version__
的约定进行形式化和标准化,但从未得到完全接受。如今,这种习惯也消失了,因为importlib.metadata
使得不再需要这种习惯了。因此,您可以完全删除__version__
,希望知道应用程序或库的版本号的第三方代码段可以使用importlib.metadata.version('MyProject')
进行读取。
如果您坚持要在图书馆中使用__version__
,则可以解决此问题,并在__init__.py
中进行以下操作:
__version__ = importlib.metadata.version('MyProject')
除 :
-
如果您坚持使用文件
build-info.txt
,则可以在包中将其符号链接,例如,以package/build-info.txt
(链接到build-info.txt
)和{{ 1}}可以在运行时读取该文件。- 或者按照注释中的建议,将
__init__.py
链接到build-info.txt
,并在package/build_info.py
中将符号链接:__init__.py
(这假定该文件的内容也是有效的Python语法)。
- 或者按照注释中的建议,将
-
您不应使用
from build_info import version as __version__
来读取包数据资源,这是不可靠的,请改为使用importlib.resources
(它将以更简洁的方式执行此操作,并且在需要时请小心提取文件,以防压缩等)。 -
有些工具可以解决所有这些版本号问题,
__file__
浮现在脑海中,也许可以满足您的需求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。