在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.txtusingpip install位于顶层:

</PATH/TO/ENVIRONMENT>/python3.8/site-packages/build.info.txt

该文件在多个软件包之间共享,而我想在

</PATH/TO/ENVIRONMENT>/python3.8/site-packages/<PACKAGE>/build.info.txt

(然后,我必须管理解析器__init__才能解析正确的文件,但这很简单)

我该如何处理?

谢谢

和运气

我的建议是用来importlib.metadata阅读项目的版本。

有正式和规范设置的惯例,企图__version__PEP 396,但它从来没有达到完全接受。如今,这种习惯也消失了,因为有了,不再需要这种习惯了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),并__init__.py可以在运行时读取该文件。

    • 或者,如注释中所建议,符号链接build-info.txtpackage/build_info.py__init__.py:(from build_info import version as __version__这假定该文件的内容也是有效的Python语法)。
  • 您不应该使用它__file__来读取包数据资源,因为它是不可靠的,importlib.resources而应该使用它(它会以一种更加简洁的方式进行操作,并且在需要压缩包的情况下,请小心提取文件等)。

  • 有些工具可以解决所有此版本号问题,setuptools-scm使您想到并可能满足您的需求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章