Автор оригинала: Doug Hellmann.
Цель:
Доступ к настройкам конфигурации, используемым для сборки Python.
Функции sysconfig
были извлечены из distutils
для создания автономного модуля. Он включает в себя функции для определения параметров, используемых для компиляции и установки текущего интерпретатора.
Переменные конфигурации
Доступ к параметрам конфигурации времени сборки предоставляется с помощью двух функций. get_config_vars ()
возвращает словарь, сопоставляющий имена переменных конфигурации со значениями.
sysconfig_get_config_vars.py
import sysconfig config_values sysconfig.get_config_vars() print('Found {} configuration settings'.format( len(config_values.keys()))) print('\nSome highlights:\n') print(' Installation prefixes:') print(' >{prefix}'.format(**config_values)) print(' >{exec_prefix}'.format(**config_values)) print('\n Version info:') print(' >{py_version}'.format(**config_values)) print(' >{py_version_short}'.format( **config_values)) print(' >{py_version_nodot}'.format( **config_values)) print('\n Base directories:') print(' >{base}'.format(**config_values)) print(' >{platbase}'.format(**config_values)) print(' >{userbase}'.format(**config_values)) print(' srcdir={srcdir}'.format(**config_values)) print('\n Compiler and linker flags:') print(' >{LDFLAGS}'.format(**config_values)) print(' >{BASECFLAGS}'.format(**config_values)) print(' >{Py_ENABLE_SHARED}'.format( **config_values))
Уровень детализации, доступный с помощью API sysconfig
, зависит от платформы, на которой выполняется программа. В системах POSIX, таких как Linux и OS X, Makefile
, используемый для построения интерпретатора, и файл заголовка config.h
, созданный для сборки, анализируются, и все переменные, найденные в доступны. В системах, отличных от POSIX, таких как Windows, настройки ограничены несколькими путями, расширениями файлов и сведениями о версии.
$ python3 sysconfig_get_config_vars.py Found 668 configuration settings Some highlights: Installation prefixes: Version info: Base directories: srcdir=/Library/Frameworks/Python.framework/Versions/3.7/lib/p ython3.7/config-3.7m-darwin Compiler and linker flags: code -fno-common -dynamic Py_ENABLE_SHARED=0
Передача имен переменных в get_config_vars ()
изменяет возвращаемое значение на список
, созданный путем добавления всех значений этих переменных вместе.
sysconfig_get_config_vars_by_name.py
import sysconfig bases sysconfig.get_config_vars('base', 'platbase', 'userbase') print('Base directories:') for b in bases: print(' ', b)
В этом примере создается список всех базовых каталогов установки, в которых можно найти модули в текущей системе.
$ python3 sysconfig_get_config_vars_by_name.py Base directories: /Users/dhellmann/Envs/pymotw37 /Users/dhellmann/Envs/pymotw37 /Users/dhellmann/Library/Python/3.7
Если требуется только одно значение конфигурации, используйте get_config_var ()
для его получения.
sysconfig_get_config_var.py
import sysconfig print('User base directory:', sysconfig.get_config_var('userbase')) print('Unknown variable :', sysconfig.get_config_var('NoSuchVariable'))
Если переменная не найдена, get_config_var ()
возвращает None
вместо того, чтобы вызывать исключение.
$ python3 sysconfig_get_config_var.py User base directory: /Users/dhellmann/Library/Python/3.7 Unknown variable : None
Пути установки
sysconfig
в первую очередь предназначен для использования средствами установки и упаковки. В результате, хотя он обеспечивает доступ к общим параметрам конфигурации, таким как версия интерпретатора, он сосредоточен на информации, необходимой для поиска частей дистрибутива Python, установленного в настоящее время в системе. Расположение, используемое для установки пакета, зависит от используемой схемы .
Схема – это набор специфичных для платформы каталогов по умолчанию, организованных на основе стандартов и рекомендаций платформы по упаковке. Существуют разные схемы установки в местоположение на уровне сайта или в личный каталог, принадлежащий пользователю. Полный набор схем можно получить с помощью get_scheme_names ()
.
sysconfig_get_scheme_names.py
import sysconfig for name in sysconfig.get_scheme_names(): print(name)
Само по себе понятие «действующая схема» отсутствует. Схема по умолчанию зависит от платформы, а фактическая используемая схема зависит от параметров, заданных программе установки. Если текущая система работает под управлением операционной системы, совместимой с POSIX, по умолчанию используется posix_prefix
. В противном случае по умолчанию используется имя операционной системы, как определено в os.name
.
$ python3 sysconfig_get_scheme_names.py nt nt_user osx_framework_user posix_home posix_prefix posix_user
Каждая схема определяет набор путей, используемых для установки пакетов. Чтобы получить список имен путей, используйте get_path_names ()
.
sysconfig_get_path_names.py
import sysconfig for name in sysconfig.get_path_names(): print(name)
Некоторые пути могут быть одинаковыми для данной схемы, но установщики не должны делать никаких предположений о фактических путях. Каждое имя имеет определенное семантическое значение, поэтому правильное имя следует использовать для поиска пути к данному файлу во время установки. Обратитесь к таблице ниже для получения полного списка имен путей и их значения.
Имена путей, используемые в sysconfig
Имя
Описание
stdlib
Стандартные файлы библиотеки Python, не зависящие от платформы
platstdlib
Стандартные файлы библиотеки Python, зависящие от платформы
Платлиб
Файлы для конкретных сайтов и платформ
purelib
Файлы, специфичные для сайта, не связанные с платформой
включают
Заголовочные файлы, не зависящие от платформы
Platinclude
Заголовочные файлы, зависящие от платформы
скрипты
Исполняемые файлы скриптов
данные
Дата файлы
$ python3 sysconfig_get_path_names.py stdlib platstdlib purelib platlib include scripts data
Используйте get_paths ()
для получения фактических каталогов, связанных со схемой.
sysconfig_get_paths.py
import sysconfig import pprint import os for scheme in ['posix_prefix', 'posix_user']: print(scheme) print( * len(scheme)) paths sysconfig.get_paths(schemescheme) prefix os.path.commonprefix(list(paths.values())) print('prefix = {}\n'.format(prefix)) for name, path in sorted(paths.items()): print('{}\n .{}'.format(name, path[len(prefix):])) print()
В этом примере показано различие между общесистемными путями, используемыми для posix_prefix
в сборке инфраструктуры в Mac OS X, и пользовательскими значениями для posix_user
.
$ python3 sysconfig_get_paths.py posix_prefix prefix = /Users/dhellmann/Envs/pymotw37 data . include ./include/python3.7m platinclude ./include/python3.7m platlib ./lib/python3.7/site-packages platstdlib ./lib/python3.7 purelib ./lib/python3.7/site-packages scripts ./bin stdlib ./lib/python3.7 posix_user prefix = /Users/dhellmann/Library/Python/3.7 data . include ./include/python3.7 platlib ./lib/python3.7/site-packages platstdlib ./lib/python3.7 purelib ./lib/python3.7/site-packages scripts ./bin stdlib ./lib/python3.7
Для индивидуального пути вызовите get_path ()
.
sysconfig_get_path.py
import sysconfig import pprint for scheme in ['posix_prefix', 'posix_user']: print(scheme) print( * len(scheme)) print('purelib =', sysconfig.get_path(name'purelib', schemescheme)) print()
Использование get_path ()
эквивалентно сохранению значения get_paths ()
и поиску отдельного ключа в словаре. Если необходимо несколько путей, get_paths ()
более эффективен, потому что он не пересчитывает все пути каждый раз.
$ python3 sysconfig_get_path.py posix_prefix purelib = /Users/dhellmann/Envs/pymotw37/lib/python3.7/site-pack ages posix_user purelib = /Users/dhellmann/Library/Python/3.7/lib/python3.7/site -packages
Версия и платформа Python
Хотя sys включает в себя некоторую базовую идентификацию платформы (см. Информация о версии во время сборки), она недостаточно конкретна, чтобы ее можно было использовать для установки двоичных пакетов, поскольку sys.platform
не всегда включает информацию об аппаратной архитектуре, размере инструкции или другие значения, влияющие на совместимость двоичных библиотек. Для более точного определения платформы используйте get_platform ()
.
sysconfig_get_platform.py
import sysconfig print(sysconfig.get_platform())
Интерпретатор, используемый для подготовки этого примера выходных данных, был скомпилирован для совместимости с Mac OS X 10.6, так что номер версии включен в строку платформы.
$ python3 sysconfig_get_platform.py macosx-10.9-x86_64
Для удобства версия интерпретатора из sys.version_info
также доступна через get_python_version ()
в sysconfig
.
sysconfig_get_python_version.py
import sysconfig import sys print('sysconfig.get_python_version():', sysconfig.get_python_version()) print('\nsys.version_info:') print(' major :', sys.version_info.major) print(' minor :', sys.version_info.minor) print(' micro :', sys.version_info.micro) print(' releaselevel:', sys.version_info.releaselevel) print(' serial :', sys.version_info.serial)
get_python_version ()
возвращает строку, подходящую для использования при построении пути для конкретной версии.
$ python3 sysconfig_get_python_version.py sysconfig.get_python_version(): 3.7 sys.version_info: major : 3 minor : 7 micro : 1 releaselevel: final serial : 0
Смотрите также
- стандартная библиотечная документация для sysconfig
distutils
–sysconfig
раньше был частью пакетаdistutils
.- site – модуль
site
более подробно описывает пути, по которым выполнялся поиск при импорте. - os – включает
os.name
, имя текущей операционной системы. - sys – включает другую информацию о времени сборки, такую как платформа.