如何在 setup.py 和应用程序代码之间共享包元数据?
How to share package metadata between setup.py and application code?
python 项目的典型目录树可能如下所示。
.
├── src
│ ├── __init__.py
│ ├── main.py
│ ├── module1
│ │ ├── __init__.py
│ │ └── foo.py
│ └── module2
│ ├── __init__.py
│ └── bar.py
├── setup.py
└── venv
└── ...
setup.py
包含包元数据,例如 name、version、description、等等
在某些情况下,将这些值包含在应用程序代码中很有用。例如对于 FastAPI,you can provide them to the constructor of the API object so that they are shown in the auto-generated docs. Or with Click, you can add a version option.
为避免重复,这些值应仅定义一次并在两个地方使用。但是,我从来没有找到在 setup.py
和应用程序代码之间共享这些值的好方法。
从另一个导入一个似乎不起作用,因为它们不是同一包结构的一部分。
这种情况下的最佳做法是什么?
代码中(运行-time代码,不是setup.py
)使用importlib.metadata
(or its 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']
旁白:如果无法硬编码分发包的名字,有办法找到:
python 项目的典型目录树可能如下所示。
.
├── src
│ ├── __init__.py
│ ├── main.py
│ ├── module1
│ │ ├── __init__.py
│ │ └── foo.py
│ └── module2
│ ├── __init__.py
│ └── bar.py
├── setup.py
└── venv
└── ...
setup.py
包含包元数据,例如 name、version、description、等等
在某些情况下,将这些值包含在应用程序代码中很有用。例如对于 FastAPI,you can provide them to the constructor of the API object so that they are shown in the auto-generated docs. Or with Click, you can add a version option.
为避免重复,这些值应仅定义一次并在两个地方使用。但是,我从来没有找到在 setup.py
和应用程序代码之间共享这些值的好方法。
从另一个导入一个似乎不起作用,因为它们不是同一包结构的一部分。
这种情况下的最佳做法是什么?
代码中(运行-time代码,不是setup.py
)使用importlib.metadata
(or its 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']
旁白:如果无法硬编码分发包的名字,有办法找到: