gpt4 book ai didi

python - 引用 setup.cfg 和 setup.py 中现有的 distutils 选项

转载 作者:太空狗 更新时间:2023-10-29 16:58:01 24 4
gpt4 key购买 nike

我正在使用 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 文件中引用其他变量/选项。语法是$variable,例如:

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

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

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

访问 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() 之前)

也可以获得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'])])

关于python - 引用 setup.cfg 和 setup.py 中现有的 distutils 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30191631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com