sysconfig — 提供对 Python 配置信息的访问

在 3.2 版本中添加。

源代码: Lib/sysconfig


sysconfig 模块提供了对 Python 配置信息的访问,例如安装路径列表以及与当前平台相关的配置变量。

配置变量

Python 发行版包含一个 Makefile 和一个 pyconfig.h 头文件,它们对于构建 Python 二进制文件本身以及使用 setuptools 编译的第三方 C 扩展都是必要的。

sysconfig 将这些文件中找到的所有变量放入一个字典中,可以使用 get_config_vars()get_config_var() 访问。

请注意,在 Windows 上,它是一个小得多的集合。

sysconfig.get_config_vars(*args)

不带参数时,返回与当前平台相关的所有配置变量的字典。

带有参数时,返回通过在配置变量字典中查找每个参数而产生的值的列表。

对于每个参数,如果找不到该值,则返回 None

sysconfig.get_config_var(name)

返回单个变量name的值。等效于 get_config_vars().get(name)

如果找不到 name,则返回 None

使用示例

>>> import sysconfig
>>> sysconfig.get_config_var('Py_ENABLE_SHARED')
0
>>> sysconfig.get_config_var('LIBDIR')
'/usr/local/lib'
>>> sysconfig.get_config_vars('AR', 'CXX')
['ar', 'g++']

安装路径

Python 使用的安装方案因平台和安装选项而异。这些方案存储在 sysconfig 中,其唯一标识符基于 os.name 返回的值。包安装程序使用这些方案来确定将文件复制到哪里。

Python 当前支持九种方案

  • posix_prefix: 用于 Linux 或 macOS 等 POSIX 平台的方案。这是安装 Python 或组件时使用的默认方案。

  • posix_home: 用于 POSIX 平台的方案,当使用 home 选项时。此方案定义位于特定主目录前缀下的路径。

  • posix_user: 用于 POSIX 平台的方案,当使用 user 选项时。此方案定义位于用户主目录 (site.USER_BASE) 下的路径。

  • posix_venv: 用于 POSIX 平台上 Python 虚拟环境 的方案;默认情况下,它与 posix_prefix 相同。

  • nt: 用于 Windows 的方案。这是安装 Python 或组件时使用的默认方案。

  • nt_user: 用于 Windows 的方案,当使用 user 选项时。

  • nt_venv: 用于 Windows 上 Python 虚拟环境 的方案;默认情况下,它与 nt 相同。

  • venv: 一个方案,其值取决于 Python 运行的平台,来自 posix_venvnt_venv

  • osx_framework_user: 用于 macOS 的方案,当使用 user 选项时。

每个方案本身都由一系列路径组成,每个路径都有唯一的标识符。Python 当前使用八个路径

  • stdlib: 包含非平台特定的标准 Python 库文件的目录。

  • platstdlib: 包含平台特定的标准 Python 库文件的目录。

  • platlib: 用于特定于站点的平台特定文件的目录。

  • purelib: 用于特定于站点的非平台特定文件(“纯” Python)的目录。

  • include: 用于 Python C-API 的非平台特定头文件的目录。

  • platinclude: 用于 Python C-API 的平台特定头文件的目录。

  • scripts: 用于脚本文件的目录。

  • data: 用于数据文件的目录。

用户方案

此方案旨在为没有全局 site-packages 目录的写入权限或不想安装到该目录的用户提供最便捷的解决方案。

文件将安装到 site.USER_BASE 的子目录中(以下简称 userbase)。此方案将纯 Python 模块和扩展模块安装在相同的位置(也称为 site.USER_SITE)。

posix_user

路径

安装目录

stdlib

userbase/lib/pythonX.Y

platstdlib

userbase/lib/pythonX.Y

platlib

userbase/lib/pythonX.Y/site-packages

purelib

userbase/lib/pythonX.Y/site-packages

include

userbase/include/pythonX.Y

scripts

userbase/bin

data

userbase

nt_user

路径

安装目录

stdlib

userbase\PythonXY

platstdlib

userbase\PythonXY

platlib

userbase\PythonXY\site-packages

purelib

userbase\PythonXY\site-packages

include

userbase\PythonXY\Include

