Python 制作 pyd(Windows 平台的动态链接库)
制作 Python 的 .pyd
文件(Windows 平台的动态链接库)主要通过编译 Python/C/C++ 扩展模块实现,常用于代码加密、性能优化或跨语言集成。以下是三种主流方法及详细步骤,以 Cython 为主(最常用),辅以 PyBind11 和 C-API 方案:
⚙️ 一、使用 Cython(推荐,适合 Python 代码转二进制)
步骤流程:
-
环境准备:
- 安装 Python(勾选
Add to PATH
)。 - 安装 Cython:
pip install cython
- 安装 C 编译器(Windows 必装):
- Visual Studio 2019+:勾选 “使用 C++ 的桌面开发” 和 MSVC 编译器 。
- 安装 Python(勾选
-
编写代码:
- 创建 Python 文件(如
example.py
):def hello(name): print(f"Hello, {name}!")
- 或使用 Cython 语法(
.pyx
文件,支持静态类型加速)。
- 创建 Python 文件(如
-
创建编译脚本(
setup.py
):from setuptools import setup from Cython.Build import cythonize setup( name="example", ext_modules=cythonize("example.py"), # 或 "example.pyx" )
-
编译生成
.pyd
:python setup.py build_ext --inplace
- 生成文件:
example.cp312-win_amd64.pyd
→ 重命名为example.pyd
。
- 生成文件:
-
调用测试:
import example example.hello("World") # 输出 "Hello, World!"
⚡ 二、使用 PyBind11(适合 C++ 代码集成)
适用场景:需将 C++ 函数/类暴露给 Python
。
-
安装 PyBind11:
pip install pybind11
-
编写 C++ 文件(
example.cpp
):#include <pybind11/pybind11.h> namespace py = pybind11; void say_hello(const std::string &name) { std::cout << "Hello, " << name << "!" << std::endl; } PYBIND11_MODULE(example, m) {m.def("say_hello", &say_hello);}
-
配置
setup.py
:from setuptools import setup, Extension import pybind11 ext_modules = [ Extension( 'example', ['example.cpp'], include_dirs=[pybind11.get_include()], language='c++', ), ] setup(ext_modules=ext_modules)
-
编译与调用:
python setup.py build_ext --inplace # 生成 example.pyd
⚙️ 三、使用 Python C-API(底层控制,灵活性高)
步骤:
-
编写 C 代码(
example.c
):#include <Python.h> static PyObject* hello(PyObject* self, PyObject* args) { const char* name; if (!PyArg_ParseTuple(args, "s", &name)) return NULL; printf("Hello, %s!\n", name); Py_RETURN_NONE; } static PyMethodDef methods[] = {{"hello", hello, METH_VARARGS, ""}, {NULL, NULL, 0, NULL}}; static PyModuleDef module = {PyModuleDef_HEAD_INIT, "example", NULL, -1, methods}; PyMODINIT_FUNC PyInit_example(void) { return PyModule_Create(&module); }
-
编译配置(
setup.py
):from setuptools import setup, Extension setup(ext_modules=[Extension('example', sources=['example.c'])])
-
编译命令同上
。
⚠️ 四、常见问题与注意事项
-
环境配置:
- 编译器缺失:安装 VS Build Tools 或 MinGW。
- 头文件丢失:确认 Python 安装路径下的
include
和libs
存在。
-
文件命名规则:
.pyd
文件名必须与模块名一致(如example.pyd
→import example
)。
-
加密与反编译:
.pyd
为二进制文件,无法直接反编译,但需防范动态调试(配合代码混淆更安全)。
-
跨平台兼容:
.pyd
仅适用于 Windows,Linux 需编译为.so
文件(方法类似)。
-
依赖处理:
- 若模块依赖第三方库(如 NumPy),在
setup.py
中添加include_dirs=[np.get_include()]
。
- 若模块依赖第三方库(如 NumPy),在
💎 总结建议
- 首选 Cython:适合纯 Python 项目快速生成
.pyd
,兼顾易用性与性能。 - C++ 项目选 PyBind11:简化 C++ 到 Python 的绑定流程。
- 调试技巧:若编译失败,检查错误日志中的
C/C++
语法或路径问题,确保环境变量配置正确。
通过上述方法,你可将核心代码编译为 .pyd
,显著提升执行速度并保护源码逻辑。