sysconfig — Configuración en tiempo de compilación del intérprete

Propósito:Acceso a los ajustes de configuración utilizados para construir Python.

Las características de sysconfig se han extraído de distutils para crear un módulo independiente. Incluye funciones para determinar la configuración utilizada para compilar e instalar el intérprete actual.

Variables de configuración

El acceso a la configuración de configuración en tiempo de construcción se proporciona a través de dos funciones. get_config_vars() devuelve un diccionario que asigna los nombres de las variables de configuración a los valores.

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={prefix}'.format(**config_values))
print('  exec_prefix={exec_prefix}'.format(**config_values))

print('\n Version info:')
print('  py_version={py_version}'.format(**config_values))
print('  py_version_short={py_version_short}'.format(
    **config_values))
print('  py_version_nodot={py_version_nodot}'.format(
    **config_values))

print('\n Base directories:')
print('  base={base}'.format(**config_values))
print('  platbase={platbase}'.format(**config_values))
print('  userbase={userbase}'.format(**config_values))
print('  srcdir={srcdir}'.format(**config_values))

print('\n Compiler and linker flags:')
print('  LDFLAGS={LDFLAGS}'.format(**config_values))
print('  BASECFLAGS={BASECFLAGS}'.format(**config_values))
print('  Py_ENABLE_SHARED={Py_ENABLE_SHARED}'.format(
    **config_values))

El nivel de detalle disponible a través de la interfaz de programación de sysconfig depende de la plataforma donde se ejecuta un programa. En sistemas POSIX como Linux y OS X, el Makefile utilizado para construir el intérprete y el archivo de encabezados config.h generado para la compilación se analizan y todas las variables que se encuentran dentro están disponibles. En sistemas que no son POSIX como Windows, la configuración está limitada a algunas rutas, extensiones de nombre de archivo y detalles de versión.

$ python3 sysconfig_get_config_vars.py

Found 663 configuration settings

Some highlights:

 Installation prefixes:
  prefix=/Library/Frameworks/Python.framework/Versions/3.6
  exec_prefix=/Library/Frameworks/Python.framework/Versions/3.6

 Version info:
  py_version=3.6.4
  py_version_short=3.6
  py_version_nodot=36

 Base directories:
  base=/Users/dhellmann/Envs/pymotw36
  platbase=/Users/dhellmann/Envs/pymotw36
  userbase=/Users/dhellmann/Library/Python/3.6
  srcdir=/Library/Frameworks/Python.framework/Versions/3.6/lib/p
ython3.6/config-3.6m-darwin

 Compiler and linker flags:
  LDFLAGS=-arch i386 -arch x86_64  -g
  BASECFLAGS=-fno-strict-aliasing -Wsign-compare -fno-common
-dynamic
  Py_ENABLE_SHARED=0

Pasar nombres de variables a get_config_vars() cambia el valor de retorno a una list creada al agregar todos los valores para esas variables juntas.

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)

Este ejemplo crea una lista de todos los directorios base de instalación donde se pueden encontrar módulos en el sistema actual.

$ python3 sysconfig_get_config_vars_by_name.py

Base directories:
   /Users/dhellmann/Envs/pymotw36
   /Users/dhellmann/Envs/pymotw36
   /Users/dhellmann/Library/Python/3.6

Cuando solo se necesita un único valor de configuración, usa get_config_var() para recuperarlo.

sysconfig_get_config_var.py
import sysconfig

print('User base directory:',
      sysconfig.get_config_var('userbase'))
print('Unknown variable   :',
      sysconfig.get_config_var('NoSuchVariable'))

Si no se encuentra la variable, get_config_var() devuelve None en lugar de generar una excepción.

$ python3 sysconfig_get_config_var.py

User base directory: /Users/dhellmann/Library/Python/3.6
Unknown variable   : None

Rutas de instalación

sysconfig está destinado principalmente a ser utilizado por herramientas de instalación y embalaje. Como resultado, si bien proporciona acceso a la configuración general, como la versión del intérprete, se centra en la información necesaria para ubicar partes de la distribución de Python actualmente instalada en un sistema. Las ubicaciones utilizadas para instalar un paquete dependen del esquema utilizado.

Un esquema es un conjunto de directorios predeterminados específicos de la plataforma organizados en base a los estándares y directrices de empaquetado de la plataforma. Existen diferentes esquemas para instalar en una ubicación de todo el sitio o en un directorio privado propiedad del usuario. Se puede acceder al conjunto completo de esquemas con get_scheme_names().

sysconfig_get_scheme_names.py
import sysconfig

for name in sysconfig.get_scheme_names():
    print(name)

