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

Referring to existing distutils options inside setup.cfg and setup.py

我正在使用 Python 2.7 和 Distutils 来分发和安装我自己创建的包。我的 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 手动解析配置文件?

引用内部变量 setup.cfg

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

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

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

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

访问 setup.py 内的变量值(在 setup() 之后)

也可以读取 setup.py 中所有 variables/options 的值。函数setupreturnsclassDistribution的一个实例。 class 包含所有按命令分组的变量值(例如 install),您可以使用 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()甚至运行之前获得classDistribution的一个实例。为此,我们可以复制 setup() 在内部所做的事情,并自己构建一个 class 的实例。然后,关于安装参数值的决定可以基于一些安装选项的值。让我们看一个例子:

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'])])