.NET/C#与Python的互操作性

11

我的后端是用.NET/C#编写的,我有一个需求,需要从.net侧传递上下文执行python脚本。这些脚本排队在一个名为hangfire的后台任务引擎中,它作为一个Windows服务运行。

我进行了一些探索,并找到了IronPython,但是,在实现后发现它不支持我需要在脚本中执行的许多pypi python包。

其次,我查看了Python.Net,它是一个嵌入式解释器,可以嵌入或扩展CPython。CPython可以运行我需要的所有脚本/等等,但是,我发现始终打开/关闭python解释器可能会创建相当多的内存泄漏,并且那里总是有线程约束。有关详细信息,请参见文档

我想知道在.NET中实现Python互操作和嵌入是否是一个好主意。我在想,使用类似celery这样的东西将python作为其自己的执行引擎,并使用类似protobufs之类的东西在两者之间编组数据是否是更好的解决方案?这会增加我的堆栈中更多的复杂性和一个额外的任务引擎。

我想知道其他人是否有任何想法/反馈/经验,尝试实现类似的东西?谢谢!


我遇到了完全相同的问题。你找到优雅的解决方案了吗?我正在考虑使用gRPC,但正如你所说,这会增加复杂性。 - Matthew Conradie
1个回答

7
我认为pythonnet是您最佳的选择:
  1. 嵌入式Python解释器与Python子解释器不同。子解释器使用较少,而CPython已被嵌入主要应用程序中。此外,由于pythonnet替您处理此问题,因此内存泄漏应该是非常不可能的。
  2. 嵌入式解释器在调用之间不必关闭 - 实际上这可能会非常昂贵,您可以将其保持持久性,只要您的应用程序存在。
  3. 如果您使用using (Py.GIL()) {}块括起需要GIL的代码,则可以避免线程问题。
  4. 使用PTVS以混合模式调试CPython/.NET代码的额外好处。

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