Ответ 1
Ссылаясь на переменные Inside setup.cfg
Вы можете ссылаться на другие переменные/параметры внутри вашего файла 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.py(после setup()
)
Также можно прочитать значения всех переменных/параметров внутри вашего setup.py
. Функция setup
возвращает экземпляр класса Distribution. Этот класс содержит все значения переменных, сгруппированных по команде (например, 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()
будет запущен даже. Для этого мы можем реплицировать то, что 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'])])