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

    entrer la description de l'image ici

  • Lire la chaîne JSON de sortie depuis l'application C #:

     using (StreamReader myStreamReader = process.StandardOutput)
     {
        outputString = myStreamReader.ReadLine();
        process.WaitForExit();
     }
    

entrer la description de l'image ici

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow