Domanda

Voglio accedere ad alcuni .NET assembly scritto in C# da codice Python.

Un po ' di ricerche hanno mostrato ho due scelte:

Quali sono i trade-off tra le due soluzioni?

È stato utile?

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   Metodo PythonEngine.AcquireLock. Il   unica eccezione a questa regola è la   Metodo PythonEngine.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 e ReleaseLock   metodi sono sottili involucri sopra il   PyGILState_Ensure gestito e   funzioni PyGILState_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 . "

  1. IronPython è come C #, a sua volta si basa su librerie predefinite statiche, mentre a differenza di C # è un linguaggio dinamico.

  2. 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.

  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top