setuptools - 如何在 setup.py 和应用程序代码之间共享包元数据?
问题描述
python 项目的典型目录树可能如下所示。
.
├── src
│ ├── __init__.py
│ ├── main.py
│ ├── module1
│ │ ├── __init__.py
│ │ └── foo.py
│ └── module2
│ ├── __init__.py
│ └── bar.py
├── setup.py
└── venv
└── ...
setup.py
包含包元数据,如名称、版本、描述等。
在某些情况下,在应用程序代码中包含这些值很有用。例如,使用 FastAPI,您可以将它们提供给 API 对象的构造函数,以便它们显示在自动生成的文档中。或者使用 Click,您可以添加版本选项。
为避免重复,这些值应仅定义一次并在两个地方使用。但是,我从未找到一种在setup.py
应用程序代码之间共享这些值的好方法。
从另一个导入一个似乎不起作用,因为它们不是同一个包结构的一部分。
在这种情况下,最佳做法是什么?
解决方案
在代码(运行时代码,不是setup.py
)中使用importlib.metadata
(或其后向端口 importlib-metadata
)。您唯一需要复制的是项目的名称(“分发包”的名称)。
例如,一个名为的项目MyLibrary
:
import importlib.metadata
PROJECT_NAME = 'MyLibrary'
_DISTRIBUTION_METADATA = importlib.metadata.metadata(PROJECT_NAME)
SUMMARY = _DISTRIBUTION_METADATA['Summary']
VERSION = _DISTRIBUTION_METADATA['Version']
旁白:如果无法硬编码分发包的名称,有办法找到它: https ://stackoverflow.com/a/63849982
推荐阅读
- python-3.x - 素数,埃拉斯托色尼筛法,Python
- swift - 带有 StackView 的 ScrollView 以编程方式不滚动
- discord.js - 创建一个帮助命令,为每个其他命令发送不同的消息
- javascript - 获取计算机Node.JS的ip地址
- c# - 错误:参数字典包含不可为空类型的参数“id”的空条目
- javascript - While 循环永远进行
- angular - 无法在 Angular 5 上设置 HTTP 授权标头?
- r - glm函数使RStudio崩溃
- c - 使用 C 将 'Sat, 2018 年 11 月 24 日 00:34:57 GMT' 转换为毫秒
- r - 不同的结果应用 geom_tile 而不是 heatmap