Ссылаясь на существующие опции distutils внутри setup.cfg и setup.py

Я использую Python 2.7 с Distutils для распространения и установки моего собственного созданного пакета. Моя 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.cfg, из моей setup.py, без ручного анализа файла конфигурации с помощью ConfigParser?

Ответы

Ответ 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'])])