当前位置:首页 > 每日看点 > 正文内容

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

卡卷网11个月前 (12-15)每日看点178

将 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

分享给朋友:

相关文章

互联网算命,是不是个好生意?能不能赚钱?

互联网算命,是不是个好生意?能不能赚钱?

现在的年轻人也开始“迷信”了。疫情、降薪、失业、内卷……2020年或许是这届年轻人最为困难的一年,无尽的焦虑与压力之下,他们陷入了失落与迷茫之中,失去了未来的方向。如果此时有人能够为你指引出未来的道路,你是会...

电视上哪个软件可以免费看电视直播?

电视上哪个软件可以免费看电视直播?

今天给大家推荐8款免费电视端直播看剧软件,感兴趣的朋友可以下载试一试!1、超级ITV 6.04免费看电视直播,央视卫视高清秒播,还有电影电视剧少儿体育等。2、小鲸电视 1.3.1小鲸电视是一款智能电视应用,集成了多个内容来源,包括腾讯视频、...

为什么工资五千的人会一下花八九千买手机呢?

这其实是一个何不食肉糜的问题,这个问题其实很现实,越是月薪5000越需要高档手机。 前段时间看了一个纪录片,讲外卖小哥都用什么手机,结果发现绝大多数外卖小哥用的手机都是旗舰机型,有的时候宁可买二手也要买旗舰。 因为1外卖小哥对ip6...

MacOS真的比Windows流畅吗?

我现在公司配的机器,配置是绝对的大古董了惠普z230sff薄塔cpu只是个4770,没错不是4790k,4770全核睿频只有3.8g显卡更是古董,k600,已经结束驱动更新支持了,显存仅1g,跑分跑不过13代uhd核显内存是加到16g得,但...

有没有能够兼顾便携并且流畅运行各种AI应用的笔记本?求推荐?

有没有能够兼顾便携并且流畅运行各种AI应用的笔记本?求推荐?

看了下题主的描述,可以考虑「联想YOGA Air 15 Aura AI元启版」,今年9月底出的一款轻薄本,也通过了英特尔Evo严苛认证。处理器用了英特尔最新的「酷睿 Ultra 7 258V」,主要亮点就是AI性能、图形处理能力和能效,很适...

为什么神经网络可以解偏微分方程,是什么原理?

为什么神经网络可以解偏微分方程,是什么原理?

题主一直比较关心神经网络在其他科学领域的应用,比如数学、物理学还有生物学,比如AlphaFold。本次带来的这篇文章傅里叶神经网络算子解偏微分方程就是一个很有意思的方向,其实我自己去年在给美国一个客户做兼职预测数字货币期权价格的时候就用到过...

发表评论

访客

看不清,换一张

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