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

每隔几个月我会谷歌搜索“从.NET调用Python”,因为我太累了,无法重新发明/移植东西并在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模块。

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

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