我编写了一些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)