Рубрики
Без рубрики

sysconfig – Конфигурация интерпретатора во время компиляции

Автор оригинала: 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 – включает другую информацию о времени сборки, такую как платформа.