IronPython与Python .NET

我想从Python代码中访问一些用C#编写的.NET程序集。

有一点研究表明我有两个select:

  • 具有.NET接口function/支持内置的IronPython
  • Python与Python .NET包

两种解决scheme之间的折衷是什么?

如果你想主要将你的代码放在.NET框架上,我会强烈推荐IronPython和Python.NET。 IronPython是非常原生的.NET – 所以它在与其他.NET语言集成时效果很好。

如果你想把一个或者两个.NET组件集成到一个标准的Python应用程序中,Python.NET是很好的。

使用IronPython有显着的区别 – 但大多数是相当微妙的。 Python.NET使用标准的CPython运行时,所以这个Wiki页面是两个实现之间差异的相关讨论。 最大的区别是exception开销 – 所以一些标准的python库在IronPython中的执行效果并不理想。

在同意Reed Copsey和Alex Martelli给出的答案的同时,我想指出一个更进一步的差别 – 全球口译员锁(GIL)。 虽然IronPython没有GIL的限制,但是CPython却是这么做的 – 所以对于那些GIL是瓶颈的应用程序来说,在某些多核场景中,IronPython比Python.NET有优势。

从Python.NET文档:

embedded程序的重要说明: Python不是自由线程的,并使用全局解释器locking,以允许multithreading应用程序与Python解释器进行安全交互。 有关这方面的更多信息,请参阅www.python.org网站上的Python C API文档。

将Pythonembedded到托pipe应用程序中时,必须以与在C或C ++应用程序中embeddedPython时相同的方式来pipe理GIL。

在与Python.Runtime命名空间提供的任何对象或API交互之前,调用代码必须通过调用PythonEngine.AcquireLock方法获取Python全局解释器锁。 这个规则唯一的例外是PythonEngine.Initialize方法,可以在启动时调用,而不需要获取GIL。

当完成使用Python API时,托pipe代码必须调用相应的PythonEngine.ReleaseLock释放GIL并允许其他线程使用Python。

AcquireLockReleaseLock方法是对Python API的非托pipePyGILState_EnsurePyGILState_Release函数的精简封装,这些API的文档适用于受pipe版本。

另一个问题是IDE支持。 CPython可能比IronPython有更好的IDE支持 – 所以这可能是一个select一个在另一个因素。

大多数依靠CPython C-API(numpy,scipy,matplotlib,pandas,cython等等)的科学和数值Python库大多在CPython下工作,所以在这种情况下,最好的select是pythonnet(其他名称 – Python.NET和Python的.NET)。 CPython GUI绑定也是如此,例如WxWidgets,PyQt / PySide,GTK,Kivy等,尽pipepythonnet和IronPython都可以使用WPF和WinForms。

最后,IronPython还没有完全支持Python 3。

IronPython是“.NET本地” – 所以如果你想完全整合你的Python代码和.NET,那将是更可取的; Python.NET与经典的Python一起工作,所以它可以让你的Python代码的“arm长度”远离.NET本身。 (请注意,使用此代码 ,实际上可以使用从IronPython代码为CPython编写的扩展,所以这不再是歧义性条件)。

IronPython来自微软,所以我会尽我所能,首先使用那个,因为你必须假设它会与其他MSFT技术更好地发挥。

至于2016年。

在我的公司我们使用了IronPython,但是我们对性能并不满意(主要是内存使用 – 垃圾回收器太慢),所以我们决定切换到标准的Python,并使用Zeroce-ICE将其与.Net集成。

  1. Ironpython就像C#反过来它依赖于静态预build库,而不像C#是一个dynamic语言。

  2. Cpython就像C ++一样Ironpython是一种dynamic语言,可以访问dynamic库,然后转而被迫编写一切。

  3. Ironpython在某些方面比C#更快,但不会比Cpython更快,但是你可以将Ironpython链接到任何语言,从而解决即将出现的问题,但是你可以用Cpython做同样的事情。

一个有趣,简单而强大的语言,无论你select什么!