Установка модулей Python (версия Legacy)¶
- Автор
Грег Уорд
Примечание
Весь пакет distutils
был устаревшим и будет удален в Python 3.12. Эта документация сохраняется только в качестве справочного материала и будет удалена вместе с пакетом. Для получения дополнительной информации см. запись What’s New.
См.также
- Установка модулей Python
Актуальная документация по установке модуля. Для регулярного использования Python вам почти наверняка понадобится этот документ, а не этот.
Примечание
Этот документ сохраняется исключительно до тех пор, пока документация setuptools
на сайте https://setuptools.readthedocs.io/en/latest/setuptools.html не будет независимо охватывать всю соответствующую информацию, включенную сюда в настоящее время.
Примечание
В этом руководстве рассматриваются только основные инструменты для создания и распространения расширений, которые поставляются в составе данной версии Python. Сторонние инструменты предлагают более простые в использовании и более безопасные альтернативы. За дополнительной информацией обращайтесь к quick recommendations section в руководстве пользователя по упаковке Python.
Введение¶
В Python 2.0 API distutils
был впервые добавлен в стандартную библиотеку. Это обеспечило разработчиков дистрибутивов Linux стандартным способом преобразования проектов Python в пакеты дистрибутивов Linux, а системных администраторов - стандартным способом их установки непосредственно на целевые системы.
За многие годы, прошедшие после выхода Python 2.0, тесная связь системы сборки и установщика пакетов с циклом выпуска среды выполнения языка оказалась проблематичной, и теперь рекомендуется, чтобы проекты использовали установщик пакетов pip
и систему сборки setuptools
, а не напрямую distutils
.
Более подробную информацию смотрите в Установка модулей Python и Распространение модулей Python.
Эта устаревшая документация сохраняется только до тех пор, пока мы не будем уверены, что документация setuptools
охватывает все необходимое.
Дистрибутивы с исходным кодом на основе Distutils¶
Если вы скачаете дистрибутив с исходным кодом модуля, вы можете довольно быстро определить, был ли он упакован и распространен стандартным способом, т.е. с помощью Distutils. Во-первых, название дистрибутива и номер версии будут указаны в названии загруженного архива, например, foo-1.0.tar.gz
или widget-0.9.7.zip
. Затем архив распакуется в каталог с аналогичным названием: foo-1.0
или widget-0.9.7
. Кроме того, дистрибутив будет содержать установочный скрипт setup.py
и файл с именем README.txt
или, возможно, просто README
, который должен объяснить, что сборка и установка дистрибутива модуля - это простое дело выполнения одной команды из терминала:
python setup.py install
Для Windows эту команду следует выполнить из окна командной строки (
):setup.py install
Если все это так, то вы уже знаете, как собрать и установить модули, которые вы только что загрузили: Выполните приведенную выше команду. Если вам не нужно устанавливать модули нестандартным способом или настраивать процесс сборки, вам не нужно это руководство. Вернее, приведенная выше команда - это все, что вам нужно получить от этого руководства.
Стандартная сборка и установка¶
Как описано в разделе Дистрибутивы с исходным кодом на основе Distutils, сборка и установка дистрибутива модуля с помощью Distutils обычно сводится к выполнению одной простой команды из терминала:
python setup.py install
Варианты платформ¶
Вы всегда должны запускать команду setup из корневого каталога дистрибутива, т.е. из подкаталога верхнего уровня, в который распаковывается исходный дистрибутив модуля. Например, если вы только что загрузили исходный дистрибутив модуля foo-1.0.tar.gz
на Unix-систему, обычным действием будет следующее:
gunzip -c foo-1.0.tar.gz | tar xf - # unpacks into directory foo-1.0
cd foo-1.0
python setup.py install
В Windows вы, вероятно, загрузите foo-1.0.zip
. Если вы скачали архивный файл по адресу C:\Temp
, то он распакуется в C:\Temp\foo-1.0
; для распаковки архива можно использовать либо архивный манипулятор с графическим интерфейсом пользователя (например, WinZip), либо инструмент командной строки (например, unzip или pkunzip). Затем откройте окно командной строки и выполните:
cd c:\Temp\foo-1.0
python setup.py install
Разделение работы на части¶
Выполнение команды setup.py install
приводит к сборке и установке всех модулей за один запуск. Если вы предпочитаете работать постепенно - особенно полезно, если вы хотите настроить процесс сборки, или если что-то идет не так - вы можете использовать сценарий установки для выполнения одного действия за раз. Это особенно полезно, когда сборка и установка будут выполняться разными пользователями - например, вы можете захотеть собрать дистрибутив модуля и передать его системному администратору для установки (или сделать это самостоятельно, с привилегиями суперпользователя).
Например, вы можете собрать все за один шаг, а затем установить все за второй шаг, вызвав сценарий установки дважды:
python setup.py build
python setup.py install
Если вы сделаете это, вы заметите, что выполнение команды install сначала запускает команду build, которая - в данном случае - быстро замечает, что ей нечего делать, поскольку все в каталоге build
обновлено.
Возможно, вам не часто понадобится эта способность разбивать вещи на части, если все, что вы делаете, это устанавливаете модули, скачанные из сети, но она очень удобна для более сложных задач. Если вы займетесь распространением собственных модулей и расширений Python, вы будете использовать множество отдельных команд Distutils самостоятельно.
Как происходит строительство¶
Как подразумевалось выше, команда build отвечает за помещение файлов для установки в каталог сборки. По умолчанию он находится build
под корнем дистрибутива; если вы слишком озабочены скоростью или хотите сохранить дерево исходных текстов в первозданном виде, вы можете изменить каталог сборки с помощью опции --build-base
. Например:
python setup.py build --build-base=/path/to/pybuild/foo-1.0
(Или вы можете сделать это постоянно с помощью директивы в системном или личном конфигурационном файле Distutils; см. раздел Конфигурационные файлы Distutils). Обычно в этом нет необходимости.
По умолчанию дерево сборки имеет следующий вид:
--- build/ --- lib/
or
--- build/ --- lib.<plat>/
temp.<plat>/
где <plat>
расширяется до краткого описания текущей платформы ОС/аппаратного обеспечения и версии Python. Первая форма, содержащая только каталог lib
, используется для «чистых дистрибутивов модулей» - то есть, дистрибутивов модулей, включающих только чистые модули Python. Если дистрибутив модуля содержит какие-либо расширения (модули, написанные на C/C++), то используется вторая форма, с двумя каталогами <plat>
. В этом случае каталог temp.plat
содержит временные файлы, созданные в процессе компиляции/линковки, которые на самом деле не устанавливаются. В любом случае, каталог lib
(или lib.plat
) содержит все модули Python (чистый Python и расширения), которые будут установлены.
В будущем будут добавлены дополнительные каталоги для работы со скриптами Python, документацией, двоичными исполняемыми файлами и всем остальным, что необходимо для работы по установке модулей и приложений Python.
Как происходит установка¶
После выполнения команды build (независимо от того, запустили ли вы ее явно или команда install сделала это за вас), работа команды install относительно проста: все, что она должна сделать, это скопировать все, что находится в каталоге build/lib
(или build/lib.plat
) в выбранный вами каталог установки.
Если вы не выбрали каталог установки - то есть, если вы просто запустили setup.py install
— то команда install устанавливает в стандартное место для модулей Python сторонних разработчиков. Это расположение зависит от платформы и от того, как вы собрали/установили сам Python. На Unix (и macOS, которая также основана на Unix) оно также зависит от того, является ли устанавливаемый дистрибутив модулей чистым Python или содержит расширения («нечистый»):
Платформа |
Стандартное место установки |
Значение по умолчанию |
Примечания |
---|---|---|---|
Unix (чистый) |
|
|
(1) |
Unix (нечистый) |
|
|
(1) |
Windows |
|
|
(2) |
Примечания:
Большинство дистрибутивов Linux включают Python в качестве стандартной части системы, поэтому
prefix
иexec-prefix
обычно оба/usr
в Linux. Если вы сами собираете Python в Linux (или любой другой Unix-подобной системе), то по умолчаниюprefix
иexec-prefix
будут/usr/local
.Каталог установки по умолчанию в Windows был
C:\Program Files\Python
в Python 1.6a1, 1.5.2 и более ранних версиях.
prefix
и exec-prefix
означают каталоги, в которые устанавливается Python и где он находит свои библиотеки во время выполнения. Они всегда одинаковы в Windows, и очень часто одинаковы в Unix и macOS. Вы можете узнать, что ваша установка Python использует для prefix
и exec-prefix
, запустив Python в интерактивном режиме и набрав несколько простых команд. В Unix просто введите python
в приглашении оболочки. В Windows выберите . После запуска интерпретатора вы набираете код Python в подсказке. Например, на моей системе Linux я набираю три оператора Python, показанные ниже, и получаю вывод, как показано на рисунке, чтобы узнать мои prefix
и exec-prefix
:
Python 2.4 (#26, Aug 7 2004, 17:19:02)
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.prefix
'/usr'
>>> sys.exec_prefix
'/usr'
В этом документе используется еще несколько условных обозначений: X.Y
обозначает версию Python, например 3.2
; abiflags
будет заменено значением sys.abiflags
или пустой строкой для платформ, не определяющих флаги ABI; distname
будет заменено именем устанавливаемого дистрибутива модуля. Точки и капитализация важны в путях; например, значение, использующее python3.2
на UNIX, обычно будет использовать Python32
на Windows.
Если вы не хотите устанавливать модули в стандартное место, или у вас нет прав на запись, то вам нужно прочитать об альтернативных установках в разделе Альтернативная установка. Если вы хотите сильнее настроить каталоги установки, смотрите раздел Индивидуальная установка о пользовательских установках.
Альтернативная установка¶
Часто бывает необходимо или желательно установить модули в место, отличное от стандартного расположения сторонних модулей Python. Например, в системе Unix у вас может не быть разрешения на запись в стандартный каталог модулей сторонних разработчиков. Или вы можете захотеть опробовать модуль, прежде чем сделать его стандартной частью вашей локальной установки Python. Это особенно актуально при обновлении уже имеющегося дистрибутива: вы хотите убедиться, что существующая база скриптов будет работать с новой версией, прежде чем приступать к обновлению.
Команда Distutils install предназначена для простой и безболезненной установки дистрибутивов модулей в другое место. Основная идея заключается в том, что вы указываете базовый каталог для установки, а команда install выбирает набор каталогов (называемый схемой установки) в этом базовом каталоге, в которые нужно установить файлы. Детали отличаются на разных платформах, поэтому читайте те разделы, которые относятся к вам.
Обратите внимание, что различные альтернативные схемы установки являются взаимоисключающими: вы можете передать --user
, или --home
, или --prefix
и --exec-prefix
, или --install-base
и --install-platbase
, но вы не можете смешивать из этих групп.
Альтернативная установка: схема пользователя¶
Эта схема разработана как наиболее удобное решение для пользователей, которые не имеют права записи в глобальный каталог site-packages или не хотят устанавливать в него. Она включается с помощью простой опции:
python setup.py install --user
Файлы будут установлены в подкаталоги каталога site.USER_BASE
(далее записывается как userbase
). Эта схема устанавливает модули чистого Python и модули расширения в одно и то же место (также известное как site.USER_SITE
). Вот значения для UNIX, включая macOS:
Тип файла |
Каталог установки |
---|---|
модули |
|
скрипты |
|
данные |
|
Заголовки C |
|
А вот значения, используемые в Windows:
Тип файла |
Каталог установки |
---|---|
модули |
|
скрипты |
|
данные |
|
Заголовки C |
|
Преимущество использования этой схемы по сравнению с другими, описанными ниже, заключается в том, что каталог site-packages пользователя при нормальных условиях всегда включен в sys.path
(см. site
для получения дополнительной информации), что означает отсутствие дополнительных действий, которые необходимо выполнить после запуска сценария setup.py
для завершения установки.
Команда build_ext также имеет опцию --user
для добавления userbase/include
в путь поиска заголовочных файлов компилятора и userbase/lib
в путь поиска библиотек компилятора, а также в путь поиска разделяемых библиотек Си во время выполнения (rpath).
Альтернативная установка: схема дома¶
Идея «домашней схемы» заключается в том, что вы создаете и поддерживаете личный тайник модулей Python. Название этой схемы происходит от идеи «домашнего» каталога в Unix, поскольку для пользователей Unix не редкость, когда их домашний каталог имеет расположение, похожее на /usr/
или /usr/local/
. Эта схема может быть использована любым пользователем, независимо от операционной системы, для которой он устанавливает программу.
Установить новый дистрибутив модуля так же просто, как
python setup.py install --home=<dir>
где для опции --home
вы можете указать любой каталог, который вам нравится. На Unix ленивые машинистки могут просто набрать тильду (~
); команда install расширит ее до вашего домашнего каталога:
python setup.py install --home=~
Чтобы заставить Python найти дистрибутивы, установленные по этой схеме, вам, возможно, придется modify Python’s search path или отредактировать sitecustomize
(см. site
), чтобы вызвать site.addsitedir()
или отредактировать sys.path
.
Опция --home
определяет базовый каталог установки. Файлы устанавливаются в следующие каталоги под базой установки следующим образом:
Тип файла |
Каталог установки |
---|---|
модули |
|
скрипты |
|
данные |
|
Заголовки C |
|
(Мысленно замените слеши на обратные слеши, если вы работаете в Windows).
Альтернативная установка: Unix (префиксная схема)¶
Префиксная схема» полезна, когда вы хотите использовать одну установку Python для выполнения сборки/установки (т.е. для запуска сценария установки), но установить модули в каталог сторонних модулей другой установки Python (или чего-то, что похоже на другую установку Python). Если это звучит несколько необычно, то так оно и есть - именно поэтому схемы user и home идут впереди. Однако есть как минимум два известных случая, когда префиксная схема будет полезна.
Во-первых, учтите, что многие дистрибутивы Linux помещают Python в /usr
, а не в более традиционный /usr/local
. Это вполне уместно, поскольку в таких случаях Python является частью «системы», а не локальным дополнением. Однако, если вы устанавливаете модули Python из исходного кода, вы, вероятно, захотите, чтобы они находились в /usr/local/lib/python2.X
, а не в /usr/lib/python2.X
. Это можно сделать с помощью
/usr/bin/python setup.py install --prefix=/usr/local
Другой возможностью является сетевая файловая система, в которой имя, используемое для записи в удаленный каталог, отличается от имени, используемого для чтения: например, интерпретатор Python, доступный как /usr/local/bin/python
, может искать модули в /usr/local/lib/python2.X
, но эти модули должны быть установлены, скажем, в /mnt/@server/export/lib/python2.X
. Это можно сделать с помощью
/usr/local/bin/python setup.py install --prefix=/mnt/@server/export
В любом случае, опция --prefix
определяет базу установки, а опция --exec-prefix
определяет платформо-специфическую базу установки, которая используется для специфических для платформы файлов. (В настоящее время это означает только дистрибутивы нечистых модулей, но может быть расширено до библиотек C, двоичных исполняемых файлов и т.д.) Если параметр --exec-prefix
не указан, то по умолчанию используется --prefix
. Файлы устанавливаются следующим образом:
Тип файла |
Каталог установки |
---|---|
Модули Python |
|
модули расширения |
|
скрипты |
|
данные |
|
Заголовки C |
|
Нет требования, чтобы --prefix
или --exec-prefix
действительно указывали на альтернативную установку Python; если перечисленные выше каталоги еще не существуют, они создаются во время установки.
Кстати, реальная причина важности префиксной схемы заключается в том, что стандартная установка Unix использует префиксную схему, но с --prefix
и --exec-prefix
, поставляемыми самим Python как sys.prefix
и sys.exec_prefix
. Таким образом, вы можете думать, что никогда не будете использовать префиксную схему, но каждый раз, когда вы запускаете python setup.py install
без каких-либо других опций, вы используете ее.
Обратите внимание, что установка расширений в альтернативную установку Python не влияет на способ сборки расширений: в частности, заголовочные файлы Python (Python.h
и друзья), установленные с интерпретатором Python, используемым для запуска сценария установки, будут использоваться при компиляции расширений. Вы должны убедиться, что интерпретатор, используемый для запуска расширений, установленных таким образом, совместим с интерпретатором, используемым для их сборки. Лучший способ сделать это - убедиться, что оба интерпретатора имеют одну и ту же версию Python (возможно, разные сборки, а возможно, копии одной и той же сборки). (Конечно, если ваши --prefix
и --exec-prefix
даже не указывают на альтернативную установку Python, это несущественно).
Альтернативная установка: Windows (префиксная схема)¶
В Windows нет понятия домашнего каталога пользователя, и поскольку стандартная установка Python под Windows проще, чем под Unix, опция --prefix
традиционно используется для установки дополнительных пакетов в отдельные места под Windows.
python setup.py install --prefix="\Temp\Python"
для установки модулей в каталог \Temp\Python
на текущем диске.
База установки определяется опцией --prefix
; опция --exec-prefix
не поддерживается под Windows, что означает, что модули чистого Python и модули расширения устанавливаются в одно и то же место. Файлы устанавливаются следующим образом:
Тип файла |
Каталог установки |
---|---|
модули |
|
скрипты |
|
данные |
|
Заголовки C |
|
Индивидуальная установка¶
Иногда альтернативные схемы установки, описанные в разделе Альтернативная установка, просто не дают того, что вам нужно. Вы можете захотеть изменить только один или два каталога, сохранив все в одном базовом каталоге, или полностью изменить схему установки. В любом случае, вы создаете настраиваемую схему установки.
Чтобы создать пользовательскую схему установки, начните с одной из альтернативных схем и переопределите некоторые каталоги установки, используемые для различных типов файлов, используя эти опции:
Тип файла |
Опция отмены |
---|---|
Модули Python |
|
модули расширения |
|
все модули |
|
скрипты |
|
данные |
|
Заголовки C |
|
Эти параметры переопределения могут быть относительными, абсолютными или явно определенными в терминах одного из базовых каталогов установки. (Существует два базовых каталога установки, и обычно они одинаковы - они различаются только тогда, когда вы используете «префиксную схему» Unix и предоставляете разные опции --prefix
и --exec-prefix
; использование --install-lib
отменяет значения, вычисленные или заданные для --install-purelib
и --install-platlib
, и рекомендуется для схем, которые не делают разницы между Python и модулями расширения).
Например, допустим, вы устанавливаете дистрибутив модуля в свой домашний каталог под Unix - но вы хотите, чтобы скрипты находились в каталоге ~/scripts
, а не ~/bin
. Как и следовало ожидать, вы можете переопределить этот каталог с помощью опции --install-scripts
; в этом случае имеет смысл указать относительный путь, который будет интерпретироваться относительно базового каталога установки (вашего домашнего каталога, в данном случае):
python setup.py install --home=~ --install-scripts=scripts
Другой пример Unix: предположим, что ваша установка Python была собрана и установлена с префиксом /usr/local/python
, поэтому при стандартной установке скрипты будут находиться в каталоге /usr/local/python/bin
. Если вы хотите, чтобы они находились в /usr/local/bin
вместо этого, вы должны указать этот абсолютный каталог для опции --install-scripts
:
python setup.py install --install-scripts=/usr/local/bin
(Это выполняет установку с использованием «префиксной схемы», где префикс - это то, с чем был установлен ваш интерпретатор Python —- /usr/local/python
в данном случае).
Если вы используете Python под Windows, вы можете захотеть, чтобы сторонние модули жили в подкаталоге prefix
, а не прямо в самом prefix
. Это почти так же просто, как настроить каталог установки скриптов - вам просто нужно помнить, что есть два типа модулей, о которых нужно беспокоиться, Python и модули расширений, которые могут удобно управляться одной опцией:
python setup.py install --install-lib=Site
Указанный каталог установки является относительным по отношению к prefix
. Конечно, вы также должны убедиться, что этот каталог находится в пути поиска модулей Python, например, поместив файл .pth
в каталог сайта (см. раздел site
). Смотрите раздел Изменение пути поиска в Python, чтобы узнать, как изменить путь поиска Python.
Если вы хотите определить всю схему установки, вам просто нужно указать все параметры каталога установки. Рекомендуемый способ сделать это - указать относительные пути; например, если вы хотите хранить все файлы, связанные с модулями Python, в домашнем каталоге под python
, и хотите иметь отдельный каталог для каждой платформы, с которой вы используете свой домашний каталог, вы можете определить следующую схему установки:
python setup.py install --home=~ \
--install-purelib=python/lib \
--install-platlib=python/lib.$PLAT \
--install-scripts=python/scripts
--install-data=python/data
или, эквивалентно,
python setup.py install --home=~/python \
--install-purelib=lib \
--install-platlib='lib.$PLAT' \
--install-scripts=scripts
--install-data=data
$PLAT
не является (обязательно) переменной окружения - она будет расширена Distutils при разборе опций командной строки, так же как и при разборе конфигурационного файла (файлов).
Очевидно, что указывать всю схему установки каждый раз, когда вы устанавливаете новый дистрибутив модуля, было бы очень утомительно. Поэтому вы можете поместить эти опции в ваш конфигурационный файл Distutils (см. раздел Конфигурационные файлы Distutils):
[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-data=python/data
или, эквивалентно,
[install]
install-base=$HOME/python
install-purelib=lib
install-platlib=lib.$PLAT
install-scripts=scripts
install-data=data
Обратите внимание, что эти два параметра не эквивалентны, если при запуске сценария установки вы указываете другой базовый каталог установки. Например,
python setup.py install --install-base=/tmp
установит чистые модули на /tmp/python/lib
в первом случае, и на /tmp/lib
во втором случае. (Для второго случая вы, вероятно, захотите поставить установочную базу /tmp/python
).
Вы, вероятно, заметили использование $HOME
и $PLAT
во входном файле примера конфигурации. Это конфигурационные переменные Distutils, которые имеют большое сходство с переменными окружения. На самом деле, вы можете использовать переменные окружения в конфигурационных файлах на платформах, где есть такое понятие, но Distutils дополнительно определяет несколько дополнительных переменных, которых может не быть в вашем окружении, например $PLAT
. (И, конечно, на системах, где нет переменных окружения, таких как Mac OS 9, конфигурационные переменные, поставляемые Distutils, являются единственными, которые вы можете использовать). Подробнее см. раздел Конфигурационные файлы Distutils.
Примечание
Когда virtual environment активирован, любые опции, изменяющие путь установки, будут игнорироваться из всех конфигурационных файлов distutils, чтобы предотвратить случайную установку проектов за пределами виртуальной среды.
Изменение пути поиска в Python¶
Когда интерпретатор Python выполняет оператор import
, он ищет как код Python, так и модули расширения по пути поиска. Значение пути по умолчанию задается в двоичном файле Python при сборке интерпретатора. Вы можете определить путь, импортировав модуль sys
и распечатав значение sys.path
.
$ python
Python 2.2 (#11, Oct 3 2002, 13:31:27)
[GCC 2.96 20000731 (Red Hat Linux 7.3 2.96-112)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/local/lib/python2.3', '/usr/local/lib/python2.3/plat-linux2',
'/usr/local/lib/python2.3/lib-tk', '/usr/local/lib/python2.3/lib-dynload',
'/usr/local/lib/python2.3/site-packages']
>>>
Нулевая строка в sys.path
представляет собой текущий рабочий каталог.
Ожидаемым соглашением для локально установленных пакетов является помещение их в каталог …/site-packages/
, но вы можете захотеть установить модули Python в какой-либо произвольный каталог. Например, на вашем сайте может быть принято хранить все программное обеспечение, связанное с веб-сервером, в каталоге /www
. Тогда дополнительные модули Python могут находиться в /www/python
, а чтобы их импортировать, этот каталог должен быть добавлен в sys.path
. Существует несколько различных способов добавления каталога.
Самый удобный способ - добавить файл конфигурации пути в каталог, который уже есть в пути Python, обычно в каталог .../site-packages/
. Файлы конфигурации пути имеют расширение .pth
, и каждая строка должна содержать один путь, который будет добавлен к sys.path
. (Поскольку новые пути добавляются к sys.path
, модули в добавленных каталогах не будут переопределять стандартные модули. Это означает, что вы не можете использовать этот механизм для установки фиксированных версий стандартных модулей).
Пути могут быть абсолютными или относительными, в этом случае они относятся к каталогу, содержащему файл .pth
. Более подробную информацию смотрите в документации модуля site
.
Несколько менее удобный способ - отредактировать файл site.py
в стандартной библиотеке Python и изменить sys.path
. site.py
автоматически импортируется при выполнении интерпретатора Python, если не установлен переключатель -S
для подавления этого поведения. Поэтому вы можете просто отредактировать site.py
и добавить к нему две строки:
import sys
sys.path.append('/www/python/')
Однако, если вы переустановите ту же самую основную версию Python (например, при обновлении с 2.2 до 2.2.2), site.py
будет перезаписана стоковой версией. Вам придется запомнить, что она была изменена, и сохранить копию перед установкой.
Есть две переменные окружения, которые могут изменять sys.path
. PYTHONHOME
задает альтернативное значение для префикса установки Python. Например, если PYTHONHOME
установлена в /www/python
, путь поиска будет установлен в ['', '/www/python/lib/pythonX.Y/', '/www/python/lib/pythonX.Y/plat-linux2', ...]
.
Переменная PYTHONPATH
может быть установлена в список путей, которые будут добавлены к началу sys.path
. Например, если переменная PYTHONPATH
установлена в /www/python:/opt/py
, путь поиска будет начинаться с ['/www/python', '/opt/py']
. (Обратите внимание, что каталоги должны существовать, чтобы быть добавленными к sys.path
; модуль site
удаляет несуществующие пути).
Наконец, sys.path
является обычным списком Python, поэтому любое приложение Python может изменять его, добавляя или удаляя элементы.
Конфигурационные файлы Distutils¶
Как упоминалось выше, вы можете использовать конфигурационные файлы Distutils для записи личных предпочтений или предпочтений сайта для любых опций Distutils. То есть, любой параметр любой команды может быть сохранен в одном из двух или трех (в зависимости от вашей платформы) конфигурационных файлов, которые будут просмотрены перед разбором командной строки. Это означает, что конфигурационные файлы отменяют значения по умолчанию, а командная строка, в свою очередь, отменяет конфигурационные файлы. Более того, если используется несколько конфигурационных файлов, значения из «более ранних» файлов отменяются «более поздними» файлами.
Расположение и имена файлов конфигурации¶
Имена и расположение конфигурационных файлов немного отличаются на разных платформах. На Unix и macOS три конфигурационных файла (в порядке их обработки) следующие:
Тип файла |
Расположение и имя файла |
Примечания |
---|---|---|
система |
|
(1) |
личный |
|
(2) |
местный |
|
(3) |
В Windows конфигурационные файлы находятся:
Тип файла |
Расположение и имя файла |
Примечания |
---|---|---|
система |
|
(4) |
личный |
|
(5) |
местный |
|
(3) |
На всех платформах «личный» файл можно временно отключить, передав опцию –no-user-cfg.
Примечания:
Строго говоря, общесистемный конфигурационный файл находится в каталоге, где установлены Distutils; в Python 1.6 и более поздних версиях на Unix это выглядит так, как показано на рисунке. Для Python 1.5.2 Distutils обычно устанавливается в каталог
prefix/lib/python1.5/site-packages/distutils
, поэтому системный конфигурационный файл должен быть помещен туда для Python 1.5.2.На Unix, если переменная окружения
HOME
не определена, домашний каталог пользователя будет определен с помощью функцииgetpwuid()
из стандартного модуляpwd
. Это делается с помощью функцииos.path.expanduser()
, используемой Distutils.Т.е. в текущем каталоге (обычно это местоположение скрипта настройки).
(См. также примечание (1).) В Python 1.6 и более поздних версиях «префикс установки» Python по умолчанию
C:\Python
, поэтому системный конфигурационный файл обычноC:\Python\Lib\distutils\distutils.cfg
. В Python 1.5.2 префикс по умолчанию былC:\Program Files\Python
, а Distutils не был частью стандартной библиотеки - поэтому в стандартной установке Python 1.5.2 под Windows файл системной конфигурации будетC:\Program Files\Python\distutils\distutils.cfg
.В Windows, если переменная окружения
HOME
не определена, будет выполнена попыткаUSERPROFILE
, затемHOMEDRIVE
иHOMEPATH
. Это делается функциейos.path.expanduser()
, используемой Distutils.
Синтаксис конфигурационных файлов¶
Все конфигурационные файлы Distutils имеют одинаковый синтаксис. Конфигурационные файлы сгруппированы по разделам. Есть одна секция для каждой команды Distutils, плюс секция global
для глобальных опций, которые влияют на каждую команду. Каждая секция состоит из одной опции в строке, указанной как option=value
.
Например, ниже приведен полный файл конфигурации, который просто заставляет все команды по умолчанию выполняться тихо:
[global]
verbose=0
Если этот файл установлен как системный конфигурационный файл, он будет влиять на всю обработку любого дистрибутива модуля Python любым пользователем в текущей системе. Если он установлен как ваш личный конфигурационный файл (на системах, которые их поддерживают), он будет влиять только на дистрибутивы модулей, обрабатываемые вами. А если он используется как setup.cfg
для определенного дистрибутива модуля, то он будет влиять только на этот дистрибутив.
Вы можете переопределить каталог «build base» по умолчанию и заставить команды build* всегда принудительно перестраивать все файлы следующим образом:
[build]
build-base=blib
force=1
что соответствует аргументам командной строки
python setup.py build --build-base=blib --force
за исключением того, что включение команды build в командную строку означает, что эта команда будет выполнена. Включение определенной команды в конфигурационные файлы не имеет таких последствий; это означает только то, что если команда будет запущена, то будут применены опции, указанные в конфигурационном файле. (Или если будут запущены другие команды, которые получают значения от нее, они будут использовать значения из конфигурационного файла).
Вы можете узнать полный список опций для любой команды, используя опцию --help
, например:
python setup.py build --help
и вы можете узнать полный список глобальных опций, используя --help
без команды:
python setup.py --help
См. также раздел «Справочник» руководства «Распространение модулей Python».
Строительство пристроек: Советы и рекомендации¶
Когда это возможно, Distutils старается использовать информацию о конфигурации, доступную в интерпретаторе Python, используемом для запуска скрипта setup.py
. Например, те же флаги компилятора и компоновщика, которые используются для компиляции Python, будут использоваться и для компиляции расширений. Обычно это работает хорошо, но в сложных ситуациях это может быть неуместно. В этом разделе рассматривается, как переопределить обычное поведение Distutils.
Настройка флагов компилятора/линкера¶
Компиляция расширения Python, написанного на C или C++, иногда требует указания пользовательских флагов для компилятора и компоновщика, чтобы использовать определенную библиотеку или создать особый вид объектного кода. Это особенно актуально, если расширение не было протестировано на вашей платформе, или если вы пытаетесь кросс-компилировать Python.
В самом общем случае автор расширения мог предвидеть, что компиляция расширений будет сложной, и предоставить файл Setup
для редактирования. Скорее всего, это будет сделано только в том случае, если дистрибутив модуля содержит много отдельных модулей расширений, или если для их работы часто требуется сложный набор флагов компилятора.
Файл Setup
, если он присутствует, разбирается для получения списка расширений для сборки. Каждая строка в Setup
описывает один модуль. Строки имеют следующую структуру:
module ... [sourcefile ...] [cpparg ...] [library ...]
Давайте рассмотрим каждое из полей по очереди.
module - это имя собираемого модуля расширения, которое должно быть правильным идентификатором Python. Вы не можете просто изменить это имя, чтобы переименовать модуль (для этого потребуются правки исходного кода), поэтому его следует оставить в покое.
sourcefile - это все, что может быть файлом исходного кода, по крайней мере, судя по имени файла. Предполагается, что имена файлов, заканчивающиеся на
.c
, написаны на C, имена файлов, заканчивающиеся на.C
,.cc
и.c++
, - на C++, а имена файлов, заканчивающиеся на.m
или.mm
, - на Objective C.cpparg - это аргумент для препроцессора языка C, который представляет собой все, что начинается с
-I
,-D
,-U
или-C
.библиотека - это все, что заканчивается на
.a
или начинается на-l
или-L
.
Если на вашей платформе требуется специальная библиотека, вы можете добавить ее, отредактировав файл Setup
и выполнив python setup.py build
. Например, если модуль, определенный строкой
foo foomodule.c
должен быть связан с математической библиотекой libm.a
на вашей платформе, просто добавьте -lm
к строке:
foo foomodule.c -lm
С помощью опций -Xcompiler
arg и -Xlinker
arg можно задать произвольные переключатели, предназначенные для компилятора или компоновщика:
foo foomodule.c -Xcompiler -o32 -Xlinker -shared -lm
Следующая опция после -Xcompiler
и -Xlinker
будет добавлена к соответствующей командной строке, поэтому в приведенном выше примере компилятору будет передана опция -o32
, а компоновщику - -shared
. Если опция компилятора требует аргумента, вам придется предоставить несколько опций -Xcompiler
; например, для передачи -x c++
файл Setup
должен содержать -Xcompiler -x -Xcompiler c++
.
Флаги компилятора также могут быть заданы посредством установки переменной окружения CFLAGS
. Если она установлена, содержимое CFLAGS
будет добавлено к флагам компилятора, указанным в файле Setup
.
Использование компиляторов других производителей под Windows¶
Borland/CodeGear C++¶
В этом подразделе описаны шаги, необходимые для использования Distutils с компилятором Borland C++ версии 5.5. Сначала вы должны знать, что формат объектных файлов Borland (OMF) отличается от формата, используемого в версии Python, которую вы можете загрузить с сайта Python или ActiveState. (Python создан с помощью Microsoft Visual C++, который использует COFF в качестве формата объектных файлов). По этой причине вам необходимо преобразовать библиотеку Python python25.lib
в формат Borland. Это можно сделать следующим образом:
coff2omf python25.lib python25_bcpp.lib
Программа coff2omf
поставляется с компилятором Borland. Файл python25.lib
находится в каталоге Libs
вашей установки Python. Если ваше расширение использует другие библиотеки (zlib, …), вы должны преобразовать и их.
Преобразованные файлы должны находиться в тех же каталогах, что и обычные библиотеки.
Как Distutils удается использовать эти библиотеки с измененными именами? Если расширению нужна библиотека (например, foo
), Distutils сначала проверяет, не найдена ли библиотека с суффиксом _bcpp
(например, foo_bcpp.lib
), а затем использует эту библиотеку. В случае, если такой специальной библиотеки не найдено, используется имя по умолчанию (foo.lib
) 1
Чтобы позволить Distutils скомпилировать ваше расширение с Borland C++, теперь нужно ввести:
python setup.py build --compiler=bcpp
Если вы хотите использовать компилятор Borland C++ по умолчанию, вы можете указать это в персональном или общесистемном конфигурационном файле для Distutils (см. раздел Конфигурационные файлы Distutils).
См.также
- C++Builder Compiler
Информация о бесплатном компиляторе C++ от Borland, включая ссылки на страницы загрузки.
- Creating Python Extensions Using Borland’s Free Compiler
Документ, описывающий, как использовать бесплатный компилятор C++ командной строки Borland для создания Python.
GNU C / Cygwin / MinGW¶
В этом разделе описаны необходимые шаги для использования Distutils с компиляторами GNU C/C++ в их дистрибутивах Cygwin и MinGW. 2 Для интерпретатора Python, который был собран с помощью Cygwin, все должно работать без каких-либо следующих шагов.
Не все расширения могут быть созданы с помощью MinGW или Cygwin, но многие могут. Скорее всего, не будут работать те расширения, которые используют C++ или зависят от расширений Microsoft Visual C.
Чтобы позволить Distutils скомпилировать ваше расширение с Cygwin, нужно набрать:
python setup.py build --compiler=cygwin
и для Cygwin в режиме no-cygwin 3 или для MinGW тип:
python setup.py build --compiler=mingw32
Если вы хотите использовать какую-либо из этих опций/компиляторов по умолчанию, вам следует прописать это в вашем личном или общесистемном конфигурационном файле для Distutils (см. раздел Конфигурационные файлы Distutils).
Старые версии Python и MinGW¶
Следующие инструкции применимы, только если вы используете версию Python ниже 2.4.1 с MinGW ниже 3.0.0 (с binutils-2.13.90-20030111-1).
Для этих компиляторов требуются некоторые специальные библиотеки. Эта задача сложнее, чем для Borland’s C++, потому что нет программы для преобразования библиотеки. Сначала необходимо создать список символов, которые экспортирует библиотека Python DLL. (Хорошую программу для этой задачи можно найти на сайте https://sourceforge.net/projects/mingw/files/MinGW/Extension/pexports/).
pexports python25.dll >python25.def
Расположение установленного python25.dll
будет зависеть от опций установки, а также от версии и языка Windows. При установке «только для меня» он будет находиться в корне каталога установки. При общей установке он будет находиться в системном каталоге.
Затем вы можете создать из этой информации библиотеку импорта для gcc.
/cygwin/bin/dlltool --dllname python25.dll --def python25.def --output-lib libpython25.a
Полученная библиотека должна быть помещена в тот же каталог, что и python25.lib
. (Это должен быть каталог libs
в каталоге установки Python).
Если ваше расширение использует другие библиотеки (zlib,…), возможно, вам придется конвертировать и их. Конвертированные файлы должны находиться в тех же каталогах, что и обычные библиотеки.
См.также
- Building Python modules on MS Windows platform with MinGW
Информация о сборке необходимых библиотек для среды MinGW.
Сноски
- 1
Это также означает, что вы можете заменить все существующие COFF-библиотеки на одноименные OMF-библиотеки.
- 2
Проверьте https://www.sourceware.org/cygwin/ для получения дополнительной информации
- 3
Тогда вам не доступна эмуляция POSIX, но вам также не нужно
cygwin1.dll
.