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

Nic*_*mer 4 python metadata setup.py

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

superproject/
    ->  __init__.py
    ->  meta.py
setup.py
Run Code Online (Sandbox Code Playgroud)

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

 __author__ = 'John Doe'
 __author_email__ = 'john@doe.com'
 __version__ = '1.2.3'
 # [...]
Run Code Online (Sandbox Code Playgroud)

我想让元信息在 setup.py(简单:只是import superproject.meta)和superprojectas

import superproject
print(superproject.__version__)
Run Code Online (Sandbox Code Playgroud)

我正在为后一个要求而苦苦挣扎。做的时候

from .meta import *
Run Code Online (Sandbox Code Playgroud)

__init__.py,我只能做

print(superproject.meta.__version__)
Run Code Online (Sandbox Code Playgroud)

例如。

请注意,我不能__init__.py直接将元信息放入,因为我必须import superproject放入setup.py,而且 的众多import依赖项superproject当时尚不可用。

任何提示?

Nic*_*mer 5

这是一个已知问题,Python 软件基金会有一篇关于它的整篇文章:Single-sourcing the Project Version

我尝试了所有建议,并最终决定了以下解决方案。

  1. 重命名meta.py,以__about__.pyfrom ... import ...__init__.py
  2. setup.py,exec __about__.py进入字典并使用该信息。

这提供了所有元信息superproject.__about__.__version__以及superproject.__version__. 此外,这使得importsuperproject.

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