我想从Python代码访问一些用C#编写的.NET程序集。
一项小小的研究表明,我有两种选择:
- 内置.NET接口功能/支持的IronPython
- 带有Python .NET包的Python
两种解决方案之间的权衡是什么?
我想从Python代码访问一些用C#编写的.NET程序集。
一项小小的研究表明,我有两种选择:
两种解决方案之间的权衡是什么?
Answers:
如果您想主要基于.NET框架编写代码,则强烈建议IronPython与Python.NET。IronPython几乎是.NET的本机-因此,与其他.NET语言集成时,它工作得很好。
如果您只想将.NET的一个或两个组件集成到标准python应用程序中,则Python.NET很好。
使用IronPython时,有明显的不同-但大多数都相当细微。Python.NET使用标准的CPython运行时,因此此Wiki页面是有关两种实现之间差异的相关讨论。最大的差异发生在异常的开销上-因此,由于其实现,某些标准的python库在IronPython中的性能不佳。
在同意里德·科普西(Reed Copsey)和亚历克斯·马特利(Alex Martelli)给出的答案的同时,我想指出另外一个区别-全球口译员锁定(GIL)。尽管IronPython不受GIL的限制,但CPython却具有-因此,对于那些以GIL为瓶颈的应用程序来说,似乎在某些多核方案中,IronPython优于Python.NET。
从Python.NET文档中:
嵌入程序的重要说明: Python不是自由线程的,并且使用全局解释器锁来允许多线程应用程序与Python解释器安全地交互。有关更多信息,请参阅
www.python.org
网站上的Python C API文档 。将Python嵌入托管应用程序时,必须以与将Python嵌入C或C ++应用程序中相同的方式管理GIL。
在与
Python.Runtime
名称空间提供的任何对象或API进行交互之前 ,调用代码必须已通过调用PythonEngine.AcquireLock
方法获得了Python全局解释器锁 。该规则的唯一例外是PythonEngine.Initialize
方法,该方法可以在启动时调用而无需获取GIL。使用Python API完成使用后,托管代码必须调用相应的代码
PythonEngine.ReleaseLock
以释放GIL并允许其他线程使用Python。该
AcquireLock
和ReleaseLock
方法是在非托管的瘦包装PyGILState_Ensure
和PyGILState_Release
功能从Python API,以及这些API的文档适用于管理的版本。
另一个问题是IDE支持。CPython当前可能比IronPython具有更好的IDE支持-因此这可能是一个选择另一个的因素。
大多数依赖CPython C-API的科学和数字Python库(numpy,scipy,matplotlib,pandas,cython等)大多在CPython下工作,因此在这种情况下,最好的选择是pythonnet(其他名称-Python.NET和适用于.NET的Python)。对于CPython GUI绑定(例如WxWidgets,PyQt / PySide,GTK,Kivy等),也是如此,尽管pythonnet和IronPython都可以使用WPF和WinForms。
最后,IronPython还不完全支持Python 3。
至于2016年
在我的公司中,我们使用IronPython,但对性能不满意(大多数情况下使用内存-垃圾收集器太慢),因此我们决定切换到标准Python,并使用Zeroce-s ICE将其与.Net集成。
IronPython当前不支持Python 3.6(仅2.7)
从IronPython的3 “IronPython的3尚未提供的基础之上。”