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

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

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

将 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

分享给朋友:

相关文章

创业容易吗?

创业容易吗?创建企业不一定是困难或令人生畏的。它可以从一个简单但有力的想法开始,比如小强意识到,如果洗手液能杀死真菌,尤其是拳击台上的真菌,就会更加有用。创业确实需要奉献精神、努力工作和仔细规划——这是没有办法的。虽然这本身可能并不容易,但…

下班后可以做点什么副业赚钱呢?

下班后可以做点什么副业赚钱呢?

首先说明一下,我分享的任务不需要交钱,也不需要入群,只需要你去平台学习就可以。如果有任何让你交钱,进群的任务,请警惕被 割韭菜 。今天给大家分享 7大赚钱副业,新手小白0粉丝 0门槛0技术都可以去做,不说大富大贵,但是赚个零花钱还是可以。如…

电视参数哪个最重要?

电视参数哪个最重要?

在选择智能电视时,面板类型是一个关键因素。 IPS面板以其宽广的视角和出色的色彩还原能力受到青睐,尤其适合日常观看和游戏。 尽管可能会有轻微的漏光,但在大多数情况下,这并不影响使用体验。 相比之下,VA面板提供更高的对比度和更深的黑色,增强…

推荐几个问卷调查平台?

推荐几个问卷调查平台?

我给大家免费推荐一些市面上不多,且稳定的免费的问卷平台,这个在网上都是能够搜索到的,有的还是世界500钱企业,这里推荐的基本上都是上市的问卷公司了。上面都是可以免费去注册的,对外公开开放的,做完了直接奖励美刀的,不需要兑换卡什么的。 C…

你手机里有哪些堪称神器的 App?

你手机里有哪些堪称神器的 App?

嗨嗨,我是赢酱~ 首先我认为对于我们有用的提升自我的都是手机里的神器 App。 一个人应该什么样子呢?在我从女孩子的角度看来,自律,上进,会打扮,情商高,会挣钱,独立,落落大方,这才是应该有的样子,我们可以借助手机不断学习改变 今天给大家准…

你是如何在不依靠工资收入的情况下赚到一万元的?

你是如何在不依靠工资收入的情况下赚到一万元的?

分享几个路子稳,门槛低,变现快,适合年轻人的靠谱的副业。绝对不是送外卖、滴滴、搬砖等等的苦力活,这几个副业都是能是性价比极高,还能让你快速成长的工作。 想通过副业实现暴富、立马月入过万的同学,建议速速划走。 今天撇哥就给大家分享 100+个…

发表评论

访客

看不清,换一张

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