打包多个.py文件为可导入的原生扩展模块需用setuptools+extension+cythonize:在setup.py中定义extension列表并调用cythonize编译,生成.so/.pyd文件供import使用;pyproject.toml无法直接声明extension,纯toml配置不可行。

打包多个.py文件为可导入的Python扩展模块
直接用 setuptools + pyproject.toml 就能完成,不需要手动写 setup.py。关键不是“打包成exe”,而是生成一个能在Python中用 import 加载的原生模块(如 mylib.cpython-311-x86_64-linux-gnu.so)。
操作要点:
- 把所有要编译的
.py文件放在同一目录下(比如src/mylib/),确保它们构成合法的包结构(含__init__.py) - 在
pyproject.toml中声明cython构建后端,并指定要编译的模块路径 -
build_ext --inplace编译后,生成的.so或.pyd文件会落在源码同级目录,可直接import mylib
示例 pyproject.toml 片段:
[build-system] requires = ["setuptools>=45", "wheel", "Cython>=3.0"] build-backend = "setuptools.build_meta" <p>[project] name = "mylib" version = "0.1.0"</p><p>[project.options.ext_modules]</p><h1>这里不是字符串,是 setuptools.Extension 实例(需在 setup.py 或 pyproject.toml 的 build hook 中构造)</h1><h1>实际推荐:用 setup.py 配合 setuptools.Extension 更可控</h1>
为什么必须用 setup.py 配合 Extension 而非纯 pyproject.toml
pyproject.toml 本身不支持直接定义 Extension 列表;Cython 编译需要显式告诉构建系统“哪些 .py 文件要转成 C 再编译”,这必须通过 setuptools.Extension 完成。纯 TOML 描述能力不够。
常见错误现象:
- 只改了
pyproject.toml却没写setup.py→pip install -e .后仍是纯 Python 模块,没提速 -
Extension的sources指向了.py文件,但没启用 Cython 编译器 → 构建时报错unknown file type '.py' - 忘记在
setup.py开头加from Cython.Build import cythonize和ext_modules=cythonize(...)
最小可用 setup.py:
from setuptools import setup, Extension
from Cython.Build import cythonize
<p>extensions = [
Extension("mylib.core", ["src/mylib/core.py"]),
Extension("mylib.utils", ["src/mylib/utils.py"]),
]</p><p>setup(
name="mylib",
ext_modules=cythonize(extensions, compiler_directives={'language_level': 3}),
)</p>
Cython 编译后性能提升不明显?检查这三点
很多用户编译完发现 timeit 测出来和原 Py 代码差不多,问题通常不在 Cython 本身,而在没突破 Python 对象层。
- 函数没加
def→cpdef或def+ 类型注解才可能被优化;纯def仍是 Python 调用协议 - 内部大量使用
list、dict、str等动态对象 → Cython 不会自动替换成 C 类型,得手动声明cdef list x或用array.array/numpy.ndarray - 调用了大量标准库函数(如
math.sqrt、os.path.join)→ 这些仍是 Python C API 调用,瓶颈没移除;应改用libc.math.sqrt或numpy向量化操作
简单提速信号:给循环变量加 cdef int i,再把 range(n) 换成 for i in range(n):(注意不是 for i in <code>range(n)),就能看到明显差异。
Windows 下编译失败常见原因
报错信息常含 LINK : fatal error LNK1181: cannot open input file 'python311.lib' 或 vcvarsall.bat not found,本质是缺失 Microsoft Visual C++ 构建工具链。
- 不要用 MinGW —— Cython 官方不保证兼容,容易链接失败或运行时崩溃
- 必须安装对应 Python 版本的
Microsoft C++ Build Tools(例如 Python 3.11 需 VS 2022 工具链) - 安装后需在命令行运行
"C:\Program Files\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64激活环境,再执行pip install -e . - 若用 Anaconda,优先走
conda install cython+conda install m2w64-toolchain,比 pip + VS 更稳
跨平台发布时,.so / .pyd 文件不可通用;Linux 编译的不能扔到 Windows 导入,反之亦然。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











