IronPython与Python .NET

时间:2009-07-23 00:06:00

标签: python .net ironpython cpython python.net

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

一项小小的研究显示我有两个选择:

两种解决方案之间的权衡取舍是什么?

10 个答案:

答案 0 :(得分:66)

如果你想主要在.NET框架上建立代码,我强烈推荐IronPython和Python.NET。 IronPython几乎是原生.NET - 所以它在与其他.NET语言集成时效果很好。

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

使用IronPython时存在显着差异 - 但大多数都相当微妙。 Python.NET使用标准的CPython运行时,因此this Wiki page是对两种实现之间差异的相关讨论。最大的差异出现在异常成本上 - 因此一些标准的python库由于它们的实现而在IronPython中表现不佳。

答案 1 :(得分:28)

虽然同意Reed Copsey和Alex Martelli给出的答案,但我想指出另一个区别 - 全球翻译锁(GIL)。虽然IronPython不具备GIL的限制,但CPython确实如此 - 因此对于那些GIL是瓶颈的应用程序来说,比如在某些多核场景中,IronPython比Python.NET更具优势。

来自Python.NET文档:

  

嵌入器的重要说明: Python   不是自由线程并使用全局   解释器允许锁定   多线程应用程序   与Python安全交互   翻译。更多信息   关于这一点可以在Python中找到   关于的C API文档   www.python.org网站。

     

在托管中嵌入Python时   应用程序,你必须管理   GIL和你一样   在C或C ++中嵌入Python时   应用

     

在与任何人交往之前   由...提供的对象或API   Python.Runtime命名空间,调用代码   必须已经获得了Python全局   通过调用解释器锁定   PythonEngine.AcquireLock方法。该   唯一的例外是这个规则   PythonEngine.Initialize方法,其中   可以在启动时调用   获得了GIL。

     

使用Python API完成后,   托管代码必须调用相应的   PythonEngine.ReleaseLock要发布   GIL并允许其他线程使用   蟒。

     

AcquireLockReleaseLock   方法是薄的包装   非托管PyGILState_Ensure和   PyGILState_Release的功能来自   Python API和文档   这些API适用于托管   版本

另一个问题是IDE支持。 CPython目前可能比IronPython有更好的IDE支持 - 所以这可能是选择其中一个的一个因素。

答案 2 :(得分:15)

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

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

答案 3 :(得分:9)

IronPython是“.NET-native” - 所以如果你想要将Python代码与.NET完全集成在一起,那将是更好的选择。 Python.NET可以与Classic Python一起使用,因此它可以让你保持Python代码的“臂长”远离.NET。 (请注意,对于this code,您实际上可以使用从IronPython代码为CPython编写的扩展,因此这不再是一个有区别的条件。)

答案 4 :(得分:6)

IronPython来自微软,因此我会尽我所能并首先使用它,因为你必须假设它将与其他MSFT技术相得益彰。

答案 5 :(得分:4)

As for 2016.

In my company we used IronPython, but we were not satisfied with performances (mostly memory use - garbage collector was too slow) so we decided to switch to standard Python and integrate it with .Net using Zeroce-s ICE.

答案 6 :(得分:1)

  1. Ironpython就像C#一样依赖于静态预构建库,而C#则是一种动态语言。

  2. Cpython就像C ++一样,Ironpython是一种动态语言,可以访问动态库,而动态库又转换为强制写入所有内容。

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

  4. 一种有趣,简单而有力的语言,无论你选择什么!

答案 7 :(得分:1)

IronPython目前不支持Python 3.6(仅2.7)

来自IronPython 3 “还没有提供IronPython 3的构建。”

答案 8 :(得分:0)

Iron Python基本上是Python 2.7,具有集成的.net支持,它可能永远不会支持Python 3.它会丢失C和Python库,但是在扭曲方面可以访问.net并且可以使用C#进行扩展。因此,如果你已经使用C#,那么Iron Python就是一个奖励。

答案 9 :(得分:-1)

我主要更喜欢Python for .NET,因为IronPython被编译为托管代码,可以很容易地反编译(我最讨厌的),但是使用py2exe或pyinstaller,你可以用.NET模块编译Python作为非托管应用程序。