No existe el concepto de un «esquema actual» per se. El esquema predeterminado depende de la plataforma, y el esquema real utilizado depende de las opciones dadas al programa de instalación. Si el sistema actual está ejecutando un sistema operativo compatible con POSIX, el valor predeterminado es posix_prefix. De lo contrario, el nombre predeterminado del sistema operativo es el definido por os.name.

$ python3 sysconfig_get_scheme_names.py

nt
nt_user
osx_framework_user
posix_home
posix_prefix
posix_user

Cada esquema define un conjunto de rutas utilizadas para instalar paquetes. Para obtener una lista de los nombres de ruta, use get_path_names().

sysconfig_get_path_names.py
import sysconfig

for name in sysconfig.get_path_names():
    print(name)

Algunas de las rutas pueden ser las mismas para un esquema dado, pero los instaladores no deben hacer suposiciones sobre cuáles son las rutas reales. Cada nombre tiene un significado semántico particular, por lo que se debe usar el nombre correcto para encontrar la ruta de un archivo determinado durante la instalación. Consulta the table below para obtener una lista completa de los nombres de ruta y su significado.

Nombres de ruta utilizados en sysconfig
Nombre Descripción
stdlib Archivos de biblioteca Python estándar, no específicos de la plataforma
platstdlib Archivos de biblioteca estándar de Python, específicos de la plataforma
platlib Archivos específicos del sitio, específicos de la plataforma
purelib Archivos específicos del sitio, no específicos de la plataforma
include Archivos de encabezado, no específicos de la plataforma
platinclude Archivos de encabezado, específicos de la plataforma
scripts Archivos de secuencias de comandos ejecutables
data Archivos de datos
$ python3 sysconfig_get_path_names.py

stdlib
platstdlib
purelib
platlib
include
scripts
data

Usa get_paths() para recuperar los directorios reales asociados con un esquema.

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(scheme=scheme)
    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()

Este ejemplo muestra la diferencia entre las rutas de todo el sistema utilizadas para posix_prefix en una compilación de marco en Mac OS X, y los valores específicos del usuario para posix_user.

$ python3 sysconfig_get_paths.py

posix_prefix
============
prefix = /Users/dhellmann/Envs/pymotw36

data
  .
include
  ./include/python3.6m
platinclude
  ./include/python3.6m
platlib
  ./lib/python3.6/site-packages
platstdlib
  ./lib/python3.6
purelib
  ./lib/python3.6/site-packages
scripts
  ./bin
stdlib
  ./lib/python3.6

posix_user
==========
prefix = /Users/dhellmann/Library/Python/3.6

data
  .
include
  ./include/python3.6
platlib
  ./lib/python3.6/site-packages
platstdlib
  ./lib/python3.6
purelib
  ./lib/python3.6/site-packages
scripts
  ./bin
stdlib
  ./lib/python3.6

Para una ruta individual, ejecuta 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',
                                          scheme=scheme))
    print()

Usar get_path() es equivalente a guardar el valor de get_paths() y buscar la clave individual en el diccionario. Si se necesitan varias rutas, get_paths() es más eficiente porque no vuelve a calcular todas las rutas cada vez.

$ python3 sysconfig_get_path.py

posix_prefix
============
purelib = /Users/dhellmann/Envs/pymotw36/lib/python3.6/site-pack
ages

posix_user
==========
purelib = /Users/dhellmann/Library/Python/3.6/lib/python3.6/site
-packages

Versión de Python y de la plataforma

Mientras que sys incluye una identificación básica de la plataforma (ver Información de versión de tiempo de compilación), no es lo suficientemente específica para ser utilizada para instalar paquetes binarios porque sys.platform no siempre incluya información sobre arquitectura de hardware, tamaño de instrucción u otros valores que afecten la compatibilidad de las bibliotecas binarias. Para un especificador de plataforma más preciso, use get_platform().

sysconfig_get_platform.py
import sysconfig

print(sysconfig.get_platform())

El intérprete utilizado para preparar esta salida de muestra se compiló para la compatibilidad con Mac OS X 10.6, por lo que es el número de versión incluido en la cadena de la plataforma.

$ python3 sysconfig_get_platform.py

macosx-10.6-intel

Para tu comodidad, la versión de intérprete de sys.version_info también está disponible a través de get_python_version() en 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() devuelve una cadena adecuada para su uso al crear una ruta específica de la versión.

$ python3 sysconfig_get_python_version.py

sysconfig.get_python_version(): 3.6

sys.version_info:
  major       : 3
  minor       : 6
  micro       : 4
  releaselevel: final
  serial      : 0

Ver también

  • Documentación de la biblioteca estándar para sysconfig
  • distutilssysconfig solía ser parte del paquete distutils.
  • site – El módulo site describe con más detalle las rutas buscadas al importar.
  • os – Incluye os.name, el nombre del sistema operativo actual.
  • sys – Incluye otra información de tiempo de compilación, como la plataforma.