91

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

一项小研究表明我有两个选择:

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

4

10 回答 10

73

如果您想主要将代码基于 .NET 框架,我强烈推荐 IronPython 与 Python.NET。IronPython 几乎是原生的 .NET - 因此它在与其他 .NET 语言集成时效果很好。

如果您只想将 .NET 中的一两个组件集成到标准的 Python 应用程序中,那么 Python.NET 是很好的选择。

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

于 2009-07-23T00:12:09.170 回答
30

在同意 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 后,托管代码必须调用相应 的 APythonEngine.ReleaseLock来释放 GIL 并允许其他线程使用 Python。

AcquireLockReleaseLock 方法是 Python API 中非托管PyGILState_Ensure和 函数的瘦包装器PyGILState_Release,这些 API 的文档适用于托管版本。

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

于 2009-07-23T00:20:06.457 回答
20

大多数依赖 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。

于 2014-10-06T14:14:17.437 回答
9

IronPython 是“.NET-native”——所以如果你想将你的 Python 代码与 .NET 完全集成,它会更好;Python.NET 可与经典 Python 一起使用,因此它可以让您的 Python 代码与 .NET 保持距离。(请注意,使用此代码,您实际上可以使用 IronPython 代码中为 CPython 编写的扩展,因此这不再是一个区分条件)。

于 2009-07-23T00:12:16.203 回答
6

IronPython 来自 Microsoft,所以我会凭直觉先使用它,因为您必须假设它会更好地与其他 MSFT 技术配合使用。

于 2009-07-23T00:13:49.467 回答
4

至于2016年。

在我的公司,我们使用 IronPython,但我们对性能不满意(主要是内存使用 - 垃圾收集器太慢)所以我们决定切换到标准 Python 并使用 Zeroce-s ICE 将其与 .Net 集成。

于 2016-04-15T15:09:08.000 回答
4

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

来自IronPython 3 “尚未提供 IronPython 3 的构建。”

于 2018-04-24T14:36:26.597 回答
1
  1. Ironpython 与 C# 类似,它依赖于静态预构建库,而与 C# 不同的是,它是一种动态语言。

  2. Cpython 就像 C++ 一样,Ironpython 是一种动态语言,并且可以访问动态库,这反过来又转化为被迫编写所有内容。

  3. Ironpython 在某些方面比 C# 快,但不比 Cpython 快,但是您可以将 Ironpython 链接到任何语言,从而解决即将出现的问题,但是您可以再次使用 Cpython 做同样的事情。

无论您选择什么,都是一种有趣、简单而强大的语言!

于 2012-01-24T04:09:19.700 回答
1

Iron Python 基本上是集成了 .net 支持的 Python 2.7,它可能永远不会支持 Python 3。它输给了 C 和 Python 库,但是在扭曲方面可以访问 .net 并且可以使用 C# 进行扩展。因此,如果您已经使用 C#,那么 Iron Python 将是一个额外的好处。

于 2018-05-18T00:58:00.313 回答
-1

我主要更喜欢 Python for .NET,因为 IronPython 被编译为托管代码,可以轻松反编译(我最讨厌的),但是使用 py2exe 或 pyinstaller,您可以将带有 NET 模块的 Python 编译为非托管应用程序。

于 2017-12-10T21:27:56.467 回答