当前位置:首页 > 每日看点

python程序如何打包为dll,给c#程序调用?

卡卷网2年前 (2024-12-15)每日看点309

将 Python 程序打包为 DLL 提供给 C# 程序调用,可以通过以下几种方法实现。核心思路是将 Python 代码封装为共享库,供其他语言(如 C#)通过 P/Invoke 或其他方式调用。


方法一:使用 pybind11ctypes 创建共享库

1、准备 Python 代码
将你的 Python 功能封装成一个函数或模块。例如:

# example.py def add(a, b): return a + b

2、创建共享库
使用工具将 Python 文件编译为动态链接库(.dll.so)。

    • 安装依赖

pip install pybind11

    • 创建绑定代码

#include <pybind11/pybind11.h> #include <pybind11/embed.h> namespace py = pybind11; int add(int a, int b) { py::scoped_interpreter guard{}; // 启动 Python 解释器 auto add_func = py::module_::import("example").attr("add"); return add_func(a, b).cast<int>(); } PYBIND11_MODULE(my_library, m) { m.def("add", &add, "A function that adds two numbers"); }

    • 编译为 DLL: 使用 g++ 或 Visual Studio 编译:

g++ -shared -o my_library.dll -fPIC your_cpp_file.cpp -I<path_to_pybind11> -lpython<version>

3、在 C# 中调用
使用 C# 的 DllImport 调用生成的 DLL:

using System; using System.Runtime.InteropServices; class Program { [DllImport("my_library.dll", EntryPoint = "add")] public static extern int Add(int a, int b); static void Main() { int result = Add(5, 3); Console.WriteLine($"Result: {result}"); } }


方法二:使用 cython 生成 DLL

  1. 安装 Cython
    pip install cython
  2. 编写 .pyx 文件
    将 Python 函数声明为可导出的接口:

# example.pyx cdef public int add(int a, int b): return a + b


  1. 生成共享库
    使用 Cython 和编译器生成 DLL:
  • 创建 setup.py:python
    Copy code

from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize("example.pyx", language_level="3"), )

    • 编译:bash

python setup.py build_ext --inplace

    • 将生成的文件重命名为 .dll(Windows)或 .so(Linux)。


  1. 在 C# 中调用
    和方法一类似,使用 DllImport 直接调用生成的 DLL。

方法三:使用 pythonnet

pythonnet 可以在 .NET 应用中直接嵌入 Python 运行时,并通过 Py.Import 调用 Python 模块。具体步骤如下:

  1. 安装 pythonnet
    pip install pythonnet
  2. 在 C# 中使用 Python
    编写 C# 程序直接调用 Python 脚本:

using Python.Runtime; class Program { static void Main() { PythonEngine.Initialize(); using (Py.GIL()) { dynamic example = Py.Import("example"); int result = example.add(5, 3); Console.WriteLine($"Result: {result}"); } PythonEngine.Shutdown(); } }


优点:无需将 Python 代码转为 DLL,直接调用原生 Python 模块。
缺点:需要在运行时依赖完整的 Python 解释器。


方法四:使用 Boost.Python 或其他工具

如果你的项目复杂,也可以考虑使用其他专用工具,比如 Boost.Python 来生成共享库,这些工具和 pybind11 的用法类似。


对比总结

方法优点缺点
pybind11性能高、支持复杂绑定需要编写 C++ 代码,较复杂
cython简单、高效,支持静态类型优化不灵活,适合简单接口
pythonnet无需编译、调用简单依赖完整 Python 运行环境
Boost.Python强大的 C++ 支持编译复杂,适合高性能要求的场景

根据需求和项目复杂度,选择合适的方案即可。

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/4604.html

分享给朋友:

相关文章

PS有哪些实用小技巧,小白也能一学就会?

PS有哪些实用小技巧,小白也能一学就会?

不看后悔系列!本篇分享25个PS实用的技巧! 不能保证每个都能让你惊艳,但是却是我用心写出来的,希望对你有帮助。 另外我的知乎也写了接近200篇PS的技巧,超级合集分享! 我目前正在带一个PS/Ai的软件训练营,两个多月搞定两大软件的学…

有哪些正规的兼职平台?

1.阿里巴巴云客服:工作优点是时间自由,可自主选择班次,不需要去公司坐班,多做多得 2.蚂蚁云客服:同样是阿里巴巴旗下的兼职平台,工作优点是时间自由,可自主选择班次,不需要去公司坐班,多做多得。 3.菜鸟优加云客服:工作优点是时间自由,可自…

无人机真的是中国领先吗?

无人机真的是中国领先吗?

巧了这是。 捡到了一台大疆。应该是别人飞丢的。在草丛中泡过水,轴承锈死,电池鼓涨已,经没有维修价值了。但作为玩电子的,免不了要把它解剖,研究一番。那么,我们看看它的国产化率能有多少吧。图片说话: 解释一下吧。…

为什么说不懂电脑的不要碰AMD?

作为一个资深垃圾佬,说缺点前,先说优点吧AMD CPU(后续简称AU)的优点:处理器对比Intel,三级缓存更大,最明显的感知就是,网游帧数更高(5900X,7900X之类高端型号都是双CCX共享大缓存,反而不如次一点的CPU帧数更高);相…

下一个风口最可能是什么?

下一个风口最可能是什么?

肯定是一带一路了,国内没什么卷的空间了,现在国家正在给一带一路的第三世界国家建设基础设施,等交通打通之后,就是通信打通,通信打通就是贸易打通,未来我建议大家重仓小语种,阿拉伯语最值得学(也有其他小语种自己去查一带一路国家),将来去其他国家随…

用红米手机会很丢人吗?

前些日子遇到了一位快递小哥,京东的,签收 小哥年纪不算大,目测二十多岁 他的手机上全是一道道极严重的划痕,有点卡, 他开热点了,热点名就是手机型号,红米9a,我父母的同款 现在他那边操作了一会,然后又是我这边操作了一会 小哥看着我手机刷刷的…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。