在 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。
我考虑了所有建议并最终决定采用以下解决方案。
- 在
__init__.py
中将 meta.py
重命名为 __about__.py
和 from ... import ...
。
- 在
setup.py
、exec
__about__.py
中放入字典并使用该信息。
这提供了 superproject.__about__.__version__
和 superproject.__version__
的所有元信息。此外,这使得从 superproject
.
的其他子模块 import
元信息变得容易
虽然它给 setup.py
增加了一点复杂性,但它基本上没有影响实际的项目代码。我真的不在乎 setup.py
变得多么复杂,只要它是可远程维护的。
我有一个 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。
我考虑了所有建议并最终决定采用以下解决方案。
- 在
__init__.py
中将meta.py
重命名为__about__.py
和from ... import ...
。 - 在
setup.py
、exec
__about__.py
中放入字典并使用该信息。
这提供了 superproject.__about__.__version__
和 superproject.__version__
的所有元信息。此外,这使得从 superproject
.
import
元信息变得容易
虽然它给 setup.py
增加了一点复杂性,但它基本上没有影响实际的项目代码。我真的不在乎 setup.py
变得多么复杂,只要它是可远程维护的。