我想从 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 运行时,因此这个 Wiki 页面是对两种实现之间差异的相关讨论。最大的差异发生在异常的成本上——所以一些标准的 Python 库由于它们的实现而在 IronPython 中表现不佳。
在同意 Reed Copsey 和 Alex Martelli 给出的答案的同时,我想指出另一个不同之处 - Global Interpreter Lock (GIL)。虽然 IronPython 没有 GIL 的限制,但 CPython 有 - 因此对于那些 GIL 成为瓶颈的应用程序,例如在某些多核场景中,IronPython 比 Python.NET 具有优势。
来自 Python.NET 文档:
嵌入器的重要提示: Python 不是自由线程的,它使用全局解释器锁来允许多线程应用程序与 Python 解释器安全交互。网站上的 Python C API 文档中提供了有关这方面的更多信息
www.python.org
。在托管应用程序中嵌入 Python 时,您必须以与在 C 或 C++ 应用程序中嵌入 Python 时相同的方式管理 GIL。
在与命名空间提供的任何对象或 API 进行交互之前
Python.Runtime
,调用代码必须通过调用PythonEngine.AcquireLock
方法获得 Python 全局解释器锁。此规则的唯一例外是PythonEngine.Initialize
方法,它可以在启动时调用而无需获得 GIL。使用完 Python API 后,托管代码必须调用相应 的 A
PythonEngine.ReleaseLock
来释放 GIL 并允许其他线程使用 Python。
AcquireLock
和ReleaseLock
方法是 Python API 中非托管PyGILState_Ensure
和 函数的瘦包装器PyGILState_Release
,这些 API 的文档适用于托管版本。
另一个问题是 IDE 支持。CPython 目前可能比 IronPython 有更好的 IDE 支持——所以这可能是选择其中一个的一个因素。
大多数依赖 CPython C-API 的科学和数值 Python 库(numpy、scipy、matplotlib、pandas、cython 等)主要在 CPython 下工作,所以在这种情况下,最好的选择是 pythonnet(其他名称 - Python.NET和用于 .NET 的 Python)。对于 WxWidgets、PyQt/PySide、GTK、Kivy 等 CPython GUI 绑定也是如此,尽管 pythonnet 和 IronPython 都可以使用 WPF 和 WinForms。
最后 IronPython 还没有完全支持 Python 3。
IronPython 是“.NET-native”——所以如果你想将你的 Python 代码与 .NET 完全集成,它会更好;Python.NET 可与经典 Python 一起使用,因此它可以让您的 Python 代码与 .NET 保持距离。(请注意,使用此代码,您实际上可以使用 IronPython 代码中为 CPython 编写的扩展,因此这不再是一个区分条件)。
IronPython 来自 Microsoft,所以我会凭直觉先使用它,因为您必须假设它会更好地与其他 MSFT 技术配合使用。
至于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 做同样的事情。
无论您选择什么,都是一种有趣、简单而强大的语言!
Iron Python 基本上是集成了 .net 支持的 Python 2.7,它可能永远不会支持 Python 3。它输给了 C 和 Python 库,但是在扭曲方面可以访问 .net 并且可以使用 C# 进行扩展。因此,如果您已经使用 C#,那么 Iron Python 将是一个额外的好处。
我主要更喜欢 Python for .NET,因为 IronPython 被编译为托管代码,可以轻松反编译(我最讨厌的),但是使用 py2exe 或 pyinstaller,您可以将带有 NET 模块的 Python 编译为非托管应用程序。