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

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

卡卷网9个月前 (12-15)每日看点157

将 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

分享给朋友:

相关文章

你捡过最大的漏是什么?

你捡过最大的漏是什么?

买了套二手房,软磨硬泡便宜了1个w 结果就是一屋子狼藉 原业主说反正你们要重新装修 就不收拾了 等完了你们一起收拾掉吧 落了很多柜子 电器是啥的 今天打开卧室柜子一看…现在是去存钱的路上有朋友知道这样存钱银行会给发大米跟油吗...

WordPress建站同时面向B端和C端,有什么好的解决方案?

这个很容易实现呀,只不过需要自己开发,整体用权限管理就可以实现了,B端和C端是不同用户权限,C端能看到的菜单入口和B端不一样就行了。技术层面实现没问题的,只不过就是看你们的技术能力和投入了 ,这样的需求应该没有现成的开源插件。只能找人定制开...

都是前端框架,为什么用 React 的人会有优越感?

都是前端框架,为什么用 React 的人会有优越感?

上家公司一直搞react,最近第一次写个vue3项目。老板朋友来了看了下页面说:这用vue写的吧。我:是...老板朋友:一看就知道是vue做的。这tm你看一眼页面就知道用的啥框架?这感觉就是,我一直用苹果,偶尔用了下华为打电话,有个人离老远...

是不是从Java培训班出来的人都被淘汰了?

真实个人经历。我就是从培训班出来的,但没有学完就跑出来了。当我明白什么人不管什么基础都能进培训班进行培训,学到什么程度都能保证他们包就业,我就知道不正常。我自己是大三下的时候去的,考研考到一半感觉无望,想抓紧时间学习技术,利用应届生身份准备...

什么时候你意识到做技术永无出路?

什么时候你意识到做技术永无出路?

2016年,帮一个朋友的忙,写了个软件给他的工作室用, 象征性的收了5000块钱。大概过了三四年吧,他酒后吐真言,这个软件在他这个细分行业,很有用,他这几年把我写的这个软件卖了很多份出去,收益远超30万。因为是离线软件,给他的就是一个exe...

领导给我介绍了私活,挣了3W。该给领导分多少合适呢?

你看,这就是网络的好处了。这种问题,你去问亲戚朋友,一大帮子人有一大帮子说法,还不排除有人眼红故意坑你瞎出主意。你这隔网上一问,大家素昧平生,反而因为想骗个赞跟你使出浑身解数来出主意。多好你看。其实这事道理很简单。人脉是人家的,活是你干的。...

发表评论

访客

看不清,换一张

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