Python能扩展,核心在于其设计支持“外部代码即模块”,无论用Python、C、C++或Rust编写,只要符合导入规范即可成为Python一部分;CPython用C实现并提供稳定C API,使C模块成为解释器原生运行单元;import机制抽象化模块物理形态,.py、.so或.pyd均可无缝加载;ctypes/cffi、Cython、猴子补丁及嵌入式扩展等路径丰富;工具链(如pyproject.toml、scikit-build-core)和跨平台支持成熟,共同构成开放可插拔体系。

Python能扩展,核心在于它的设计从一开始就支持“外部代码即模块”——只要你能让代码被import进来,它就是Python的一部分,不管它是用Python写的、C写的,还是C++或Rust编译出来的。
解释器本身是用C写的(CPython)
官方Python解释器CPython用C语言实现,内部暴露了一整套稳定的C API(比如PyUnicode_FromString、PyArg_ParseTuple)。这套API让C代码能直接创建Python对象、调用Python函数、管理引用计数,甚至抛出异常。正因如此,C模块不是“外部程序”,而是解释器原生可识别的运行单元。
导入机制完全抽象化
Python的import系统不关心模块物理形态:
- 一个
.py文件是模块 - 一个
.so(Linux/macOS)或.pyd(Windows)文件也是模块 - 只要它导出了符合规范的初始化函数(如
PyInit_mymodule),就能被无缝加载 - 用户写
import myext时,完全看不出背后是纯Python还是编译代码
运行时动态性支撑多种扩展方式
除了传统C扩展,Python还天然支持其他扩展路径:
立即学习“Python免费学习笔记(深入)”;
-
ctypes/cffi:无需编译,直接加载已有的
.dll/.so,调用C函数 - Cython:写类似Python的代码,加类型声明,自动转成C再编译
- 猴子补丁(monkey patching):运行时动态替换模块/类的方法(虽不推荐,但体现语言弹性)
- 嵌入式扩展:把Python解释器嵌进C/C++主程序里,反过来由C控制Python执行
社区与工具链成熟
从setuptools + setup.py,到现代的pyproject.toml + scikit-build-core,构建C扩展的流程已被高度标准化。跨平台编译、ABI兼容性(如CPython的stable ABI)、调试支持(python -X dev、gdb集成)也都逐步完善。
基本上就这些。不是Python“特意做了扩展功能”,而是它的实现方式、导入模型和生态工具共同构成了一个开放、可插拔的体系。










