IronPython vs Python.NET


Quiero acceder a algunos ensamblados.NET escritos en C# desde código Python.

Una pequeña investigación mostró que tengo dos opciones:

¿Cuáles son las compensaciones entre ambas soluciones?

Author: denfromufa, 2009-07-23

10 answers

Si desea basar su código principalmente en. NET framework, le recomiendo encarecidamente IronPython vs Python.NET. IronPython es. NET bastante nativo, por lo que funciona muy bien cuando se integra con otros idiomas.NET.

Python.NET es bueno si solo desea integrar uno o dos componentes de.NET en una aplicación python estándar.

Hay diferencias notables cuando se usa IronPython, pero la mayoría de ellas son bastante sutiles. Python.NET utiliza el estándar CPython runtime, por lo que esta página Wiki es una discusión relevante de las diferencias entre las dos implementaciones. Las mayores diferencias se producen en el costo de las excepciones, por lo que algunas de las bibliotecas estándar de python no funcionan tan bien en IronPython debido a su implementación.

 63
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-27 09:56:33

Si bien estoy de acuerdo con las respuestas dadas por Reed Copsey y Alex Martelli, me gustaría señalar una diferencia más: el Bloqueo Global del Intérprete (GIL). Si bien IronPython no tiene las limitaciones del GIL, CPython sí, por lo que parece que para aquellas aplicaciones donde el GIL es un cuello de botella, digamos en ciertos escenarios multinúcleo, IronPython tiene una ventaja sobre Python.NET.

De la Python.NET documentación:

Nota Importante para embedders: Python no es free-threaded y utiliza un bloqueo de intérprete a permitir aplicaciones multihilo para interactúa de forma segura con Python interprete. Mucha más información acerca de esto está disponible en Python C Documentación de la API sobre el www.python.org Sitio web.

Al incrustar Python en un sistema gestionado aplicación, usted tiene que gestionar el GIL de la misma manera que lo haría al incrustar Python en un C o C++ aplicación.

Antes de interactuar con cualquiera de los objetos o API proporcionados por el Python.Runtime espacio de nombres, código de llamada debe haber adquirido el Python global bloqueo del intérprete llamando al PythonEngine.AcquireLock método. El la única excepción a esta regla es la PythonEngine.Initialize método, que se puede llamar al inicio sin habiendo adquirido el GIL.

Cuando termine de usar las API de Python, el código administrado debe llamar a un PythonEngine.ReleaseLock para liberar el GIL y permitir que otros hilos para utilizar Python.

El AcquireLock y ReleaseLock los métodos son envoltorios finos sobre no gestionada PyGILState_Ensure y PyGILState_Release funciones de la Python API, y la documentación para esas API se aplican a la versiones.

Otro problema es el soporte IDE. CPython probablemente tiene mejor soporte IDE en la actualidad que IronPython - por lo que esto puede ser un factor en la elección de uno sobre el otro.

 26
Author: Vinay Sajip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-05 23:08:50

La mayoría de las bibliotecas científicas y numéricas de Python que dependen de CPython C-API (numpy, scipy, matplotlib, pandas, cython, etc.) están trabajando sobre todo bajo CPython, por lo que en ese caso su mejor apuesta es pythonnet (otros nombres - Python.NET y Python para. NET). Lo mismo es cierto para los enlaces GUI de CPython como wxWidgets, PyQt / PySide, GTK, Kivy, etc., aunque tanto pythonnet como IronPython pueden usar WPF y WinForms.

Y finalmente IronPython aún no es totalmente compatible con Python 3.

 12
Author: denfromufa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-24 16:05:15

IronPython es "nativo de. NET" so por lo que será preferible si desea integrar completamente su código Python con. NET hasta el final; Python.NET funciona con Python clásico, por lo que le permite mantener la "longitud del brazo" de su código Python lejos de.NET propiamente. (Tenga en cuenta que con este código puede usar extensiones escritas para CPython desde su código IronPython, por lo que ya no es una condición discriminatoria).

 8
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-23 00:12:16

IronPython viene de Microsoft, así que iría con mi instinto y utilizar que uno primero, ya que tienes que asumir que jugará mejor con otras tecnologías MSFT.

 6
Author: i_am_jorf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-23 00:13:49

Como para 2016.

En mi empresa utilizamos IronPython, pero no estábamos satisfechos con las actuaciones (sobre todo el uso de memoria - garbage collector era demasiado lento) así que decidimos cambiar a Python estándar e integrarlo con.Net utilizando Zeroce-s ICE.

 3
Author: topolm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-16 11:21:13

IronPython, actualmente, no es compatible con Python 3.6 (solo 2.7)

Desde IronPython 3 "Las construcciones de IronPython 3 aún no se proporcionan."

 1
Author: Ariel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 14:36:26
  1. Ironpython es como C# a su vez se basa en estático prediseñadas bibliotecas, mientras que a diferencia de C# es un lenguaje dinámico.

  2. Cpython es como C++ como Ironpython es un lenguaje dinámico y tiene acceso a bibliotecas dinámicas que a su vez se traduce en ser obligado a escribir todo.

  3. Ironpython es más rápido que C # en ciertas áreas, pero no más rápido que Cpython, sin embargo, puede vincular Ironpython a cualquier lenguaje, por lo tanto, sobre los problemas que vienen, pero de nuevo se puede hacer lo mismo con Cpython.

Un lenguaje divertido, simple y poderoso independientemente de lo que elija!

 0
Author: Meh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-24 04:09:19

Iron Python es básicamente Python 2.7 con soporte.net integrado probablemente nunca soportará Python 3. Pierde en las bibliotecas de C y Python, sin embargo, en el lado de twist tiene acceso a.net y se puede extender con C#. Así que si ya usas C#, Iron Python es una ventaja.

 0
Author: Anonimoose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-18 00:58:00

Prefiero principalmente Python para.NET, porque IronPython se compila como código administrado, que se puede descompilar fácilmente (lo que más odio), pero con py2exe o pyinstaller puede compilar Python con NET module como una aplicación no administrada.

 -1
Author: XorTroll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-10 21:27:56