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

如何在 setup.py 和应用程序代码之间共享包元数据?

如何解决如何在 setup.py 和应用程序代码之间共享包元数据?

python 项目的典型目录树可能如下所示。

.
├── src
│   ├── __init__.py
│   ├── main.py
│   ├── module1
│   │   ├── __init__.py
│   │   └── foo.py
│   └── module2
│       ├── __init__.py
│       └── bar.py
├── setup.py
└── venv
    └── ...

setup.py 包含包元数据,例如 nameversiondescription 等。

在某些情况下,在应用程序代码中包含这些值很有用。例如使用 FastAPI,you can provide them to the constructor of the API object so that they are shown in the auto-generated docs。或点击,you can add a version option

为避免重复,这些值应该只定义一次并在两个地方使用。但是,我一直没有找到在 setup.py 和应用程序代码之间共享这些值的好方法

从另一个导入一个似乎不起作用,因为它们不是同一包结构的一部分。

这种情况下的最佳实践是什么?

解决方法

在代码(运行时代码,而不是setup.py)中使用importlib.metadata(或其back-port 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。