使用Python生成pyd(Windows动态链接库)文件的三种方法

 更新时间:2025年07月06日 09:23:57   作者:CATTLECODE  
制作 Python 的 .pyd 文件(Windows 平台的动态链接库)主要通过编译 Python/C/C++ 扩展模块实现,常用于​​代码加密​​,​​性能优化​​或​​跨语言集成​​,下面我们看看这三种方法的具体实现吧

制作 Python 的 .pyd 文件(Windows 平台的动态链接库)主要通过编译 Python/C/C++ 扩展模块实现,常用于​​代码加密​​、​​性能优化​​或​​跨语言集成​​。以下是三种主流方法及详细步骤,以 Cython 为主(最常用),辅以 PyBind11 和 C-API 方案:

一、使用 Cython(推荐,适合 Python 代码转二进制)

​​步骤流程​​

1.​​环境准备​​:

安装 Python(​​勾选 Add to PATH​​)。

安装 Cython:

pip install cython

安装 C 编译器(Windows 必装):

​Visual Studio 2019+​​:勾选 “使用 C++ 的桌面开发” 和 ​​MSVC 编译器​​ 。

2.​​编写代码​​:

创建 Python 文件(如 example.py):

def hello(name): 
print(f"Hello, {name}!")

或使用 Cython 语法(.pyx 文件,支持静态类型加速)。

3.​​创建编译脚本(setup.py)​​:

from setuptools import setup from Cython.Build 
import cythonize 
setup( name="example", ext_modules=cythonize("example.py"), 
# 或 "example.pyx" )

4.​​编译生成 .pyd​​

python setup.py build_ext --inplace

生成文件:example.cp312-win_amd64.pyd → 重命名为 example.pyd

​5.调用测试​​:

import example 
example.hello("World") 
# 输出 "Hello, World!"

二、使用 PyBind11(适合 C++ 代码集成)

​​适用场景​​:需将 C++ 函数/类暴露给 Python

1.​​安装 PyBind11​​:

pip install pybind11

2.​​编写 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);
 }

3.​​配置 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)

4.​​编译与调用​​:

python setup.py build_ext --inplace # 生成 example.pyd

三、使用 Python C-API(底层控制,灵活性高)

​​步骤​​:

1.​​编写 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); }

2.​​编译配置(setup.py)​​:

from setuptools import setup, Extension 
setup(ext_modules=[Extension('example', sources=['example.c'])])

3.​​编译命令同上​​ 

四、常见问题与注意事项

1.​​环境配置​​:

​​编译器缺失​​:安装 VS Build Tools 或 MinGW。

​​头文件丢失​​:确认 Python 安装路径下的 include 和 libs 存在。

2.​​文件命名规则​​:

.pyd 文件名必须与模块名一致(如 example.pyd → import example)。

3.​​加密与反编译​​:

.pyd 为二进制文件,​​无法直接反编译​​,但需防范动态调试(配合代码混淆更安全)。

4.​​跨平台兼容​​:

.pyd 仅适用于 Windows,Linux 需编译为 .so 文件(方法类似)。

5.​​依赖处理​​:

若模块依赖第三方库(如 NumPy),在 setup.py 中添加 include_dirs=[np.get_include()] 。

总结建议

  • ​首选 Cython​​:适合纯 Python 项目快速生成 .pyd,兼顾易用性与性能。
  • ​C++ 项目选 PyBind11​​:简化 C++ 到 Python 的绑定流程。
  • ​调试技巧​​:若编译失败,检查错误日志中的 C/C++ 语法或路径问题,确保环境变量配置正确。

通过上述方法,你可将核心代码编译为 .pyd,显著提升执行速度并保护源码逻辑。

到此这篇关于使用Python生成pyd(Windows动态链接库)文件的三种方法的文章就介绍到这了,更多相关Python生成pyd文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Python中高阶函数(map,filter,reduce,sorted)的使用

    详解Python中高阶函数(map,filter,reduce,sorted)的使用

    高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数。本文为大家详细讲解了Python中常用的四个高阶函数,感兴趣的可以了解一下
    2022-04-04
  • Python Pickling 和 Unpickling 的区别

    Python Pickling 和 Unpickling 的区别

    Python中的Pickling和Unpickling是与数据序列化和反序列化相关的重要概念,本文主要介绍了Python Pickling和Unpickling的区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • python 如何做一个识别率百分百的OCR

    python 如何做一个识别率百分百的OCR

    最近在做游戏自动化(测试),也就是游戏脚本了。主要有以下几个需求识别率百分百、速度要快、模型要小,本文就来着手实现它
    2021-05-05
  • 详解如何在Python中实现遗传算法

    详解如何在Python中实现遗传算法

    遗传算法是一种模拟自然进化过程与机制来搜索最优解的方法,这篇文章主要为大家介绍了如何在Python中实现遗传算法,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Python数据可视化Pyecharts库的使用教程

    Python数据可视化Pyecharts库的使用教程

    pyecharts是一个用于生成echarts图表的类库。echarts是百度开源的一个数据可视化库,用echarts生成的图可视化效果非常棒。使用pyechart库可以在python中生成echarts数据图。本文将详细介绍一下Pyecharts库的使用,需要的可以参考一下
    2022-02-02
  • python实现文本进度条 程序进度条 加载进度条 单行刷新功能

    python实现文本进度条 程序进度条 加载进度条 单行刷新功能

    这篇文章主要介绍了python实现文本进度条 程序进度条 加载进度条 单行刷新功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Python实现数据可视化看如何监控你的爬虫状态【推荐】

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    今天主要是来说一下怎么可视化来监控你的爬虫的状态。文中通过实例代码给大家分析了Python实现数据可视化看如何监控你的爬虫状态,感兴趣的朋友一起看看吧
    2018-08-08
  • python使用matplotlib绘制折线图的示例代码

    python使用matplotlib绘制折线图的示例代码

    这篇文章主要介绍了python使用matplotlib绘制折线图的示例代码,帮助大家更好的利用matplotlib绘制图形,感兴趣的朋友可以了解下
    2020-09-09
  • Python如何加载模型并查看网络

    Python如何加载模型并查看网络

    这篇文章主要介绍了Python如何加载模型并查看网络,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • pytorch中tensor张量数据类型的转化方式

    pytorch中tensor张量数据类型的转化方式

    今天小编就为大家分享一篇pytorch中tensor张量数据类型的转化方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12

最新评论