Python Language
Appelez Python depuis C #
Recherche…
Introduction
La documentation fournit un exemple d'implémentation de la communication inter-processus entre les scripts C # et Python.
Remarques
Notez que dans l'exemple ci-dessus, les données sont sérialisées en utilisant la bibliothèque MongoDB.Bson qui peut être installée via le gestionnaire NuGet.
Sinon, vous pouvez utiliser n'importe quelle bibliothèque de sérialisation JSON de votre choix.
Vous trouverez ci-dessous les étapes de mise en œuvre de la communication inter-processus:
Les arguments en entrée sont sérialisés en chaîne JSON et enregistrés dans un fichier texte temporaire:
BsonDocument argsBson = BsonDocument.Parse("{ 'x' : '1', 'y' : '2' }"); string argsFile = string.Format("{0}\\{1}.txt", Path.GetDirectoryName(pyScriptPath), Guid.NewGuid());
L'interpréteur Python python.exe exécute le script python qui lit la chaîne JSON à partir d'un fichier texte temporaire et des arguments d'entrée inversés:
filename = sys.argv[ 1 ] with open( filename ) as data_file: input_args = json.loads( data_file.read() ) x, y = [ float(input_args.get( key )) for key in [ 'x', 'y' ] ]
Le script Python est exécuté et le dictionnaire de sortie est sérialisé en chaîne JSON et imprimé dans la fenêtre de commande:
print json.dumps( { 'sum' : x + y , 'subtract' : x - y } )
Lire la chaîne JSON de sortie depuis l'application C #:
using (StreamReader myStreamReader = process.StandardOutput) { outputString = myStreamReader.ReadLine(); process.WaitForExit(); }
J'utilise la communication inter-processus entre les scripts C # et Python dans l'un de mes projets qui permet d'appeler des scripts Python directement à partir de feuilles de calcul Excel.
Le projet utilise le complément ExcelDNA pour la liaison C # - Excel.
Le code source est stocké dans le référentiel GitHub.
Vous trouverez ci-dessous des liens vers des pages wiki qui donnent un aperçu du projet et vous aident à démarrer en 4 étapes simples .
J'espère que vous trouvez l'exemple et le projet utiles.
Script Python à appeler par application C #
import sys
import json
# load input arguments from the text file
filename = sys.argv[ 1 ]
with open( filename ) as data_file:
input_args = json.loads( data_file.read() )
# cast strings to floats
x, y = [ float(input_args.get( key )) for key in [ 'x', 'y' ] ]
print json.dumps( { 'sum' : x + y , 'subtract' : x - y } )
Code C # appelant le script Python
using MongoDB.Bson;
using System;
using System.Diagnostics;
using System.IO;
namespace python_csharp
{
class Program
{
static void Main(string[] args)
{
// full path to .py file
string pyScriptPath = "...../sum.py";
// convert input arguments to JSON string
BsonDocument argsBson = BsonDocument.Parse("{ 'x' : '1', 'y' : '2' }");
bool saveInputFile = false;
string argsFile = string.Format("{0}\\{1}.txt", Path.GetDirectoryName(pyScriptPath), Guid.NewGuid());
string outputString = null;
// create new process start info
ProcessStartInfo prcStartInfo = new ProcessStartInfo
{
// full path of the Python interpreter 'python.exe'
FileName = "python.exe", // string.Format(@"""{0}""", "python.exe"),
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = false
};
try
{
// write input arguments to .txt file
using (StreamWriter sw = new StreamWriter(argsFile))
{
sw.WriteLine(argsBson);
prcStartInfo.Arguments = string.Format("{0} {1}", string.Format(@"""{0}""", pyScriptPath), string.Format(@"""{0}""", argsFile));
}
// start process
using (Process process = Process.Start(prcStartInfo))
{
// read standard output JSON string
using (StreamReader myStreamReader = process.StandardOutput)
{
outputString = myStreamReader.ReadLine();
process.WaitForExit();
}
}
}
finally
{
// delete/save temporary .txt file
if (!saveInputFile)
{
File.Delete(argsFile);
}
}
Console.WriteLine(outputString);
}
}
}