【问题标题】:Where to put meta info (__version__ etc) in a Python project?在 Python 项目中将元信息(__version__ 等)放在哪里?
【发布时间】:2017-01-19 13:44:40
【问题描述】:

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

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

__init__.py 文件包含一堆imports 和实际代码,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 中,而superproject 的众多import 依赖项当时还不可用。

有什么提示吗?

【问题讨论】:

  • 针对这个看似棘手的问题的更多选项:packaging.python.org/single_source_version
  • @jwodder 正是我想要的。如果您将此提升为答案,我很乐意将其标记为解决方案。
  • 另见bumpversion
  • @NicoSchlömer:这是一个仅限链接的“答案”。如果我将其提升为答案,我会自己投反对票并标记它。

标签: python metadata setup.py


【解决方案1】:

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

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

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

这会将所有元信息提供为superproject.__about__.__version__superproject.__version__。此外,这使得从superproject 的其他子模块获取import 元信息变得容易。

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

【讨论】:

    【解决方案2】:

    你可以的

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

    【讨论】:

    • 你能再详细一点吗?我还不明白这有什么帮助。
    • 我以为你对 setup.py 感兴趣,所以这个 sn-p 属于那里。您是否需要访问项目其余部分的元数据?
    • 那很好,但不是严格要求。
    【解决方案3】:

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

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

    【讨论】:

    • 那么如何在安装中以superproject.__version__ 提供信息?
    • 读取json文件并设置变量,在setup.py文件中做同样的操作
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2018-07-14
    • 2020-09-02
    • 2015-11-12
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多