2016-02-17 18 views
7

Ho Visual Studio 2015 con il mio modulo principale scritto in C# e da lì ho classi diverse scritte in Python (normale Python non Iron Python). Come posso chiamare le funzioni Python dal mio codice C#?Chiama la funzione Python da C# (.NET)

So che ci sono più argomenti a riguardo ma la maggior parte di essi sono troppo vecchi e alcune soluzioni sono troppo difficili o implicano l'uso di un linguaggio medio come il C++.

Ecco alcuni link che ho trovato utile, ma non ha fornito la risposta mi è stato esattamente alla ricerca di:

v'è un facile modo o ho ancora bisogno di una soluzione alternativa? E se ho bisogno di una soluzione, qual è la più semplice?

+0

Hai guardato pythonnet? – denfromufa

risposta

3

È possibile chiamare tutto attraverso la riga di comando

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = "python whatever"; 
process.StartInfo = startInfo; 
process.Start(); 

O, meglio ancora, basta chiamare Python.exe e filtra i tuoi file py come argomento:

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "Python.exe"; 
startInfo.Arguments = "yourfile.py"; 
process.StartInfo = startInfo; 
process.Start(); 
+0

Penso che OP stia cercando una soluzione per chiamare una funzione specifica invece di eseguire semplicemente lo script –

+2

@AlexanderMiles il processo sarebbe rimasto lo stesso. Puoi chiamare 'python -c 'import foo; print foo.hello() ''comando attraverso' System.Diagnostics.Process' – Yar

+2

C'è un articolo ben scritto del 2015 che usa il secondo approccio di @ Yar su https://code.msdn.microsoft.com/windowsdesktop/C-and- Python-interprocess-171378ee. Comprende anche l'invio degli argomenti dello script Python e la cattura dell'output nell'app C#. – snark

-2

Il modo consigliato per eseguire questa operazione è utilizzare IronPython. C'è un'altra risposta che spiega le basi dell'uso di IronPython per accedere al codice Python da C#: How do I call a specific Method from a Python Script in C#?

Se IronPython non è una scelta, come hai detto, puoi in alternativa eseguire la funzione dalla riga di comando e passare argomenti se necessario, anche se per qualcosa di complesso questo potrebbe trasformarsi in spaghetti. Di seguito è riportato un esempio di base di esecuzione di una funzione di pitone in un modulo direttamente dalla linea di comando:

python -c 'import foo; print foo.hello()' 

Quindi, per eseguire il sopra in C#:

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "python.exe"; 
startInfo.Arguments = "-c import foo; print foo.hello()"; 
process.StartInfo = startInfo; 
process.Start(); 

Si noti che se si sta cercando di ottenere un restituire il valore, in questo caso sarà necessario stampare i dati sulla console e serializzare l'output da C# come meglio credi. Questo può essere potenzialmente problematico se la funzione restituisce qualsiasi cosa alla console, a meno che non la si filtri o vi sia un'opzione per sopprimere l'output da quella funzione.

+2

lol, grazie per aver copiato la mia risposta. – Yar

+0

L'ho già aggiunto quando hai risposto, anche se ammetto di aver preso nota da te durante l'impostazione di WindowStyle –

+0

Perché i downvotes? –