微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在setup.py

如何解决在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 举报,一经查实,本站将立刻删除。