scripts

userbase\PythonXY\Scripts

data

userbase

osx_framework_user

路径

安装目录

stdlib

userbase/lib/python

platstdlib

userbase/lib/python

platlib

userbase/lib/python/site-packages

purelib

userbase/lib/python/site-packages

include

userbase/include/pythonX.Y

scripts

userbase/bin

data

userbase

主目录方案

“主目录方案”背后的想法是构建和维护个人 Python 模块存储。此方案的名称源自 Unix 上“主目录”的概念,因为 Unix 用户将其主目录的布局类似于 /usr//usr/local/ 并不少见。此方案可以由任何人使用,无论他们安装的是哪个操作系统。

posix_home

路径

安装目录

stdlib

home/lib/python

platstdlib

home/lib/python

platlib

home/lib/python

purelib

home/lib/python

include

home/include/python

platinclude

home/include/python

scripts

home/bin

data

home

前缀方案

当您希望使用一个 Python 安装来执行构建/安装(即,运行安装脚本),但将模块安装到不同 Python 安装(或看起来像不同 Python 安装)的第三方模块目录中时,“前缀方案”很有用。如果这听起来有点不寻常,那确实如此——这就是为什么用户和主目录方案排在前面的原因。但是,至少有两种已知的情况,前缀方案会很有用。

首先,考虑到许多 Linux 发行版将 Python 放置在 /usr 中,而不是更传统的 /usr/local。这完全是合理的,因为在这些情况下,Python 是“系统”的一部分,而不是本地附加组件。但是,如果您是从源代码安装 Python 模块,您可能希望它们安装在 /usr/local/lib/python2.X 而不是 /usr/lib/python2.X

另一种可能性是网络文件系统,其中用于写入远程目录的名称与用于读取它的名称不同:例如,以 /usr/local/bin/python 访问的 Python 解释器可能会在 /usr/local/lib/python2.X 中搜索模块,但这些模块必须安装到例如 /mnt/@server/export/lib/python2.X

posix_prefix

路径

安装目录

stdlib

prefix/lib/pythonX.Y

platstdlib

prefix/lib/pythonX.Y

platlib

prefix/lib/pythonX.Y/site-packages

purelib

prefix/lib/pythonX.Y/site-packages

include

prefix/include/pythonX.Y

platinclude

prefix/include/pythonX.Y

scripts

prefix/bin

data

prefix

nt

路径

安装目录

stdlib

prefix\Lib

platstdlib

prefix\Lib

platlib

prefix\Lib\site-packages

purelib

prefix\Lib\site-packages

include

prefix\Include

platinclude

prefix\Include

scripts

prefix\Scripts

data

prefix

安装路径函数

sysconfig 提供了一些函数来确定这些安装路径。

sysconfig.get_scheme_names()

返回一个元组,其中包含 sysconfig 中当前支持的所有方案。

sysconfig.get_default_scheme()

返回当前平台的默认方案名称。

3.10 版本新增: 此函数以前名为 _get_default_scheme(),并被视为实现细节。

3.11 版本更改: 当 Python 从虚拟环境运行时,将返回 *venv* 方案。

sysconfig.get_preferred_scheme(key)

返回由 *key* 指定的安装布局的首选方案名称。

*key* 必须是 "prefix""home""user"

返回值是 get_scheme_names() 中列出的方案名称。它可以传递给带有 *scheme* 参数的 sysconfig 函数,例如 get_paths()

3.10 版本新增。

3.11 版本更改: 当 Python 从虚拟环境运行且 key="prefix" 时,将返回 *venv* 方案。

sysconfig._get_preferred_schemes()

返回一个字典,其中包含当前平台上首选的方案名称。Python 实现者和重新分发者可以将他们首选的方案添加到 _INSTALL_SCHEMES 模块级全局值,并修改此函数以返回这些方案名称,例如,为系统和语言包管理器提供不同的方案,因此任何一个安装的包都不会与另一个安装的包混合。

最终用户不应使用此函数,而应使用 get_default_scheme()get_preferred_scheme()

3.10 版本新增。

sysconfig.get_path_names()

返回一个元组,其中包含 sysconfig 中当前支持的所有路径名称。

