我想从Python代码访问一些用C#编写的.NET程序集。
一项小小的研究显示我有两个选择:
两种解决方案之间的权衡取舍是什么?
答案 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并允许其他线程使用 蟒。
AcquireLock
和ReleaseLock
方法是薄的包装 非托管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)
Ironpython就像C#一样依赖于静态预构建库,而C#则是一种动态语言。
Cpython就像C ++一样,Ironpython是一种动态语言,可以访问动态库,而动态库又转换为强制写入所有内容。
Ironpython在某些方面比C#更快,但速度不比Cpython快,但是你可以将Ironpython链接到任何语言而不是出现问题但是你可以用Cpython做同样的事情。
一种有趣,简单而有力的语言,无论你选择什么!
答案 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作为非托管应用程序。