参考setup.cfg和setup.py中现有的distutils选项

时间:2015-05-12 12:58:49

标签: python python-2.7 distutils setup.py

我正在使用带有Distutils的Python 2.7来分发和安装我自己创建的包。我的setup.cfg看起来像这样:

[install]
prefix=/usr/local/MODULENAME
record=installation.txt

我有两个问题:

  1. 在定义其他setup.cfg选项时,是否可以引用setup.cfg中设置的变量(但也可以使用命令行选项)?例如,对于:

    install-scripts=PREFIX/my-scripts
    

    我希望PREFIX是在setup.cfg内部或使用--prefix命令行参数定义的前缀,类似于使用ConfigParser时的变量插值。

  2. 是否可以从setup.py中引用setup.cfg中设置的变量,而无需使用ConfigParser手动解析配置文件?

1 个答案:

答案 0 :(得分:6)

参考setup.cfg

中的变量

您可以参考setup.cfg文件中的其他变量/选项。语法为$variable,例如:

[install]
prefix = /my/prefix
install-scripts = $base/scripts

请注意,我使用了$base,因为此变量受setup.cfgsetup.py install --prefix命令行选项中提供的前缀设置的影响。在这种情况下,除非用户使用命令行指定另一个前缀,否则您的脚本将安装到/my/prefix/scripts

也可以在$prefix内使用setup.cfg,但这似乎不受自定义配置的影响。

在setup.py(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.py(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'])])