web-dev-qa-db-fra.com

IronPython contre Python .NET

Je souhaite accéder à des assemblys .NET écrits en C # à partir de code Python. 

Une petite recherche a montré que j'avais deux choix:

Quels sont les compromis entre les deux solutions?

76
cschol

Si vous souhaitez principalement baser votre code sur le framework .NET, je vous recommande fortement IronPython vs Python.NET. IronPython est à peu près natif .NET - il fonctionne donc parfaitement pour l'intégration avec d'autres langages .NET. 

Python.NET est utile si vous souhaitez simplement intégrer un ou deux composants de .NET dans une application python standard.

IronPython présente des différences notables, mais la plupart d'entre elles sont assez subtiles. Python.NET utilise le runtime CPython standard, donc cette page Wiki est une discussion pertinente sur les différences entre les deux implémentations. Les différences les plus importantes concernent le coût des exceptions. Par conséquent, certaines bibliothèques python standard ne fonctionnent pas aussi bien dans IronPython en raison de leur implémentation.

64
Reed Copsey

Tout en souscrivant aux réponses données par Reed Copsey et Alex Martelli, je voudrais souligner une autre différence: le verrou d'interprète mondial (GIL). Bien qu'IronPython n'ait pas les limitations de la GIL, CPython en a. Il semblerait donc que pour les applications où la GIL est un goulet d'étranglement, par exemple dans certains scénarios multicœurs, IronPython a un avantage sur Python.NET.

De la documentation Python.NET:

Note importante pour les plongeurs: Python n'est pas fileté et utilise un global verrou d'interprète pour permettre applications multithreads à interagir en toute sécurité avec le Python interprète. Beaucoup plus d'informations sur ce sujet est disponible dans le Python Documentation de l'API C sur le www.python.org Site Web.

Lors de l'intégration de Python dans un fichier Géré. application, vous devez gérer le fichier GIL de la même manière que vous le feriez lors de l’incorporation de Python dans un C ou C++ application.

Avant d’interagir avec l’un des fichiers objets ou API fournis par le Python.Runtime espace de noms, code d'appel doit avoir acquis le Python global verrou interprète en appelant le PythonEngine.AcquireLock méthode. Le La seule exception à cette règle est le PythonEngine.Initialize méthode, qui peut être appelé au démarrage sans ayant acquis le GIL.

Lorsque vous avez fini d'utiliser les API Python, le code géré doit appeler un .__ correspondant. PythonEngine.ReleaseLock à libérer GIL et autoriser les autres threads à utiliser Python.

AcquireLock et ReleaseLock les méthodes sont minces sur le PyGILState_Ensure et .__ non gérés. PyGILState_Release fonctionne à partir du fichier API Python et la documentation de ces API s’appliquent au .__ géré. versions.

Le support de IDE est un autre problème. CPython a probablement un meilleur support IDE à présent que IronPython - ceci peut donc être un facteur dans le choix de l'un par rapport à l'autre.

27
Vinay Sajip

La plupart des bibliothèques Python scientifiques et numériques qui reposent sur CPython C-API (numpy, scipy, matplotlib, pandas, cython, etc.) fonctionnent principalement sous CPython. Dans ce cas, votre meilleur choix est pythonnet (autres noms - Python.NET Il en est de même pour les liaisons de l'interface graphique CPython telles que WxWidgets, PyQt/PySide, GTK, Kivy, etc., bien que pythonnet et IronPython puissent utiliser WPF et WinForms.

Enfin, IronPython ne prend pas encore totalement en charge Python 3.

14
denfromufa

IronPython est ".NET-native" - ​​il sera donc préférable d’intégrer pleinement votre code Python à .NET; Python.NET fonctionne avec Python classique. Il vous permet donc de garder votre code Python à l'abri de .NET. (Notez qu'avec ce code vous pouvez réellement utiliser les extensions écrites pour CPython à partir de votre code IronPython, ce qui ne constitue plus une condition discriminante).

9
Alex Martelli

IronPython vient de Microsoft, je voudrais donc utiliser mon intuition en premier, car il faut supposer que cela fonctionnera mieux avec d'autres technologies MSFT. 

6
i_am_jorf

Comme pour 2016. 

Dans mon entreprise, nous utilisions IronPython, mais nous n'étions pas satisfaits des performances (principalement l'utilisation de la mémoire - le ramasse-miettes était trop lent). Nous avons donc décidé de passer à Python standard et de l'intégrer à .Net à l'aide de Zeroce-s ICE. 

4
topolm
  1. Ironpython est comme C # à son tour, il repose sur des bibliothèques statiques pré-construites alors que contrairement à C # est un langage dynamique.

  2. Cpython est semblable au C++, tout comme Ironpython est un langage dynamique et a accès à des bibliothèques dynamiques, ce qui se traduit par l'obligation de tout écrire.

  3. Ironpython est plus rapide que C # dans certaines régions, mais pas plus vite que Cpython. Cependant, vous pouvez lier Ironpython à n’importe quel langage, ce qui vous évitera des problèmes à venir, mais vous pourrez faire de même avec Cpython.

Un langage amusant, simple et puissant, quel que soit votre choix!

1
Meh

IronPython, actuellement, ne supporte pas Python 3.6 (seulement 2.7)

from IronPython 3"Les versions d'IronPython 3 ne sont pas encore fournies."

1
Ariel

Iron Python est fondamentalement Python 2.7 avec une prise en charge .net intégrée, il ne sera probablement jamais compatible avec Python 3. Il perd sur les bibliothèques C et Python, mais du côté twist a accès à .net et peut être étendu avec C #. Donc, si vous utilisez déjà C #, Iron Python est un bonus.

0
Anonimoose