当前位置: 首页 > news >正文

Python 制作 pyd(Windows 平台的动态链接库)

制作 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,显著提升执行速度并保护源码逻辑。

http://www.dtcms.com/a/266975.html

相关文章:

  • 力扣:70. 爬楼梯
  • [Terence Tao访谈] 无限 | 关注模型 | 矢量场 | 策略性“作弊” | Lean
  • 【Prometheus 】通过 Pushgateway 上报指标数据
  • 408第三季part1 - 操作系统 - 输入输出管理
  • pyproject.toml 有什么作用呢?
  • Java对象哈希值深度解析
  • vue/微信小程序/h5 实现react的boundary
  • 汽车功能安全概念阶段开发【相关项定义HARA】2
  • 【Mysql系列】Mysql 多级隔离级别揭秘
  • 使用Python绘制图片拆分工具
  • 风平浪静、无事发生
  • 论文解读:《DeepGray:基于灰度图像和深度学习的恶意软件分类方法》
  • OneCode 智能化UI布局与定位:注解驱动的视觉编排艺术
  • 图灵完备之路(数电学习三分钟)----数据选择器与总线
  • 使用alist+RaiDrive+webdav将百度夸克网盘变为本地电脑磁盘方法教程
  • 《人生顶层设计》读书笔记7
  • J20250704 算法题5道
  • css-多条记录,自动换行与自动并行布局及gap兼容
  • 智能私域运营中枢:从客户视角看 SCRM 的体验革新与价值重构
  • $route
  • Dash 安装使用教程
  • 浅层神经网络:原理与Python实现
  • Golang服务端处理Unity 3D游戏地图与碰撞的详细实现
  • docker运行的一些常用命令
  • SAP入门到放弃系列-流程订单-Process Instruction Category-自定义设置
  • QNetworkAccessManager异步请求有时候操作UI控件崩溃问题
  • ASP.NET MVC架构 路由提取
  • 第2期汽车模型数字工程沙龙,世冠科技分享汽车控制系统开发国产应用
  • 飞凌OK3568核心板与FPGA之间PCIe通信测试操作手册
  • FPGA实现40G网卡NIC,基于PCIE4C+40G/50G Ethernet subsystem架构,提供工程源码和技术支持