我正在使用带有Distutils的Python 2.7来分发和安装我自己创建的包。我的setup.cfg看起来像这样:
[install]
prefix=/usr/local/MODULENAME
record=installation.txt
我有两个问题:
在定义其他setup.cfg选项时,是否可以引用setup.cfg中设置的变量(但也可以使用命令行选项)?例如,对于:
install-scripts=PREFIX/my-scripts
我希望PREFIX
是在setup.cfg内部或使用--prefix命令行参数定义的前缀,类似于使用ConfigParser时的变量插值。
是否可以从setup.py中引用setup.cfg中设置的变量,而无需使用ConfigParser手动解析配置文件?
答案 0 :(得分:6)
您可以参考setup.cfg
文件中的其他变量/选项。语法为$variable
,例如:
[install]
prefix = /my/prefix
install-scripts = $base/scripts
请注意,我使用了$base
,因为此变量受setup.cfg
和setup.py install --prefix
命令行选项中提供的前缀设置的影响。在这种情况下,除非用户使用命令行指定另一个前缀,否则您的脚本将安装到/my/prefix/scripts
。
也可以在$prefix
内使用setup.cfg
,但这似乎不受自定义配置的影响。
setup()
之后)还可以读取setup.py
内所有变量/选项的值。函数setup
返回类Distribution的实例。该类包含按命令(例如,安装)分组的变量的所有值,您可以使用get_option_dict
方法获取它们。例如:
#!/usr/bin/env python
from distutils.core import setup
d = setup(
# Here come your setup arguments
)
print(d.get_option_dict('install'))
将打印:
{'prefix': ('setup.cfg', '/my/prefix'),
'install_scripts': ('setup.cfg', '$base/scripts')}
setup()
之前)在setup()
运行之前,还可以获取类Distribution的实例。为此,我们可以复制setup()
在内部执行的操作,并自己构建该类的实例。然后,关于setup参数值的决定可以基于某些安装选项的值。我们来看一个例子:
from distutils.core import setup
from distutils.dist import Distribution
# Get our own instance of Distribution
dist = Distribution()
dist.parse_config_files()
dist.parse_command_line()
# Get prefix from either config file or command line
prefix = dist.get_option_dict('install')['prefix'][1]
print("Prefix is: " + prefix)
# Use the prefix to decide on the data path for data.txt
setup(data_files=[('/first/path/to/data' if prefix == '/some/prefix'
else '/second/path/to/data',
['data.txt'])])