我希望从Python代码中访问一些用C#编写的.NET程序集。
经过一番调查,我有两个选择:
- IronPython,内置.NET接口能力/支持
- 使用Python .NET包的Python
这两种解决方案之间有什么权衡之处?
我希望从Python代码中访问一些用C#编写的.NET程序集。
经过一番调查,我有两个选择:
这两种解决方案之间有什么权衡之处?
如果你想主要使用.NET框架编写代码,我强烈推荐使用IronPython而不是Python.NET。IronPython几乎是本地的.NET - 因此在与其他.NET语言集成时表现出色。
如果您只想将一个或两个组件从.NET集成到标准Python应用程序中,则Python.NET很好。
使用IronPython时有值得注意的差异-但大多数差异都相当微妙。Python.NET使用标准的CPython运行时,因此这个维基页面讨论了两种实现之间的差异。最大的差异在于异常的成本-因此由于其实现方式,一些标准的Python库在IronPython中的性能表现不佳。
另一个问题是IDE支持。目前,与IronPython相比,CPython可能拥有更好的IDE支持-因此这可能是选择其中之一的因素。
大多数依赖于CPython C-API的科学和数值Python库(如numpy、scipy、matplotlib、pandas、cython等)主要在CPython下工作,因此在这种情况下,您最好使用pythonnet(其他名称为Python.NET和Python for .NET)。
同样适用于CPython GUI绑定,例如WxWidgets、PyQt/PySide、GTK、Kivy等,尽管pythonnet和IronPython都可以使用WPF和WinForms。
最后,IronPython尚未完全支持Python 3。
IronPython源自微软,所以我会凭直觉首选它,因为你必须假定它会与其他微软技术更加兼容。
关于2016年的情况。
在我公司,我们使用了IronPython,但我们对其性能不满意(主要是内存使用 - 垃圾回收器太慢),因此我们决定切换到标准Python,并使用Zeroce-s ICE将其与.Net集成。
目前IronPython不支持Python 3.6(仅支持2.7)。
从IronPython 3中,"尚未提供IronPython 3的版本."
IronPython类似于C#,因为它依赖于静态预编译库,但与C#不同的是它是一种动态语言。
CPython类似于C++,就像IronPython是一种动态语言,并且可以访问动态库,这意味着被迫编写所有内容。
在某些方面,IronPython比C#更快,但不如CPython快,然而你可以将IronPython链接到任何语言,以克服问题,但同样也可以使用CPython。
无论你选择什么,这都是一个有趣、简单和强大的语言!
我主要偏爱Python用于.NET,因为IronPython被编译为托管代码,很容易被反编译(这是我最讨厌的),但是使用py2exe或pyinstaller可以将Python与NET模块编译为非托管应用程序。