csc*_*hol 80 .net python ironpython cpython python.net
我想从Python代码访问一些用C#编写的.NET程序集.
一点研究表明我有两个选择:
两种解决方案之间的权衡取舍是什么?
Ree*_*sey 68
如果你想主要基于.NET框架的代码,我强烈推荐IronPython与Python.NET.IronPython几乎是原生.NET - 所以它在与其他.NET语言集成时效果很好.
如果你想将.NET中的一个或两个组件集成到一个标准的python应用程序中,Python.NET是很好的.
使用IronPython时存在显着差异 - 但大多数都相当微妙.Python.NET使用标准的CPython运行时,因此这个Wiki页面是对两个实现之间差异的相关讨论.最大的差异出现在异常成本上 - 因此一些标准的python库由于其实现而在IronPython中表现不佳.
Vin*_*jip 28
在同意Reed Copsey和Alex Martelli给出的答案时,我想指出另一个不同之处 - 全球翻译锁(GIL).虽然IronPython不具备GIL的限制,但CPython确实如此 - 因此对于那些GIL是瓶颈的应用程序来说,比如在某些多核场景中,IronPython比Python.NET更具优势.
从Python.NET文档:
嵌入器的重要说明: Python不是自由线程的,它使用全局解释器锁来允许多线程应用程序与Python解释器安全地交互.有关此内容的更多信息,请参见
www.python.org网站上的Python C API文档 .在托管应用程序中嵌入Python时,您必须像在C或C++应用程序中嵌入Python一样管理GIL.
在与
Python.Runtime命名空间提供的任何对象或API交互之前 ,调用代码必须通过调用该PythonEngine.AcquireLock方法获取Python全局解释器锁 .此规则的唯一例外是PythonEngine.Initialize方法,可以在启动时调用,而无需获取GIL.使用Python API完成后,托管代码必须调用相应
PythonEngine.ReleaseLock的版本来释放GIL并允许其他线程使用Python.该
AcquireLock和ReleaseLock方法是在非托管的瘦包装PyGILState_Ensure和PyGILState_Release功能从Python API,以及这些API的文档适用于管理的版本.
另一个问题是IDE支持.CPython目前可能比IronPython有更好的IDE支持 - 所以这可能是选择其中一个的一个因素.
den*_*ufa 18
大多数依赖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.
至于2016年。
在我的公司中,我们使用 IronPython,但我们对性能不满意(主要是内存使用 - 垃圾收集器太慢),因此我们决定切换到标准 Python 并使用 Zeroce-s ICE 将其与 .Net 集成。
| 归档时间: |
|
| 查看次数: |
61938 次 |
| 最近记录: |