IronPython vs. Python.NET
Je veux accéder à certains assemblys. net écrits en C # à partir du code Python.
Un peu de recherche a montré que j'ai deux choix:
- IronPython avec capacité d'interface. net / support intégré
- Python avec le paquet Python. net
Quels sont les compromis entre les deux solutions?
10 réponses
Si vous voulez principalement baser votre code sur le framework. net, je recommande fortement IronPython vs Python.NET. IronPython est à peu près natif. net-donc cela fonctionne très bien lors de l'intégration avec d'autres langages.net.
Python.NET est bon si vous voulez simplement intégrer un ou deux composants de. net dans une application Python standard.
Il existe des différences notables lors de L'utilisation de IronPython - mais la plupart d'entre elles sont assez subtiles. Python.NET utilise le CPython standard runtime, donc cette page Wiki est une discussion pertinente sur les différences entre les deux implémentations. Les plus grandes différences se produisent dans le coût des exceptions - de sorte que certaines bibliothèques Python standard ne fonctionnent pas aussi bien dans IronPython en raison de leur implémentation.
Tout en étant d'accord avec les réponses données par Reed Copsey et Alex Martelli, je voudrais souligner une autre différence - le verrou Global Interpreter (GIL). Alors que IronPython n'a pas les limites du GIL, CPython le fait - il semblerait donc que pour les applications où le GIL est un goulot d'étranglement, disons dans certains scénarios multicœurs, IronPython a un avantage sur Python.NET.
De la Python.NET documentation:
Note Importante pour les intégrateurs: Python n'est pas libre de thread et utilise un mondial verrouillage de l'interpréteur pour permettre applications multithread à interagir en toute sécurité avec le Python interprète. Beaucoup plus d'informations A propos de cela est disponible dans le Python C documentation API sur le
www.python.org
site Web.Lors de l'intégration de Python dans un application, vous devez gérer le GIL de la même manière que vous le feriez lors de l'intégration de Python dans un C ou c++ application.
Avant d'interagir avec tout de la objets ou API fournis par le
Python.Runtime
espace de noms, code appelant doit avoir acquis le global Python verrouillage de l'interpréteur en appelant lePythonEngine.AcquireLock
méthode. Le seule exception à cette règle est lePythonEngine.Initialize
méthode, qui peut être appelé au démarrage sans ayant acquis le GIL.Lorsque vous avez terminé d'utiliser les API Python, le code géré doit appeler un {[4] } pour libérer le GIL et permettre à d'autres fils à utiliser Python.
Les
AcquireLock
etReleaseLock
les méthodes sont des emballages minces sur le non géréPyGILState_Ensure
etPyGILState_Release
fonctions du API Python, et la documentation pour ces Api s'applique à la gestion de version.
Un autre problème est le support IDE. CPython a probablement un meilleur support IDE à l'heure actuelle que IronPython - donc cela peut être un facteur dans le choix de l'un sur l'autre.
La plupart des bibliothèques scientifiques et numériques Python qui reposent sur CPython C-API (numpy, scipy, matplotlib, pandas, cython, etc.) travaillent principalement sous CPython, donc dans ce cas votre meilleur pari est pythonnet (autres noms - Python.NET et Python pour. NET). La même chose est vraie pour les liaisons GUI CPython telles que WxWidgets, PyQt / PySide, GTK,Kivy, etc., bien que pythonnet et IronPython puissent utiliser WPF et WinForms.
Et enfin IronPython ne supporte pas encore complètement Python 3.
IronPython est". net-native " - donc ce sera préférable si vous voulez intégrer complètement votre code Python avec. net tout le chemin; Python.NET fonctionne avec Python classique, donc il vous permet de garder le "bras de longueur" de votre code Python loin de. Net proprement dit. (Notez qu'avec CE code Vous pouvez réellement utiliser des extensions écrites pour CPython à partir de votre code IronPython, ce n'est donc plus une condition discriminante).
IronPython vient de Microsoft, donc j'irais avec mon instinct et l'utiliserais d'abord puisque vous devez supposer qu'il jouera plus bien avec d'autres technologies MSFT.
Comme pour 2016.
Dans mon entreprise, nous avons utilisé IronPython, mais nous n'étions pas satisfaits des performances (la plupart du temps l'utilisation de la mémoire - garbage collector était trop lent), nous avons donc décidé de passer à Python standard et de l'intégrer à.Net en utilisant Zeroce-s ICE.
IronPython, actuellement, ne supporte pas Python 3.6 (seulement 2.7)
De IronPython 3 "les versions de IronPython 3 ne sont pas encore fournies."
Ironpython est comme C# à son tour, il repose sur des bibliothèques prédéfinies statiques alors que contrairement à C# est un langage dynamique.
Cpython est comme c++ comme Ironpython est un langage dynamique et a accès à des bibliothèques dynamiques qui à son tour se traduit par être obligé d'écrire tout.
Ironpython est plus rapide que C# dans certaines zones mais pas plus rapide que Cpython, cependant vous pouvez lier Ironpython à n'importe quelle langue ainsi sur les problèmes à venir, mais là encore vous pouvez faire de même avec Disponible.
Un langage drôle, simple et puissant quel que soit ce que vous choisissez!
Iron Python est fondamentalement Python 2.7 avec un support. net intégré, il ne supportera probablement jamais Python 3. Il perd sur les bibliothèques C et Python, mais du côté de la torsion a accès à. net et peut être étendu avec C#. Donc, si vous utilisez déjà c#, Iron Python est un bonus.
Je préfère principalement Python pour.NET, car IronPython est compilé en tant que code géré, qui peut être facilement décompilé (ce que je déteste le plus), mais avec py2exe ou pyinstaller, vous pouvez compiler Python avec le module NET en tant qu'application non gérée.