18.8. sysconfig — 命令解释器编译时配置
目的:访问用于构建 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={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))
通过 sysconfig
接口提供的详细信息级别取决于运行程序的平台。 在诸如 Linux 和 OS X 之类的 POSIX 系统上,用于构建解释器的 Makefile
和为构建生成的 config.h
头文件被解析,并且所有在其中找到的变量都可用。 在非 POSIX 系统(如 Windows )上,设置仅限于几个路径,文件扩展名和版本详细信息。
$ 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
将变量名传递给 get_config_vars()
会将返回值更改为通过将这些变量的所有值附加在一起而创建的 list
。
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/pymotw36
/Users/dhellmann/Envs/pymotw36
/Users/dhellmann/Library/Python/3.6
如果只需要一个配置值,请使用 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.6
Unknown variable : None
安装路径
sysconfig
主要用于安装和打包工具。 因此,虽然它提供了对一般配置设置(如解释器版本)的访问,但它专注于查找当前安装在系统上的 Python 分发部分所需的信息。 用于安装包的位置取决于使用的scheme 。
scheme 是一组基于平台的包装标准和指南组织的特定于平台的默认目录。 有不同的 scheme 可以安装到站点范围的位置或用户拥有的私人目录。 可以使用 get_scheme_names()
访问完整的方案集。
sysconfig_get_scheme_names.py
import sysconfig
for name in sysconfig.get_scheme_names():
print(name)
目前没有「当前 scheme 」的概念。 默认方案取决于平台,实际使用的方案取决于给安装程序的选项。 如果当前系统正在运行符合 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)
对于给定的方案,某些路径可能相同,但安装者不应对实际路径做出任何假设。 每个名称都有特定的语义含义,因此在安装过程中应使用正确的名称来查找给定文件的路径。 有关路径名称及其含义的完整列表,请参阅下表。
Path Names Used in sysconfig
Name | Description |
---|---|
stdlib |
Python 标准库文件,非平台专用 |
platstdlib |
Python 标准库文件,平台专用 |
platlib |
站点专用,平台专用文件 |
purelib |
站点专用,非平台专用文件 |
include |
头文件,非平台专用 |
platinclude |
头文件,平台专用 |
scripts |
可执行脚本文件 |
data |
数据文件 |
$ 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(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()
此示例显示了在 Mac OS X 上构建框架下用于 posix_prefix
的系统范围路径与 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
对于单个路径,调用 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()
使用 get_path()
相当于保存 get_paths()
的值并查找字典中的单个键。 如果需要多个路径, get_paths()
更有效,因为它不会每次都重新计算所有路径。
$ 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
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。