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.
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.
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.
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()
.
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()
.
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.
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.
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()
.
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()
.
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
.
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
distutils
–sysconfig
solía ser parte del paquetedistutils
.site
– El módulosite
describe con más detalle las rutas buscadas al importar.os
– Incluyeos.name
, el nombre del sistema operativo actual.sys
– Incluye otra información de tiempo de compilación, como la plataforma.