IronPython vsPython .NET
-
19-09-2019 - |
Domanda
Voglio accedere ad alcuni .NET assembly scritto in C# da codice Python.
Un po ' di ricerche hanno mostrato ho due scelte:
- IronPython con .Interfaccia di rete capacità di supporto built-in
- Python con il Python .NET pacchetto
Quali sono i trade-off tra le due soluzioni?
Soluzione
Se si desidera basare principalmente il codice sul framework .NET, mi raccomando IronPython vs Python.NET. IronPython è praticamente .NET nativo - in modo che funziona solo grande per l'integrazione con altri linguaggi .NET.
Python.NET è buono se si desidera integrare solo uno o due componenti da .NET in un'applicazione standard di Python.
Ci sono notevoli differenze quando si utilizza IronPython - ma la maggior parte di loro sono abbastanza sottili. Python.NET utilizza il runtime CPython standard, quindi questa pagina Wiki è una discussione rilevante delle differenze tra le due implementazioni. Le maggiori differenze si verificano nel costo di eccezioni - così alcune delle librerie standard di Python non si comportano come bene in IronPython a causa della loro attuazione
.Altri suggerimenti
Pur concordando con le risposte date da Reed Copsey e Alex Martelli, vorrei sottolineare un ulteriore differenza - il Global Interpreter Lock (GIL). Mentre IronPython non ha i limiti della GIL, CPython fa -. Così sembrerebbe che per quelle applicazioni dove la GIL è un collo di bottiglia, dire in alcuni scenari multicore, IronPython ha un vantaggio rispetto Python.NET
Dalla documentazione Python.NET:
Nota importante per l'embedding di: Python non è libero filettati e utilizza un globale interprete di blocco per consentire applicazioni multi-filettate a interagire in modo sicuro con Python interprete. Molto più informazioni su questo è disponibile in Python C documentazione API sul
www.python.org
sito web.Quando l'incorporamento Python in un gestita applicazione, si deve gestire il GIL appena nello stesso modo in cui si farebbe quando contiene Python in C o C ++ applicazione.
Prima di interagire con una delle oggetti o API fornite dal
Python.Runtime
namespace, codice chiamante deve aver acquisito la Python globale Blocco interprete chiamando il MetodoPythonEngine.AcquireLock
. Il unica eccezione a questa regola è la MetodoPythonEngine.Initialize
, che può essere chiamato in fase di avvio, senza aver acquisito il GIL.Una volta terminato utilizzando le API di Python, codice gestito deve chiamare un corrispondente
PythonEngine.ReleaseLock
di rilasciare GIL e permettono ad altri thread di utilizzare Python.Il
AcquireLock
eReleaseLock
metodi sono sottili involucri sopra ilPyGILState_Ensure
gestito e funzioniPyGILState_Release
dal Python API, e la documentazione per queste API si applica al gestito versioni.
Un altro problema è il supporto IDE. CPython probabilmente ha un migliore supporto IDE attualmente di IronPython -. Quindi questo potrebbe essere un fattore nella scelta di uno sopra l'altro
La maggior parte delle librerie Python scientifiche e numerici che si basano su CPython C-API (NumPy, SciPy, matplotlib, panda, Cython, ecc) stanno lavorando per lo più sotto CPython, quindi in questo caso la soluzione migliore è pythonnet (altri nomi - Python.NET e Python per NET). Lo stesso vale per gli attacchi CPython GUI quali WxWidgets, PyQt / PySide, GTK, Kivy, ecc, anche se entrambi pythonnet e IronPython può utilizzare WPF e WinForms.
E infine IronPython non supporta completamente Python 3 ancora.
IronPython è ".NET-native" -- quindi sarà preferibile se si desidera integrare pienamente il tuo codice Python con .Al NETTO di tutto il cammino;Python.NET funziona con il Classico Python, in modo che ti consente di tenere il tuo codice Python il "braccio" di distanza .NET corretto.(Nota che con questo codice si può effettivamente utilizzare le estensioni scritte per CPython dal tuo IronPython codice, in modo che non è una discriminante condizione più).
IronPython proviene da Microsoft, quindi vorrei andare con il mio intestino e l'uso che una prima, poiché è necessario assumere giocherà più bello con altre tecnologie MSFT.
Per quanto riguarda il 2016.
Nella mia azienda abbiamo utilizzato IronPython, ma non siamo stati soddisfatti con le prestazioni (per lo più l'uso della memoria - garbage collector era troppo lento), così abbiamo deciso di passare a standard di Python e integrarlo con .Net utilizzando Zeroce-s ICE.
IronPython, attualmente, non supporta Python 3.6 (solo 2.7)
IronPython 3 "build di IronPython 3 non sono ancora previste . "
-
IronPython è come C #, a sua volta si basa su librerie predefinite statiche, mentre a differenza di C # è un linguaggio dinamico.
-
CPython è come C ++, come IronPython è un linguaggio dinamico e ha accesso a librerie dinamiche che a sua volta si traduce in essere costretti a scrivere tutto.
-
IronPython è più veloce di C # in alcune zone, ma non più veloce di CPython, tuttavia è possibile collegare IronPython in qualsiasi lingua in tal modo nei prossimi problemi, ma poi di nuovo si può fare lo stesso con CPython.
Un linguaggio divertente, semplice e potente, indipendentemente ciò che si sceglie!
ironpython è fondamentalmente Python 2.7 con supporto integrato .net probabilmente sarà mai il supporto Python 3. Perde su librerie C e Python, ma sul lato torsione ha accesso a .NET e può essere esteso con C #. Quindi, se si utilizza C # già allora ironpython è un bonus.
I principalmente preferisco Python for .NET, perché IronPython è compilato come codice gestito, che può essere facilmente decompilato (ciò che più odio), ma con py2exe o pyinstaller potete compilare Python con il modulo NET come un'applicazione non gestita.