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

3
每隔几个月我会在谷歌上搜索“从.NET调用Python”,当我太疲倦以至于不想重复造轮子或移植代码时,我会找到一些很棒的Python代码。两种流行的解决方案是启动外部进程或使用IronPython。
对我来说,IronPython不是一个选择,因为我想使用Python的原因通常是依赖于NumPy/ScyPy的一些库。
最近,我开始学习C++的基础知识,并发现可以将Python嵌入到C++中,并找到了一篇带有示例文章
通过P/Invoke从.NET调用C++非常容易。因此,我的场景是使用.NET从Python脚本中调用数据并获取结果。
在深入挖掘之前,我想问问是否有人尝试过这种方法,这可行还是有更好的方法?
具体来说,
  • 所有Python库(例如NumPy、ScyPy、Pandas、PyMC等)在嵌入式环境中都能正常工作吗?
  • 嵌入式Python是否与C++ / CLI以同样的方式工作,就像标准C++一样?
  • 如何将复杂数据传递给Python:序列化为JSON或类型之间存在映射关系?

性能是一个问题:主要用例是对实时数据的滑动窗口进行一些数字处理。我认为外部进程在频繁调用时非常缓慢 - 如果我错了,请纠正我?


我尝试了C++/CLI,对我来说效果很好,如果你需要代码,请告诉我。但是有时会出现内存泄漏问题。因此,我转而使用C#编写的Python.NET(Python for .NET),但从CLR混合C++/CLI中调用它应该完全没有问题。 - denfromufa
2个回答

2

我曾经这样使用过它:

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

使用zmq(替代普通套接字)和Google协议缓冲区(序列化和反序列化机制),填补了Python和C++之间的差距。 Python只需向C++发送请求,然后将其转移到C++/CLI模块,该模块在获取数据后会通过zmq推送到Python中...


2
考虑将Python实例作为处理服务器在单独的线程中进行生成-您可以使用消息传递数据,如果耦合度较低,则比外部调用更有效,并且本质上意味着您的数字处理与GUI位于不同的核心上。您还将跳过为每个调用加载新进程所固有的处理时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接