我有一个带有目录结构的小型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
的{{1}}个依赖项然后还没有。
任何提示?
答案 0 :(得分:2)
这是一个已知问题,Python软件基金会有一篇关于它的完整文章:Single-sourcing the Project Version。
我玩了所有的建议,最终决定采用以下解决方案。
meta.py
中将__about__.py
重命名为from ... import ...
和__init__.py
。setup.py
,exec
__about__.py
放入字典并使用该信息。这会将所有元信息提供为superproject.__about__.__version__
以及superproject.__version__
。此外,这样可以轻松地从import
的其他子模块中获取superproject
元信息。
虽然它为setup.py
增加了一点复杂性,但它使实际项目代码基本保持不变。我并不关心setup.py
复杂程度,只要它可以远程维护。
答案 1 :(得分:0)
你可以做到
import importlib
meta = importlib.import_module ("mod.meta")
print (meta.__author__)
答案 2 :(得分:0)
您可以从项目根目录中的文件中读取此内容。在data_files
docs的setup.py
中加入此文件。 JSON可能是最容易使用的格式。
,如
superproject/
-> __init__.py
setup.py
meta.json