首页 > 解决方案 > 如何在 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应用程序代码之间共享这些值的好方法。

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

在这种情况下,最佳做法是什么?

标签: setuptoolssetup.pypython-packagingpython-importlib

解决方案


在代码(运行时代码,不是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


推荐阅读