python - setup.py 的设计模式以避免重复的元数据

标签 python easy-install

我编写了一些Python脚本,并在顶部嵌入了一些元数据,即:

__version__ = '0.6.1'

有人贡献了一个 setup.py,主要只是从脚本中复制元数据,所以我们有:

setup(
    (...)
    version='0.4.0',

我非常不喜欢这种重复,原因上面应该很明显了。更新元数据是由人们完成的,并不是所有人都知道/记得它需要在两个地方进行更新。错误是必然会发生的。不要忘记这样一个事实,即仅更新一个位置的版本号也更容易。我试图通过从代码本身中删除元数据来消除重复元数据,但是......它实际上是在脚本中引用的(它是一个脚本,毕竟它接受 --version 和 --help )。在脚本中嵌入此类元数据也被认为是“最佳实践”。

我当然可以做一些技巧来让 setup.py 从脚本中读取元数据。事实上,我花的时间可能比写这个问题要少——我更想知道什么是“最佳实践”。在 setup.py 和库/脚本中复制这些信息真的被认为是“最佳实践”吗?是否存在一些现成的食谱样板代码用于从脚本/包本身读取元数据?如果设置方法可以自己完成此操作,那不是很有意义吗?

最佳答案

您可以导入包并从那里获取元数据。

这确实假设您的文件结构如下所示:

root/
    code.py
    setup.py

或者

root/
    code/
        __init__.py
    setup.py

并且 code.py__init__.py 具有元数据。

import os
import sys

__dir__ = path.abspath(path.dirname(__file__))  # The directory of setup.py, root/
sys.path.insert(0, __dir__)  # Will search __dir__ first for the package

try:
    import code
finally:
    sys.path.pop(0)

setup_args = dict(
    name='code',
    # ...
)

for metadata in ('version', 'author', 'email', 'license'):
    if hasattr(code, '__{}__'.format(metadata)):
        setup_args[metadata] = getattr(code, '__{}__'.format(metadata))

setup(**setup_args)

关于python - setup.py 的设计模式以避免重复的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28213267/

相关文章:

python - 有趣的 Django `NoReverseMatch error`

python - 在 Windows 7 64 位中设置 pip

python - 为什么使用 pip 而不是 easy_install?

Python Anaconda 3.6plotly模块使用图

python - 模板化构造函数游标和模板化成员游标在 libclang 中具有 FUNCTION_TEMPLATE 种类

python - 使用 pandas 的 Silhouette_score 的正确数据格式

Python time.gmtime() 返回比系统时间提前 5 小时的时间

python - 卸载 pip 和 easy_install

Python 安装卸载 easy_install

python - setuptools 与 virtualenv 的版本差异