Написание файла конфигурации установки
Примечание
Данный документ сохраняется только до тех пор, пока документация setuptools по адресу https://setuptools.readthedocs.io/en/latest/setuptools.html не охватывает всю необходимую информацию, в настоящее время включённую здесь.
Зачастую невозможно записать всё необходимое для построения дистрибутива заранее: может потребоваться получить какую-то информацию от пользователя или с системы пользователя, чтобы продолжить процесс. Если эта информация достаточно простая — например, список директорий для поиска файлов заголовков C или библиотек — то предоставление файла конфигурации, setup.cfg, для редактирования пользователем является простым и эффективным способом запросить её. Файлы конфигурации также позволяют задавать значения по умолчанию для параметров команд, которые установщик затем может переопределить либо в командной строке, либо отредактировав файл конфигурации.
Файл конфигурации установки является полезным промежуточным звеном между скриптом установки — который, в идеале, должен быть невидимым для установщиков 1 — и командной строкой для скрипта установки, которая находится вне вашего контроля и полностью зависит от установщика. Фактически, setup.cfg (и любые другие файлы конфигурации Distutils, присутствующие на целевой системе) обрабатываются после содержимого скрипта установки, но до командной строки. Это имеет несколько полезных последствий:
- установщики могут переопределить часть того, что вы указали в
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 должен знать всё необходимое для генерации файла «спецификации» для создания дистрибутива RPM. Часть этой информации поступает из скрипта установки, а часть автоматически генерируется Distutils (например, список установленных файлов). Но часть её должна быть указана как параметры для bdist_rpm, что было бы очень утомительно делать в командной строке при каждом запуске. Вот фрагмент из собственного файла конфигурации Distutils setup.cfg.
[bdist_rpm]
release = 1
packager = Greg Ward <gward@python.net>
doc_files = CHANGES.txt
README.txt
USAGE.txt
doc/
examples/
Обратите внимание, что параметр doc_files представляет собой просто строку, разделённую пробелами, разделяемую на несколько строк для удобочитаемости.
См. также
- Синтаксис файлов конфигурации в разделе «Установка модулей Python»
-
Дополнительная информация о файлах конфигурации доступна в руководстве для системных администраторов.
Примечания
-
1 -
Этот идеал, вероятно, не будет достигнут до тех пор, пока автоматическая настройка не будет полностью поддерживаться Distutils.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/distutils/configfile.html