Документация Python неофициальный перевод

3. Создание файла конфигурации установкиWriting the Setup Configuration File

Часто невозможно заранее описать всё необходимое для сборки дистрибутива: для продолжения может потребоваться получить информацию от пользователя или от его системы. Если эта информация достаточно проста – например, список каталогов для поиска C-заголовков или библиотек, – то предоставление конфигурационного файла setup.cfg для редактирования пользователями является простым и недорогим способом её запросить. Конфигурационные файлы также позволяют задавать значения по умолчанию для любых опций команд, которые установщик затем может переопределить либо в командной строке, либо отредактировав конфигурационный файл.

Конфигурационный файл setup является полезной серединой между сценарием setup – который, в идеале, должен быть непрозрачным для установщиков [1] – и командной строкой сценария setup, которая находится вне вашего контроля и полностью зависит от установщика. Фактически, setup.cfg (и любые другие конфигурационные файлы Distutils, присутствующие в целевой системе) обрабатываются после содержимого сценария setup, но до командной строки. Это даёт несколько полезных следствий:

  • установщики могут переопределить часть того, что вы задали в setup.py, отредактировав setup.cfg
  • вы можете задавать нестандартные значения по умолчанию для опций, которые сложно установить в setup.py
  • установщики могут переопределить что угодно в setup.cfg, используя опции командной строки setup.py

Базовый синтаксис файла конфигурации прост:

[command]
option=value
...

где command – одна из команд Distutils (например, build_py, install), а option – один из параметров, поддерживаемых этой командой. Для каждой команды можно указать любое количество параметров, и в файл можно включить любое количество секций команд. Пустые строки игнорируются, как и комментарии, которые начинаются с символа '#' и продолжаются до конца строки. Длинные значения параметров можно разбивать на несколько строк, просто делая отступы для строк продолжения.

Список опций, поддерживаемых конкретной командой, можно узнать с помощью универсальной опции --help, например,

> python setup.py --help build_ext
[...]
Options for 'build_ext' command:
  --build-lib (-b)     directory for compiled extension modules
  --build-temp (-t)    directory for temporary files (build by-products)
  --inplace (-i)       ignore build-lib and put compiled extensions into the
                       source directory alongside your pure Python modules
  --include-dirs (-I)  list of directories to search for header files
  --define (-D)        C preprocessor macros to define
  --undef (-U)         C preprocessor macros to undefine
  --swig-opts          list of SWIG command line options
[...]

Обратите внимание, что параметр, записываемый в командной строке как --foo-bar, в файлах конфигурации записывается как foo_bar.

Например, предположим, вы хотите, чтобы ваши расширения собирались «на месте» – то есть у вас есть расширение pkg.ext, и вы хотите, чтобы скомпилированный файл расширения (скажем, ext.so в Unix) был помещён в тот же исходный каталог, что и ваши чистые модули Python pkg.mod1 и pkg.mod2. Для этого всегда можно использовать опцию --inplace в командной строке:

python setup.py build_ext --inplace

Но это требует, чтобы вы всегда явно указывали команду build_ext и не забывали передавать --inplace. Более простой способ – «установить и забыть» эту опцию, закодировав её в setup.cfg, конфигурационном файле этого дистрибутива:

[build_ext]
inplace=1

Это повлияет на все сборки данного дистрибутива модуля, независимо от того, указываете ли вы явно build_ext. Если вы включите setup.cfg в свой дистрибутив исходного кода, это также повлияет на сборки конечных пользователей – что, вероятно, плохая идея для этой опции, поскольку постоянная сборка расширений на месте нарушит установку дистрибутива модуля. В некоторых особых случаях, однако, модули собираются прямо в каталоге установки, так что это, возможно, полезная возможность. (Хотя распространять расширения, которые ожидают сборки в своём каталоге установки, почти всегда плохая идея.)

Другой пример: некоторые команды принимают много опций, которые не меняются от запуска к запуску; например, bdist_rpm нужно знать всё необходимое для создания файла «spec» для формирования RPM-дистрибутива. Часть этой информации берётся из сценария setup, а часть генерируется автоматически Distutils (например, список устанавливаемых файлов). Но некоторую информацию необходимо передавать в качестве опций bdist_rpm, что было бы очень утомительно делать в командной строке при каждом запуске. Поэтому вот фрагмент из собственного setup.cfg пакета Distutils:

[bdist_rpm]
release = 1
packager = Greg Ward <gward@python.net>
doc_files = CHANGES.txt
            README.txt
            USAGE.txt
            doc/
            examples/

Обратите внимание: параметр doc_files – это просто строка, разделённая пробельными символами, разбитая на несколько строк для удобочитаемости.

См. также

Синтаксис файлов конфигурации в «Installing Python Modules»
Дополнительная информация о файлах конфигурации доступна в руководстве для системных администраторов.

Сноски

[1]Этот идеал, вероятно, не будет достигнут до тех пор, пока автонастройка не будет полностью поддерживаться в Distutils.