sysconfig.get_path(name[, scheme[, vars[, expand]]])

返回与来自名为 *scheme* 的安装方案的路径 *name* 相对应的安装路径。

*name* 必须是 get_path_names() 返回的列表中的值。

sysconfig 存储与每个平台每个路径名称对应的安装路径,其中包含要扩展的变量。例如,*nt* 方案的 *stdlib* 路径是:{base}/Lib

get_path() 将使用 get_config_vars() 返回的变量来扩展路径。所有变量对于每个平台都有默认值,因此可以调用此函数并获取默认值。

如果提供了 *scheme*,它必须是 get_scheme_names() 返回的列表中的值。否则,将使用当前平台的默认方案。

如果提供了 *vars*,它必须是一个变量字典,该字典将更新 get_config_vars() 返回的字典。

如果将 *expand* 设置为 False,则不会使用变量扩展路径。

如果找不到 *name*,则引发 KeyError

sysconfig.get_paths([scheme[, vars[, expand]]])

返回一个字典,其中包含与安装方案相对应的所有安装路径。有关更多信息,请参见 get_path()

如果未提供 *scheme*,将使用当前平台的默认方案。

如果提供了 *vars*,它必须是一个变量字典,该字典将更新用于扩展路径的字典。

如果将 *expand* 设置为 false,则不会扩展路径。

如果 *scheme* 不是现有方案,get_paths() 将引发 KeyError

其他函数

sysconfig.get_python_version()

以字符串形式返回 MAJOR.MINOR Python 版本号。类似于 '%d.%d' % sys.version_info[:2]

sysconfig.get_platform()

返回一个标识当前平台的字符串。

这主要用于区分特定于平台的构建目录和特定于平台的构建分发。通常包括操作系统名称和版本以及体系结构(由 os.uname() 提供),尽管包含的确切信息取决于操作系统;例如,在 Linux 上,内核版本并不是特别重要。

返回值的示例

  • linux-i586

  • linux-alpha (?)

  • solaris-2.6-sun4u

Windows 将返回以下其中一项

  • win-amd64 (AMD64 上的 64 位 Windows,也称为 x86_64、Intel64 和 EM64T)

  • win32 (所有其他 - 特别是,返回 sys.platform)

macOS 可以返回

  • macosx-10.6-ppc

  • macosx-10.4-ppc64

  • macosx-10.3-i386

  • macosx-10.4-fat

对于其他非 POSIX 平台,目前仅返回 sys.platform

sysconfig.is_python_build()

如果正在运行的 Python 解释器是从源代码构建的,并且是从其构建位置运行的,而不是从例如运行 make install 或通过二进制安装程序安装的位置运行的,则返回 True

sysconfig.parse_config_h(fp[, vars])

解析 config.h 样式的文件。

fp 是一个指向类似 config.h 文件的类文件对象。

返回一个包含名称/值对的字典。如果将一个可选字典作为第二个参数传入,则会使用该字典而不是新字典,并使用文件中读取的值进行更新。

sysconfig.get_config_h_filename()

返回 pyconfig.h 的路径。

sysconfig.get_makefile_filename()

返回 Makefile 的路径。

sysconfig 用作脚本

你可以使用 Python 的 -m 选项将 sysconfig 用作脚本

$ python -m sysconfig
Platform: "macosx-10.4-i386"
Python version: "3.2"
Current installation scheme: "posix_prefix"

Paths:
        data = "/usr/local"
        include = "/Users/tarek/Dev/svn.python.org/py3k/Include"
        platinclude = "."
        platlib = "/usr/local/lib/python3.2/site-packages"
        platstdlib = "/usr/local/lib/python3.2"
        purelib = "/usr/local/lib/python3.2/site-packages"
        scripts = "/usr/local/bin"
        stdlib = "/usr/local/lib/python3.2"

Variables:
        AC_APPLE_UNIVERSAL_BUILD = "0"
        AIX_GENUINE_CPLUSPLUS = "0"
        AR = "ar"
        ARFLAGS = "rc"
        ...

此调用将在标准输出中打印由 get_platform()get_python_version()get_path()get_config_vars() 返回的信息。