繁体   English   中英

在 setup.py 中包含根级别的文件

[英]Include file from root level in 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

问题是使用pip install build.info.txt位于顶层:

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

这个文件在几个包之间共享,而我想把文件放在

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

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

我该如何管理?

谢谢

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

曾尝试将PEP 396中设置__version__的约定正式化和标准化,但从未被完全接受。 现在这种习惯也消失了,因为importlib.metadata ,对它的需求不再那么紧迫了。 因此,您可以完全删除__version__并且想要知道您的应用程序或库的版本号的第 3 方代码可以使用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.txt符号链接到package/build_info.py ,并在__init__.pyfrom build_info import version as __version__ (这假设该文件的内容也是有效的 Python 语法)。
  • 您不应该使用__file__来读取包数据资源,这是不可靠的,请改用importlib.resources (它将以更importlib.resources方式执行此操作,如果需要,请注意提取文件以防包被压缩等) .

  • 有一些工具可以处理所有这些版本号问题, setuptools-scm出现在您的脑海中并且可能适合您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM