Exécutez des scripts Python de manière synchrone à partir de C #

introduction

Jusqu'à présent, j'ai écrit des histoires similaires sur l'intégration entre C # et Python.

Dans "Exécuter le script Python à partir de l'application C # GUI", vous pouvez exécuter le script Python et vérifier la progression jusqu'à ce que le processus soit terminé.

Dans "Exécuter le code Python à partir de l'interface graphique C #", j'ai essayé de rendre possible la saisie du code Python depuis l'écran au lieu du script Python.

Et dans "Exécuter et gérer les processus en arrière-plan à partir de l'interface graphique C #", après avoir exécuté Python, effectuez un autre travail sans attendre la fin. En même temps, j'ai cherché comment vérifier l'état d'exécution lorsque j'étais intéressé.

C'est donc la dernière histoire de cette série.

** En premier lieu, je souhaite créer une méthode qui exécute un script Python et reçoit le résultat du traitement d'une interface graphique, mais que faites-vous? ** **

En bref, c'est un appel qui démarre un script Python sans passer par l'interface graphique, y attend (se synchronise) sans passer au processus suivant jusqu'à ce que l'exécution soit terminée, puis obtient le résultat.

La source

Oui, non.

PythonExecutor.cs


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

namespace ChemShow
{
    public class PythonExecutor
    {
        public String FileName { get; set; }
        public String WorkingDirectory { get; set; }
        public String Arguments { get; set; }
        public String InputString { get; set; }
        public String StandardOutput { get; set; }
        public int ExitCode { get; set; }

        private StringBuilder standardOutputStringBuilder = new StringBuilder();

        public PythonExecutor()
        {

        }

        ///Comportement lorsque le bouton d'exécution est cliqué
        public  void Execute()
        {
            
            ProcessStartInfo psInfo = new ProcessStartInfo();
            psInfo.FileName = this.FileName;
            psInfo.WorkingDirectory = this.WorkingDirectory;
            psInfo.Arguments = this.Arguments;

            psInfo.CreateNoWindow = true;
            psInfo.UseShellExecute = false;
            psInfo.RedirectStandardInput = true;
            psInfo.RedirectStandardOutput = true;
            psInfo.RedirectStandardError = true;

            // Process p = Process.Start(psInfo);
            Process p = new System.Diagnostics.Process();
            p.StartInfo = psInfo;
            p.OutputDataReceived += p_OutputDataReceived;
            p.ErrorDataReceived += p_ErrorDataReceived;

            //Exécution du processus
            p.Start();

            //Écrire dans l'entrée standard
            using (StreamWriter sw = p.StandardInput)
            {
                sw.Write(InputString);
            }

            //Commencer à lire la sortie et l'erreur de manière asynchrone
            p.BeginOutputReadLine();
            p.BeginErrorReadLine();

            //Attends la fin
            p.WaitForExit();
            this.ExitCode = p.ExitCode;
            this.StandardOutput = standardOutputStringBuilder.ToString();
        }

        /// <summary>
        ///Traitement lorsque des données de sortie standard sont reçues
        /// </summary>
        void p_OutputDataReceived(object sender,
            System.Diagnostics.DataReceivedEventArgs e)
        {
            //processMessage(sender, e);
            if (e != null && e.Data != null && e.Data.Length > 0)
            {
                standardOutputStringBuilder.Append(e.Data + "\n");
            }
        }

        /// <summary>
        ///Que faire lorsqu'une erreur standard est reçue
        /// </summary>
        void p_ErrorDataReceived(object sender,
            System.Diagnostics.DataReceivedEventArgs e)
        {
            //Ecrire le traitement nécessaire
        }
    }
}

Commentaire de la source

Rien de nouveau, lancez simplement `` WaitForExit () '' lorsque vous démarrez le processus. Vous ne pourrez pas continuer tant que le processus ne sera pas terminé. En conséquence, un appel synchrone peut être réalisé. Une fois l'exécution terminée, le code de fin et les données de sortie standard peuvent être obtenus à partir des propriétés.

Comment utiliser

Voici un exemple de transmission de données à l'entrée standard d'un script et de réception de la sortie de résultat vers la sortie standard.

PythonExecutor pe = new PythonExecutor();
pe.FileName=@"c:\python3.6\bin\python.exe";
pe.WorkingDirectory = @"c:\tmp";
pe.Arguments =@"C:\ChemShow\python\hist.py";
pe.InputString = "1,2,3,4,5,6,7,8,9,10"; //Données fournies à l'entrée standard
pe.Execute(); //Courir
Console.WriteLine(pe.StandardOutput); //Résultat de sortie standard de sortie

2020/2/24 révisé

Corrigé comme suit car il y avait un bug fatal qui a démarré le processus deux fois. Nous nous excusons pour le dérangement.

// Process p = Process.Start(psInfo); Process p = new System.Diagnostics.Process(); p.StartInfo = psInfo;

en conclusion

En bref, c'est une histoire sur la création d'un composant qui prend en charge toutes les méthodes d'appel qui sont sorties jusqu'à présent.

Plus tard, le titre est un script Python, mais il en est de même s'il peut être exécuté à partir de la ligne de commande.

Recommended Posts

Exécutez des scripts Python de manière synchrone à partir de C #
Exécutez le script Python à partir de Cisco Memorandum_EEM
Exécuter des scripts Python à partir d'applications C # GUI
Exécutez le script illustrator à partir de python
Appeler C depuis Python avec DragonFFI
Appeler popcount depuis Ruby / Python / C #
Exécutez Aprili depuis Python sur Orange
Conseils pour appeler Python à partir de C
Exécuter du code Python à partir de l'interface graphique C #
Exécutez Ansible à partir de Python à l'aide de l'API
Vérifier les modules installés à partir du script Python
Appeler C / C ++ depuis Python sur Mac
Appeler le langage C depuis Python (python.h)
Générer un langage C à partir d'une expression S avec Python
Utilisation des fonctions C ++ de python avec pybind11
Exécutez Python en C ++ sur Visual Studio 2017
sql à sql
notes de python C ++
python, openFrameworks (c ++)
MeCab de Python
Créer un tableau C à partir d'une feuille Python> Excel
Exécutez Python YOLOv3 en C ++ sur Visual Studio 2017
Envelopper C avec Cython pour une utilisation à partir de Python
Appel de scripts Python à partir de Python intégré en C ++ / C ++
Exécutez des fichiers Python à partir de HTML en utilisant Django
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Je veux créer du code C ++ à partir de code Python!
Exécutez des scripts Python à partir d'Excel (en utilisant xlwings)
Remarque pour oct2py appelant le script Octave depuis Python
Utilisez Thingsspeak de Python
Exécutez Python à partir d'Excel VBA avec xlwings et un supplément de tutoriel
Exécutez Python avec VBA
Exploitez Filemaker depuis Python
Utiliser fluentd de python
Exécutez prepDE.py avec python3
Pointeur de modèle d'extension Python C / C ++
Accéder à bitcoind depuis python
Changements de Python 3.0 à Python 3.5
Python depuis ou import
Utilisez MySQL depuis Python
Installer Python à partir de la source
Exécuter des commandes depuis Python
Points Python du point de vue d'un programmeur en langage C
Next Python en langage C
Exécutez Blender avec python
Faites fonctionner le neutron de Python!
Utiliser MySQL depuis Python
Importez des classes dans des fichiers jar directement à partir d'un script Python
Faire fonctionner LXC depuis Python
Manipuler riak depuis python
Utilisez BigQuery depuis Python.
API C en Python 3
Exécutez BigQuery à partir de Lambda
ABC147 C --HonestOrUnkind2 [Python]
Exécuter la commande depuis Python
Tutoriel Cloud Run (python)
Profilage rapide des scripts Python
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
[Python] Lire depuis Stdin
python + sélénium + safari-run iphone safari de mac avec webdriver
Utilisez mecab-ipadic-neologd de Python