通过C++桥从 .NET 调用 Python

Calling Python from .NET via C++ bridge

本文关键字:调用 Python NET 桥从 C++ 通过      更新时间:2023-10-16
每隔

几个月,当我太累了,无法重新发明/移植东西并在Python中找到一些很酷的代码时,我会在谷歌上搜索"从.NET调用Python"。两种流行的解决方案是启动外部进程或使用IronPython。

IronPython对我来说不是一个选择,因为我可能想要使用Python的原因通常是一些依赖于NumPy/ScyPy的库。

最近我开始学习C++的基础知识,发现可以在C++中嵌入Python,并找到了一篇带有示例的文章。

通过 P/Invoke 从 .NET 调用C++非常容易。所以我的方案是使用来自 .NET 的数据调用一些 Python 脚本并返回结果。

在我开始深入挖掘之前,我想问一下是否有人尝试过这种方法,这是否可行或有更好的方法?

具体说来

  • 所有 Python 库在嵌入时都能工作吗,例如 NumPy、ScyPy、Pandas、PyMC 等?
  • 嵌入式 Python 是否会以与标准C++相同的方式与 C++/CLI 一起工作?
  • 如何将复杂数据传递给 Python:序列化为 JSON 还是类型之间存在映射?

性能是一个问题:主要用例是在实时数据的滑动窗口上做一些数值工作。我认为外部过程对于频繁的呼叫来说非常慢 - 如果我错了,请纠正我?

我通过以下方式

使用过一次:-

有一个 C# dll 我需要从中查询数据。因此,我开发了C++/CLI 模块来与该 dll 进行交互,并处理了一些与该数据对应的委托和事件。然后C++模块将接受这些数据,对其进行处理并将其发送到python模块。

python和c++之间的差距是用zmq(替换普通套接字)和谷歌协议缓冲区(序列化和反序列化机制)来填补的。python 要做的只是将请求发送到C++然后将其传输到 C++/CLI 模块,该模块在获取数据时将通过 zmq 推送到 python...

考虑在

单独的线程中生成一个 python 实例作为处理服务器 - 您可以使用消息将数据传递到它并从它传回,如果你的耦合是松散的,这可以比外部调用工作得更好,并且本质上意味着你的数字处理在 GUI 的单独内核上。您还将跳过为每个调用加载新进程所固有的处理时间。