在 Python 项目中将元信息(__version__ 等)放在哪里?

Where to put meta info (__version__ etc) in a Python project?

我有一个 Python2/3 目录结构的小项目

superproject/
    ->  __init__.py
    ->  meta.py
setup.py

__init__.py 文件包含一堆 import 和实际代码,meta 有

 __author__ = 'John Doe'
 __author_email__ = 'john@doe.com'
 __version__ = '1.2.3'
 # [...]

我想让元信息在 setup.py 中可用(简单:仅 import superproject.meta),在 superproject 中可用

import superproject
print(superproject.__version__)

我正在努力满足后一个要求。当做

from .meta import *

__init__.py,我只能做到

print(superproject.meta.__version__)

例如。

请注意,我不能将元信息直接放在 __init__.py 中,因为我必须 import superproject 放在 setup.py 中,并且 import 的众多依赖项 superproject 那时还没有。

有什么提示吗?

你可以做到

import importlib

meta = importlib.import_module ("mod.meta")
print (meta.__author__)

您可以从项目根目录中的文件中读取它。将此文件包含在 setup.py docs 中的 data_files 中。 JSON 可能是最容易使用的格式。

superproject/
    ->  __init__.py
setup.py
meta.json

这是一个已知问题,Python Software Foundation 有一整篇关于它的文章:Single-sourcing the Project Version

我考虑了所有建议并最终决定采用以下解决方案。

  1. __init__.py 中将 meta.py 重命名为 __about__.pyfrom ... import ...
  2. setup.pyexec __about__.py 中放入字典并使用该信息。

这提供了 superproject.__about__.__version__superproject.__version__ 的所有元信息。此外,这使得从 superproject.

的其他子模块 import 元信息变得容易

虽然它给 setup.py 增加了一点复杂性,但它基本上没有影响实际的项目代码。我真的不在乎 setup.py 变得多么复杂,只要它是可远程维护的。