CPython sysconfig 模块深度解析:配置变量、安装路径方案与命令行实战
【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython
sysconfig是 CPython 标准库中专用于“读取 Python 自身配置信息”的模块,从 3.2 版本起随解释器内置提供。它把构建 CPython 时生成的Makefile与pyconfig.h中的全部编译/安装信息暴露为可供程序查询的字典,并定义了 Linux/macOS/Windows 上包安装器(如pip、setuptools、venv)赖以确定文件落点的九套“安装路径方案”。读完本文,你将掌握get_config_vars/get_config_var查询编译期变量、get_paths/get_path推算任意平台与任意前缀下的真实安装目录、user/home/prefix/venv 各方案的区别,以及python -m sysconfig命令行输出与--generate-posix-vars内部机制,并能在自己的构建脚本、打包工具或自动化工具链中正确使用这些 API。
一、模块定位与总体框架
sysconfig提供的核心能力有两大类:
- 配置变量(configuration variables):一份 Python 发行版包含构建解释器本体与第三方 C 扩展(如由
setuptools编译的扩展)所必需的Makefile与pyconfig.h头文件。sysconfig将这两个文件中的全部变量聚合到一个字典中,通过get_config_vars()或get_config_var(name)暴露出来。需要注意:在 Windows 上这一集合要小得多(Windows 安装包不携带 POSIX 风格的构建 Makefile,仅有一小组派生变量,见 Lib/sysconfig/init.py 中_init_non_posix的实现)。 - 安装路径(installation paths):Python 依据平台与安装选项使用不同的安装方案(scheme)。这些方案以基于
os.name的唯一标识存储于sysconfig内部,包安装器据此决定把文件复制到哪里。
在 CPython 源码树中,sysconfig在 3.13 之后演进为一个包(package),由两个模块组成:
- Lib/sysconfig/init.py:公开 API、安装方案表
_INSTALL_SCHEMES、配置变量初始化逻辑; - Lib/sysconfig/main.py:
python -m sysconfig命令行入口、Makefile 解析器_parse_makefile与--generate-posix-vars生成逻辑。
本文档所对应的仓库为 CPython 主分支(Include/patchlevel.h 中版本为PY_VERSION "3.16.0a0"),文中以该实现为准。
二、配置变量:get_config_vars 与 get_config_var
2.1 函数签名与行为
>>> 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++']| 函数 | 说明 |
|---|---|
get_config_vars(*args) | 无参数时返回当前平台相关的全部配置变量字典;带参数时,依次在每个参数上查表,返回对应值列表;某个参数查不到时对应位置返回None |
get_config_var(name) | 返回单个变量name的值,等价于get_config_vars().get(name);name不存在时返回None |
2.2 底层数据来源(源码视角)
从源码看,配置变量字典的构建流程非常清晰(Lib/sysconfig/init.py):
- POSIX 平台:
_init_posix(vars)直接合并_get_sysconfigdata()返回的build_time_vars。这些变量来自构建期生成的_sysconfigdata_{abiflags}_{sys.platform}_{multiarch}模块——它在make构建/安装时由Lib/sysconfig/__main__.py中的_generate_posix_vars()根据实际Makefile与pyconfig.h解析生成(包括_parse_makefile对PY_CFLAGS/PY_LDFLAGS/PY_CPPFLAGS去掉PY_前缀的改名处理,以及parse_config_h对#define/#undef的解析)。模块名可通过_PYTHON_SYSCONFIGDATA_NAME环境变量覆盖。 - Windows(nt):
_init_non_posix(vars)不再读 Makefile,而是动态计算一组小集合:LIBDEST/BINLIBDEST/INCLUDEPY、EXT_SUFFIX、SOABI、Py_DEBUG、Py_GIL_DISABLED等,并通过_sysconfig.config_vars()获取 ABI 相关值。 - 通用注入:无论哪个平台,
_init_config_vars()都会往字典中写入一组“标准化变量”,这些变量正是安装路径模板_INSTALL_SCHEMES中占位符的取值来源,包括:
| 变量 | 含义 | 取值示例(POSIX 安装) |
|---|---|---|
prefix/exec_prefix | 运行时前缀(sys.prefix/sys.exec_prefix规范化) | /usr/local |
base/platbase | 前缀的规范化别名,路径模板中大量引用 | /usr/local |
installed_base/installed_platbase | 构建时的安装目标前缀(对应sys.base_prefix),用于 stdlib/头文件定位 | /usr/local |
py_version/py_version_short/py_version_nodot | 完整版本号 /MAJOR.MINOR/ 无点版本号 | 3.16.0a0/3.16/316 |
py_version_nodot_plat | 平台无点版本(Windows 取sys.winver) | 316 |
projectbase | 当前项目根目录(源码构建时为源码根) | 构建目录或/usr/local |
platlibdir | 平台库目录名(sys.platlibdir) | lib |
implementation/implementation_lower | 实现名(固定为Python) | Python/python |
abiflags | ABI 标志(sys.abiflags) | 空串或t等 |
abi_thread | 自由线程构建标记,Py_GIL_DISABLED为真时为t,否则为空 | ''或't' |
userbase | 用户基目录(见下文_getuserbase) | ~/.local |
srcdir | 源码目录绝对路径 | /path/to/cpython |
INSTALL_*、LIBDIR、LDFLAGS、SOABI等 | 直接继承自 Makefile/pyconfig.h | — |
2.3 线程安全与缓存失效
为保证并发安全与性能,_CONFIG_VARS字典由_CONFIG_VARS_LOCK(可重入锁)保护,且在初始化完成后采用“无锁快速路径”(Lib/sysconfig/init.py 中get_config_vars的实现)。如果运行期间sys.prefix或sys.exec_prefix发生变化(例如某些嵌入式场景),缓存会被检测到失效并重新初始化(对应源码中 GH-126789 的注释)。因此,跨解释器/跨环境长期复用的进程应留意:配置变量是跟随当前解释器前缀惰性缓存的。
另外,并非所有值都是字符串:parse_config_h会把非字符串的#define值尝试转成int,但MACOSX_DEPLOYMENT_TARGET、IPHONEOS_DEPLOYMENT_TARGET这类值会通过_ALWAYS_STR集合被强制保留为字符串。
三、安装路径方案(Installation schemes)
Python 使用一套随平台与安装选项变化的“安装方案”,每条方案下又包含若干具有唯一标识的路径。方案与路径均由包安装器消费,以决定文件复制目标。所有方案的原始模板统一存放在_INSTALL_SCHEMES字典中(Lib/sysconfig/init.py 第 28 行起),模板内使用{变量}占位符,_expand_vars会先并入get_config_vars()的返回值,再做os.path.expanduser与os.path.normpath展开。
3.1 九种方案一览
Python 目前支持九种安装方案:
- posix_prefix:面向 Linux、macOS 等 POSIX 平台的默认方案;Python 或其组件被安装时默认采用。
- posix_home:使用home选项(
--home)安装到 POSIX 平台时的方案,路径位于某个特定 home 前缀之下。 - posix_user:使用user选项(
--user)时的 POSIX 方案,路径位于用户主目录(site.USER_BASE)下。 - posix_venv:POSIX 上 Python 虚拟环境(venv) 的方案,默认与posix_prefix相同。
- nt:Windows 方案,也是 Windows 下安装 Python 或其组件时的默认方案。
- nt_user:Windows 使用user选项时的方案。
- nt_venv:Windows 上虚拟环境的方案,默认与nt相同。
- venv:根据运行平台,取值来自posix_venv或nt_venv的方案(实为别名,见 Lib/sysconfig/init.py 第 103-107 行:
os.name == 'nt'时令venv = nt_venv,否则令venv = posix_venv)。 - osx_framework_user:macOS 使用user选项时的方案(适用于 Framework 构建)。
之所以单独维护*_venv一套模板,源码注释给出了明确动机(Lib/sysconfig/init.py 第 62-78 行):下游发行版可能修改默认的posix_prefix/nt布局(例如改变 site-packages 目录),这会让get_default_scheme()/get_paths()的返回值不再适用于虚拟环境引导场景。发行版被鼓励保持*_venv模板不变,供 virtualenv 等工具引导虚拟环境时使用。
3.2 八种路径标识
每个方案内部由若干路径组成,每条路径都有唯一标识。Python 目前使用以下路径:
| 路径标识 | 用途 |
|---|---|
stdlib | 存放非平台相关的标准库文件的目录 |
platstdlib | 存放平台相关的标准库文件的目录 |
platlib | 站点级、平台相关文件的目录 |
purelib | 站点级、平台无关(纯 Python)文件的目录 |
include | CPython C-API 的非平台相关头文件目录 |
platinclude | CPython C-API 的平台相关头文件目录 |
scripts | 脚本文件目录 |
data | 数据文件目录 |
路径名全集由模块级常量_SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include', 'scripts', 'data')给出(Lib/sysconfig/init.py 第 172-173 行),get_path_names()直接返回该元组。注意在源码树内构建时,POSIX 方案还会临时附加headers键并重定向include/platinclude到源码树,这解释了源码构建与安装后查询路径的差异。
四、User scheme:无全局写权限时的最便捷方案
user 方案专为没有全局site-packages写权限、或不想装进全局目录的用户设计。文件被安装到site.USER_BASE(下文写作{userbase})的子目录中,纯 Python 模块与扩展模块安装在同一位置(即site.USER_SITE)。
{userbase}的取值由_getuserbase()(Lib/sysconfig/init.py 第 114-136 行,Lib/site.py 中有同步副本)决定:
- 优先取环境变量
PYTHONUSERBASE; - Windows 取
%APPDATA%\Python; - macOS Framework 构建取
~/Library/<framework>/3.16; - 其余取
~/.local; - Emscripten/iOS/WASI 等无主目录平台返回
None,此时 user 方案整个不注册。
4.1 posix_user
| 路径 | 安装目录 |
|---|---|
| stdlib | {userbase}/lib/python{X.Y} |
| platstdlib | {userbase}/lib/python{X.Y} |
| platlib | {userbase}/lib/python{X.Y}/site-packages |
| purelib | {userbase}/lib/python{X.Y}/site-packages |
| include | {userbase}/include/python{X.Y} |
| scripts | {userbase}/bin |
| data | {userbase} |
实际模板中还包含abi_thread占位符,自由线程构建(Py_GIL_DISABLED)下路径会带t后缀,避免与默认 GIL 构建相互覆盖。
4.2 nt_user
| 路径 | 安装目录 |
|---|---|
| stdlib | {userbase}\Python{XY} |
| platstdlib | {userbase}\Python{XY} |
| platlib | {userbase}\Python{XY}\site-packages |
| purelib | {userbase}\Python{XY}\site-packages |
| include | {userbase}\Python{XY}\Include |
| scripts | {userbase}\Python{XY}\Scripts |
| data | {userbase} |
({XY}为无点版本号,如316。)
4.3 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/python{X.Y} |
| scripts | {userbase}/bin |
| data | {userbase} |
osx_framework_user 仅当sys.platform == 'darwin'且sys._framework非空(即 Framework 构建)时由_get_preferred_schemes()选用(Lib/sysconfig/init.py 第 280-298 行)。
五、Home scheme:个人模块“藏匿处”
home 方案的思想是构建并维护一份私有的 Python 模块集合。方案名称源自 Unix 中“home”目录的概念——Unix 用户常把自己的主目录排布得像/usr/或/usr/local/。该方案对任何操作系统、任何目标都可用(即使本机运行的不是目标平台也可为目标指定该方案)。
5.1 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} |
注意 home 方案下纯 Python 与扩展模块共用一个lib/python,且无版本号子目录。{home}在get_paths(scheme='posix_home', vars={'home': ...})中由调用方以vars传入,模块本身不维护默认的 home 值。
六、Prefix scheme:为“跨安装”而生
prefix 方案适用于:用某一份 Python 执行构建/安装(即运行 setup 脚本),却希望把模块装进**另一份 Python 安装(或看起来像另一份安装的目录树)**的第三方模块目录中。正因为这种需求少见,文档也建议优先考虑 user 与 home 方案。不过至少有两个已知场景会让 prefix 方案非常有用:
- 发行版前缀差异:许多 Linux 发行版把 Python 装在
/usr(而非更传统的/usr/local),因为此时 Python 属于“系统组件”而非本地附加软件。但如果你从源码编译 Python 模块,通常希望它们进入/usr/local/lib/pythonX.Y/site-packages,而非/usr/lib/pythonX.Y/site-packages。 - 网络文件系统:写入远程目录用的名字与读取时不同。例如解释器以
/usr/local/bin/python访问、在/usr/local/lib/pythonX.Y中查找模块,但文件却必须写到/mnt/{@server}/export/lib/pythonX.Y。
在命令行构建层面,前缀通过configure --prefix=PREFIX/--exec-prefix=EPREFIX设定,运行期对应sys.prefix/sys.exec_prefix(参见 Doc/using/configure.rst)。
6.1 posix_prefix(POSIX 默认方案)
| 路径 | 安装目录 |
|---|---|
| stdlib | {prefix}/lib/python{X.Y} |
| platstdlib | {prefix}/lib/python{X.Y} |
| platlib | {prefix}/lib/python{X.Y}/site-packages |
| purelib | {prefix}/lib/python{X.Y}/site-packages |
| include | {prefix}/include/python{X.Y} |
| platinclude | {prefix}/include/python{X.Y} |
| scripts | {prefix}/bin |
| data | {prefix} |
实际模板中 stdlib 使用{installed_base}/{platlibdir}/python{X.Y}{abi_thread},即“构建目标前缀 + 平台库目录名 + 版本/ABI 后缀”的组合,保证与运行解释器一致。
6.2 nt(Windows 默认方案)
| 路径 | 安装目录 |
|---|---|
| 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} |
七、安装路径查询 API
>>> import sysconfig >>> sysconfig.get_path('stdlib') # 当前平台默认方案 '/usr/local/lib/python3.16' >>> sysconfig.get_paths() # 当前平台默认方案的完整字典 >>> sysconfig.get_path('purelib', scheme='nt') # 显式指定 Windows 方案7.1 各函数说明
| 函数 | 说明 |
|---|---|
get_scheme_names() | 返回当前sysconfig支持的全部方案名的元组(排序后) |
get_default_scheme() | 返回当前平台的默认方案名。3.10 起公开(此前叫_get_default_scheme(),属实现细节);3.11 起,当 Python 运行于虚拟环境时返回venv方案 |
get_preferred_scheme(key) | 按布局关键字返回首选方案。key必须为"prefix"、"home"、"user"之一;返回值是get_scheme_names()所列方案,可直接传给get_paths等接受scheme参数的函数。3.10 新增;3.11 起虚拟环境中且key="prefix"时返回venv |
_get_preferred_schemes() | 返回当前平台首选方案映射(prefix/home/user→ 方案名)。解释器实现者与发行版可在此扩展:可向模块级_INSTALL_SCHEMES添加自定义方案并修改本函数,例如为系统包管理器与语言包管理器提供不同方案,使两者的安装互不混同。终端用户不应使用本函数,应改用get_default_scheme与get_preferred_scheme。3.10 新增 |
get_path_names() | 返回当前支持的全部路径名的元组 |
get_path(name, scheme=None, vars=None, expand=True) | 返回路径name在方案scheme下对应的安装目录(不做变量展开也可)。细节见下 |
get_paths(scheme=None, vars=None, expand=True) | 返回某安装方案的全部安装路径字典。scheme缺省用当前平台默认方案;vars缺省合并get_config_vars()后展开;expand=False时不做变量展开(返回原始模板);scheme不存在时抛KeyError |
7.2 展开语义与参数细节
sysconfig为每个平台、每个路径名都存有待展开的模板。例如nt方案的stdlib模板是{base}/Lib(实际存储为{installed_base}/Lib)。get_path/get_paths使用get_config_vars()返回的变量做展开;由于每个平台的变量都有默认值,直接调用即可拿到“平台默认值”。
name必须是get_path_names()返回值之一,否则对应键不存在时会抛KeyError;scheme缺省使用当前平台默认方案;提供时必须属于get_scheme_names();vars若提供,必须是一个字典,其内容会覆盖/合并到get_config_vars()返回的字典上(在_expand_vars中通过_extend_dict(vars, get_config_vars())实现,调用方字典优先级更高);expand=False时直接返回_INSTALL_SCHEMES[scheme]中的原始模板字符串,不做{...}替换(Lib/sysconfig/init.py 第 489-498 行)。
典型用法:查询 venv 安装目标的脚本路径sysconfig.get_path('scripts', scheme='venv')——这正是 Lib/venv/init.py 内部创建bin/Scripts目录时使用的模式。
八、其他工具函数
| 函数 | 说明 |
|---|---|
get_python_version() | 以字符串返回MAJOR.MINOR版本号,等价于'%d.%d' % sys.version_info[:2](源码直接返回_PY_VERSION_SHORT,如3.16) |
get_platform() | 返回标识当前平台的字符串,主要用于区分平台相关的构建目录与二进制发行版。通常含 OS 名、版本与架构(来源为os.uname()),但具体内容取决于操作系统,例如 Linux 上内核版本并不重要 |
is_python_build() | 当前解释器由源码构建且正从构建位置运行时返回True;若来自make install或二进制安装器则返回False。判定依据是构建根下是否存在Modules/Setup或Modules/Setup.local(见is_python_build源码) |
parse_config_h(fp, vars=None) | 解析config.h风格文件:fp是指向该类文件的类文件对象;返回名称/值字典;若传入第二参数 dict,则直接在其中更新并返回。实现用正则匹配#define NAME VALUE与/* #undef NAME */,并对无引号整数值做int()转换 |
get_config_h_filename() | 返回pyconfig.h的路径:源码构建时为构建根(Windows 为PC子目录)下的pyconfig.h;安装后为platinclude路径下的同名文件 |
get_makefile_filename() | 返回Makefile的路径:源码构建时为项目根下Makefile;安装后为stdlib/config-{X.Y}{abiflags}[-multiarch]/Makefile。支持_PYTHON_PROJECT_BASE环境变量用于交叉编译时取目标 Makefile |
8.1 get_platform() 的返回值示例
- Linux:
linux-x86_64、linux-aarch64 - Solaris:
solaris-2.6-sun4u - Windows:
win-amd64(AMD64 上的 64 位 Windows,即 x86_64/Intel64/EM64T)、win-arm64(ARM64/AArch64 上的 64 位 Windows)、win32(其余情况,直接返回sys.platform) - 其他 POSIX 系:
macosx-15.5-arm64、macosx-26.0-universal2(Apple Silicon 或 Intel 上的 macOS)、android-24-arm64_v8a(Android API 24 的 64 位 ARM) - 其余非 POSIX 平台:目前直接返回
sys.platform
从源码看,get_platform()对 Android 有专门的 ABI 归一化(aarch64→arm64_v8a、armv7l/armv8l→armeabi_v7a、x86_64不变等,Lib/sysconfig/init.py 第 703-721 行),Solaris 会换算 SunOS 版本号并附带 32/64 位标记,AIX 则委托_aix_support.aix_platform()。交叉编译时可用_PYTHON_HOST_PLATFORM环境变量显式指定目标平台。
九、命令行用法
sysconfig可直接以脚本方式配合 Python 的-m选项运行:
$ 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" ...该命令向标准输出打印以下四类信息(对应四个公开 API):
Platform——get_platform()的返回值;Python version——get_python_version()的返回值;Current installation scheme——get_default_scheme()的返回值;Paths——get_paths()返回的全部路径;Variables——get_config_vars()返回的全部配置变量。
底层实现见 Lib/sysconfig/main.py 的_main():依次打印上述字段后,把get_config_vars()按键名排序逐条以键 = "值"格式输出。若运行在源码构建目录中(sysconfig.is_python_build()为真),打印出的include/platinclude会指向源码树内的Include目录而非安装布局。
命令行还隐藏着一个供构建系统内部使用的开关--generate-posix-vars:它调用_generate_posix_vars()解析当前 Makefile 与 pyconfig.h,生成_sysconfigdata_*.py(build_time_vars字典)、同名.json文件以及pybuilddir.txt。这是 CPython 构建/安装流程的一环,普通用户通常不需要手工调用。
9.1 在真实环境中的快速自检
你可以用如下片段快速核对自己环境的关键事实,判定前缀方案是否被发行版或虚拟环境改动:
>>> import sys, sysconfig >>> sys.prefix, sys.base_prefix # 是否处于虚拟环境 >>> sysconfig.get_default_scheme() # 当前默认方案(venv 内应为 "venv") >>> sysconfig.get_preferred_scheme('user') >>> sysconfig.get_path('purelib') # 当前环境实际站点包目录 >>> sysconfig.get_path('purelib', scheme='posix_user') # 用户方案站点包目录 >>> sysconfig.get_path('purelib', vars={'base': '/opt/test'}) # 自定义前缀 >>> sysconfig.get_config_var('EXT_SUFFIX') # C 扩展后缀,如 '.cpython-316-x86_64-linux-gnu.so'EXT_SUFFIX、SOABI等变量是distutils/setuptools编译扩展时决定输出文件名的关键依据,LDFLAGS/LDSHARED等则用于链接阶段——这些都是 Lib/test/test_sysconfig.py 中反复验证的查询场景。
十、方案、路径与变量的协同关系小结
综合以上内容,可以把sysconfig的运作归纳为一条清晰的链路:
- 构建期:
configure/make生成Makefile与pyconfig.h,构建脚本以--generate-posix-vars把它们浓缩成_sysconfigdata模块; - 运行期:
get_config_vars()惰性加载该模块(Windows 走_init_non_posix),注入prefix、py_version_short、userbase、abi_thread等展开所需变量并做线程安全缓存; - 路径解析:
get_paths(scheme)以_INSTALL_SCHEMES[scheme]中的{占位符}模板为基础,叠加os.path.expanduser/os.path.normpath展开出最终绝对路径; - 消费方:
venv依据venv方案创建虚拟环境目录结构,pip/setuptools依据默认/user方案落盘,发行版可通过改写_INSTALL_SCHEMES与_get_preferred_schemes()定制布局而无需改动解释器核心代码。
如果你需要为某个自定义安装布局提供新的方案,正确姿势是:在_INSTALL_SCHEMES中新增一条模板,并按平台在_get_preferred_schemes()中登记它;对外仍以get_default_scheme()/get_preferred_scheme(key)作为唯一入口,避免依赖_get_preferred_schemes()这类内部实现细节。
十一、进一步阅读
- Lib/sysconfig/init.py:方案模板、变量初始化与全部公开 API 的实现
- Lib/sysconfig/main.py:命令行输出与
--generate-posix-vars的 Makefile 解析逻辑 - Lib/site.py:
USER_BASE/USER_SITE/ENABLE_USER_SITE的运行期语义与 user 方案的消费方 - Lib/venv/init.py:虚拟环境如何基于
scheme='venv'计算目录 - Lib/test/test_sysconfig.py:覆盖方案表一致性、venv/nt/posix 路径换算、ABI 变量与平台字符串的大量回归测试
- Include/patchlevel.h:当前仓库对应的 CPython 版本号
- Doc/using/configure.rst:
--prefix/--exec-prefix等与安装前缀相关的配置选项说明
【免费下载链接】cpythonThe Python programming language项目地址: https://gitcode.com/GitHub_Trending/cp/cpython
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考