web-dev-qa-db-fra.com

Comment puis-je intégrer le code Python avec le code c #?

Je veux intégrer le code python (algorithme de clustering hiérarchique) avec le code C #.

(L'idée du projet est de diviser des personnes similaires et de les mettre en classes en utilisant l'algorithme. Nous utilisons le langage c # (asp.net) et voulons une méthode pour lier l'algorithme au code.)

1
Mostafa khaled

Ok, nous l'avons fait. Je vous conseille d'utiliser une architecture de microservice: par ex. votre code appelle un Python Rest Service qui calcule les données et renvoie le résultat. Ou si l'opération est longue (quel clustering est la plupart du temps), utilisez une file d'attente de messages comme courtier entre les deux services .

Vous pouvez appeler directement python à partir de C # en utilisant la bibliothèque http://pythonnet.github.io/ . Quand cela fonctionne, cela fonctionne très bien. Sinon, vous êtes dans un monde de mal - plus particulièrement il échoue parfois à se charger (déterminisme au moins, mais amusant à diagnostiquer). De plus, en raison de python GIL, vous êtes limité à un Python process. De plus, le marshaling de données entre Python et C # n'est pas trivial et conduit à des sessions de débogage intéressantes, par exemple en essayant de pénétrer à l'intérieur d'un IENumerable en Python ...

Dans l'ensemble, le modèle de microservice est plus facile à construire, à raisonner, à déboguer et à construire. Le seul inconvénient est que vous avez maintenant 2 ou 3 pièces mobiles, ce qui peut être un facteur de rupture.

8
Christian Sauer

Cet article peut s'avérer utile: https://code.msdn.Microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee

Il détaille essentiellement l'écriture d'un script python qui utilise des arguments de ligne de commande et imprime une valeur de retour. Votre code C # appelle ensuite ce script avec les arguments requis et en récupère la valeur.

using System; 
using System.IO; 
using System.Diagnostics; 

namespace CallPython 
{ 
    /// <summary> 
    /// Used to show simple C# and Python interprocess communication 
    /// Author      : Ozcan ILIKHAN 
    /// Created     : 02/26/2015 
    /// Last Update : 04/30/2015 
    /// </summary> 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            // full path of python interpreter 
            string python = @"C:\Continuum\Anaconda\python.exe"; 

            // python app to call 
            string myPythonApp = "sum.py"; 

            // dummy parameters to send Python script 
            int x = 2; 
            int y = 5; 

            // Create new process start info 
            ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(python); 

            // make sure we can read the output from stdout 
            myProcessStartInfo.UseShellExecute = false; 
            myProcessStartInfo.RedirectStandardOutput = true; 

            // start python app with 3 arguments  
            // 1st arguments is pointer to itself,  
            // 2nd and 3rd are actual arguments we want to send 
            myProcessStartInfo.Arguments = myPythonApp + " " + x + " " + y; 

            Process myProcess = new Process(); 
            // assign start information to the process 
            myProcess.StartInfo = myProcessStartInfo; 

            Console.WriteLine("Calling Python script with arguments {0} and {1}", x,y); 
            // start the process 
            myProcess.Start(); 

            // Read the standard output of the app we called.  
            // in order to avoid deadlock we will read output first 
            // and then wait for process terminate: 
            StreamReader myStreamReader = myProcess.StandardOutput; 
            string myString = myStreamReader.ReadLine(); 

            /*if you need to read multiple lines, you might use: 
                string myString = myStreamReader.ReadToEnd() */           

            // wait exit signal from the app we called and then close it. 
            myProcess.WaitForExit(); 
            myProcess.Close(); 

            // write the output we got from python app 
            Console.WriteLine("Value received from script: " + myString); 

        } 
    } 
} 
1
John Go-Soco