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

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

卡卷网1年前 (2024-12-15)每日看点204

将 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

分享给朋友:

相关文章

200+ 工具,这个网站堪称最强

200+ 工具,这个网站堪称最强

作为一个乱七八糟什么都懂一点的电脑小白,日常经常被别人增加些临时任务,比如PDF转Word,提取视频里的音频,图片加个边框。之前,电脑里安装了不少这类的软件,虽然能满足要求,但装的多了,总感觉电脑卡卡的。最近发现了一个超强的在线工具网站,首...

WordPress建设的网站为什么不推荐国内机房?

WordPress建设的网站为什么不推荐国内机房?

我劝大家不要用WordPress做国内网站,不要用国内机房的主机。原因如下:1 WordPress 很多主题和插件都是国外开发的,特别是付费版本,需要联网验证,或者远程写入。国内机房的虚拟主机和服务器大概率会屏蔽或者阻断这些连接,无法完成任...

4499 元起的荣耀Magic7 系列实际使用体验怎么样,值得入手吗?

全是软文。。。。。。不过我买了,标准版。为什么买荣耀:屏幕看着舒服,玩游戏选择大屏,超声波指纹解锁。其它,系统、续航、充电、拍照,不是最强,但均衡下来短板都不是很短。其它米OV,IQ、一加,都看了,预算有限,米OV的小屏不感兴趣,OPPO硬...

提升自己最快的方式是什么?

提升自己最快的方式是什么?

1.稻盛和夫说过:“改变自己最快的方法就是做自己害怕的事,不敢做的事,认为自己做不到,觉得不可能的事。如果在自己的舒适区待久了,就会丧失斗志,如果想快速的改变,可以坚持去做一些对自己有益的事。2.早睡早起,坚持运动保持旺盛的精力,人生拼到最...

网易云音乐上看到过最触动的热评是什么?

网易云音乐上看到过最触动的热评是什么?

1.“昨天晚上洗澡的时候,我忘记拿毛巾了,喊了声妈妈帮我拿下毛巾,正当我伸出左手准备接毛巾的时候,我愣了一下,又换了右手。”希望你永远不会听懂这句话,永远都不要懂。——网易云热评《关键词》2.小时候跟着父亲去城里卖西瓜,害怕同学会看到我,就...

PHP承载百万/天 访问量需要用到什么技术?

当年做一个百万PV的商城,也不过是两台2c4g的阿里云虚机罢了(其实一台就够,另外一台主要的逼着大家一定开发的时候一定要有负载均衡和横向扩容的意识)。当时框架还是Thinkphp3.2,框架提高运行效率的开关全打开,标准的lnmp模式,单机...

发表评论

访客

看不清,换一张

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