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.)
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.
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);
}
}
}