翻译进度
3
分块数量
2
参与人数

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
alphanow 翻译于 6天前

安装路径

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
alphanow 翻译于 6天前

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.6-intel

为方便起见, sys.version_info 中的解释器版本也可以通过 sysconfig 中的 get_python_version() 获得。

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.6

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

另请参阅

  • sysconfig 标准库文档
  • distutils -- sysconfig 曾经是 distutils 包的一部分。
  • site -- site 模块更详细地描述了导入时搜索的路径。
  • os -- 包括 os.name ,当前操作系统的名称。
  • sys -- 包括其他构建时信息,例如平台。
alphanow 翻译于 5天前

本文章首发在 PythonCaff
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

参与译者:2
讨论数量: 0
发起讨论


暂无话题~