c# - .NET/C# 与 Python 互操作

标签 c# python .net interop protocol-buffers

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

我做了一点挖掘,发现 IronPython ,但是,在实现后它无法支持我需要在我的脚本中执行的许多 pypi python 包。

其次,我查看了Python.Net这是一个嵌入或扩展 CPython 的嵌入式解释器。 CPython 可以运行我需要的所有脚本/等等,但是,我发现一直打开/关闭 python 解释器会造成相当多的内存泄漏,并且那里也总是存在线程限制。参见 docs一些细节。

我想知道在 .net 中这种互操作和嵌入 python 是否是个好主意。我想知道是否使用像 celery 这样的东西让 python 成为它自己的执行引擎并使用类似 protobufs 的方式在两者之间编码数据会是更好的解决方案吗?这也为我的堆栈增加了更多的复杂性和额外的任务引擎。

我想知道是否还有其他人有任何想法/反馈/经验来尝试完成类似的事情?谢谢!

最佳答案

我认为 pythonnet 是您的最佳选择:

  1. 嵌入式 Python 解释器与 Python 子解释器不同。子解释器用得少得多,而 CPython 已经嵌入到主要应用程序中。此外,由于 pythonnet 会为您处理内存泄漏,因此不太可能发生内存泄漏。
  2. 嵌入式解释器不必在两次调用之间关闭 - 事实上,这可能会变得非常昂贵,只要您的应用程序处于事件状态,您就可以保持它的持久性。
  3. 如果将需要 GIL 的代码包含在 using (Py.GIL()) {} block 中,则可以避免线程问题。
  4. 使用混合模式调试 CPython/.NET 代码的额外好处 PTVS。

关于c# - .NET/C# 与 Python 互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662448/

相关文章:

关于 DataGridView 排序的 C# 问题

python - 如何在 Python 中将单词拆分为字母

c# - EF Code First Migrations 创建额外的外键

.net - 何时使用 Parallel.For?

c# - 用源代码替换对 Json.NET 的引用时无法编译项目

c# - 如何获取网络接口(interface)的状态?

C# 允许反向引用嵌套类吗?

python - 从字符串字符递归构建字典

c# - 回发或回调参数无效。仅在图像按钮的情况下获取

python - 如何在Python中将数字转换为时间?