Führen Sie Python-Code über die C # -GUI aus

Einführung

Es ist eine Erweiterung von Python-Skript über C # GUI-Anwendung ausführen, und es wird gesagt, dass die Python-Quellcode-Eingabe direkt über die GUI ausgeführt werden kann.

Was ich gemacht habe

Der Bildschirm ist wie folgt. Der Bildschirm zeigt das Ergebnis der Ausführung der Berechnung nach Anzahl. image.png

Wenn die Syntax unterschiedlich ist, wird der folgende Fehler angezeigt. image.png

Quelle

Ich habe gerade den vom Benutzer eingegebenen Python-Code als Python-Skript in einem temporären Ordner gespeichert und pytnon.exe ausführen lassen, technisch nichts Neues.

Es macht jedoch Spaß, Python-Code vor Ort frei eingeben und ausführen zu können.

Als Anwendungsbeispiel, das mir in den Sinn kam, kann es meiner Meinung nach verwendet werden, wenn Python-Code verteilt wird, den Sie absolut nicht sehen möchten.

Schließlich wird die Quelle beschrieben. Weitere Informationen finden Sie unter Python-Skript über C # GUI-Anwendung ausführen.

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace PythonExecutor
{

    public partial class Form1 : Form
    {
        private Process currentProcess;
        private StringBuilder outStringBuilder = new StringBuilder();
        private int readCount = 0;
        private Boolean isCanceled = false;
        private String pythonFileName = "temporaryPythonFile.py";
        
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        ///Fügen Sie der Textbox eine Zeichenfolge hinzu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void AppendText(String data, Boolean console)
        {
            textBox1.AppendText(data);
            if (console)
            {
                textBox1.AppendText("\r\n");
                Console.WriteLine(data);
            }
        }

        /// <summary>
        ///Verhalten beim Klicken auf die Schaltfläche Ausführen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {

            if (Directory.Exists(this.textBox3.Text.Trim()))
            {
                //Schreiben Sie in die Python-Datei im Arbeitsordner
                String path = this.textBox3.Text.Trim() + System.IO.Path.DirectorySeparatorChar + this.pythonFileName;

                using (StreamWriter writer = new StreamWriter(path))
                {
                    StringReader strReader = new StringReader(this.textBox4.Text.Trim());
                    while (true)
                    {
                        String aLine = strReader.ReadLine();
                        if (aLine != null)
                        {
                            writer.WriteLine(aLine);

                        }
                        else
                        {
                            break;
                        }
                    }
                    writer.Close();
                }

                //Vorverarbeitung
                button1.Enabled = false;
                button2.Enabled = true;
                isCanceled = false;
                readCount = 0;
                outStringBuilder.Clear();
                this.Invoke((MethodInvoker)(() => this.textBox1.Clear()));

                //Lauf
                RunCommandLineAsync(path);
            }
            else
            {
                this.Invoke((MethodInvoker)(() => MessageBox.Show("Der Arbeitsordner ist ungültig")));
            }

        }

        /// <summary>
        ///Hauptteil des Befehlsausführungsprozesses
        /// </summary>
        public void RunCommandLineAsync(String pythonScriptPath)
        {

            ProcessStartInfo psInfo = new ProcessStartInfo();
            psInfo.FileName = this.textBox2.Text.Trim();
            psInfo.WorkingDirectory = this.textBox3.Text.Trim();
            // psInfo.Arguments = this.textBox4.Text.Trim();
            psInfo.Arguments = pythonScriptPath;

            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.EnableRaisingEvents = true;
            p.Exited += onExited;
            p.OutputDataReceived += p_OutputDataReceived;
            p.ErrorDataReceived += p_ErrorDataReceived;

            p.Start();


            //Starten Sie das asynchrone Lesen von Ausgabe und Fehler
            p.BeginOutputReadLine();
            p.BeginErrorReadLine();

            currentProcess = p;
        }

        void onExited(object sender, EventArgs e)
        {
            int exitCode;

            if (currentProcess != null)
            {
                currentProcess.WaitForExit();

                //Ausatmen von Daten, die ohne Ausatmen verbleiben
                this.Invoke((MethodInvoker)(() => AppendText(outStringBuilder.ToString(), false)));
                outStringBuilder.Clear();

                exitCode = currentProcess.ExitCode;
                currentProcess.CancelOutputRead();
                currentProcess.CancelErrorRead();
                currentProcess.Close();
                currentProcess.Dispose();
                currentProcess = null;

                //Löschen Sie die Python-Datei
                String pythonFilepath = this.textBox3.Text.Trim() + System.IO.Path.DirectorySeparatorChar + this.pythonFileName;
                if (File.Exists(pythonFilepath)) ;
                {
                    File.Delete(pythonFilepath);
                }

                this.Invoke((MethodInvoker)(() => this.button1.Enabled = true));
                this.Invoke((MethodInvoker)(() => this.button2.Enabled=false));

                if (isCanceled)
                {
                    //Abschlussmeldung
                    this.Invoke((MethodInvoker)(() => MessageBox.Show("Bearbeitung abgebrochen")));
                }
                else
                {
                    if (exitCode == 0)
                    {
                        //Abschlussmeldung
                        this.Invoke((MethodInvoker)(() => MessageBox.Show("Die Verarbeitung ist abgeschlossen")));
                    }
                    else
                    {
                        //Abschlussmeldung
                        this.Invoke((MethodInvoker)(() => MessageBox.Show("Ein Fehler ist aufgetreten")));
                    }
                }
            }
        }

        /// <summary>
        ///Verarbeitung beim Empfang von Standardausgabedaten
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void p_OutputDataReceived(object sender,
            System.Diagnostics.DataReceivedEventArgs e)
        {
            processMessage(sender, e);
        }

        /// <summary>
        ///Was tun, wenn ein Standardfehler empfangen wird?
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void p_ErrorDataReceived(object sender,
            System.Diagnostics.DataReceivedEventArgs e)
        {
            processMessage(sender, e);
        }

        /// <summary>
        ///Empfängt CommandLine-Programmdaten und spuckt sie an TextBox aus
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void processMessage(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (e != null && e.Data != null && e.Data.Length > 0)
            {
                outStringBuilder.Append(e.Data + "\r\n");
            }
            readCount++;
            //Atme zu einem zusammenhängenden Zeitpunkt aus
            if (readCount % 5 == 0)
            {
                this.Invoke((MethodInvoker)(() => AppendText(outStringBuilder.ToString(), false)));
                outStringBuilder.Clear();
                //Stellen Sie den Schlaf so ein, dass er den Faden nicht einnimmt
                if (readCount % 1000 == 0)
                {
                    Thread.Sleep(100);
                }
            }
        }

        /// <summary>
        ///Verhalten beim Klicken auf die Schaltfläche Abbrechen
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            if (currentProcess != null)
            {
                try
                {
                    currentProcess.Kill();
                    isCanceled = true;
                }
                catch (Exception e2)
                {
                    Console.WriteLine(e2);
                }
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //Löschen Sie den Python-Codeteil
            this.textBox4.Clear();
            //Standardausgabebereich löschen
            this.textBox1.Clear();
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}

2020/2/24 überarbeitet

Es wurde wie folgt behoben, da ein schwerwiegender Fehler auftrat, der den Prozess zweimal startete. Wir entschuldigen uns für die Unannehmlichkeiten.

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

Recommended Posts

Führen Sie Python-Code über die C # -GUI aus
Führen Sie Python-Code unter C ++ aus (mit Boost.Python).
[Hinweis] Führen Sie Python-Code aus Excel aus (xlwings)
Führen Sie den Befehl von Python aus
Führen Sie Python-Skripte in C # -GUI-Anwendungen aus
Ich möchte C ++ - Code aus Python-Code erstellen!
Stoppen Sie Omxplayer vom Python-Code
Führen Sie das Python-Skript aus der Batchdatei aus
Rufen Sie popcount von Ruby / Python / C # auf
Führen Sie Python-Skripte synchron von C # aus
Rufen Sie C / C ++ von Python auf dem Mac auf
Rufen Sie die c-Sprache von Python aus auf (python.h)
Doppelte Kombinationen auflisten (C ++) → Python-Code hinzufügen
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
Verwenden von C ++ - Funktionen aus Python mit pybind11
SQL zu SQL
Python C ++ Notizen
Python, openFrameworks (c ++)
[Python] Code, der Algorithmen kennt
Erstellen Sie mit Pybind11 eine Umgebung zum Ausführen von C ++ - Funktionen aus Python (für Benutzer von Windows- und Visual Studio-Code).
Erstellen Sie ein C-Array aus einer Python> Excel-Tabelle
Wickeln Sie C mit Cython für Python ein
Laden Sie den Befehl von yml mit Python und führen Sie ihn aus
[Node-RED] Führen Sie Python in einer virtuellen Anaconda-Umgebung von Node-RED aus [Anaconda] [Python]
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
Wrap C ++ mit Cython zur Verwendung von Python
Ich habe versucht, Python-Code aus .Net mit Pythonnet auszuführen (Hallo World Edition)
Verwenden Sie thingspeak aus Python
[Python] Lesen des Django-Quellcodes Ansicht ab Null ①
Berühren Sie MySQL in Python 3
Lesen von CSV-Daten aus dem Python-Code des DSX-Objektspeichers
Bedienen Sie Filemaker von Python aus
Verwenden Sie fließend Python
Python C / C ++ - Erweiterungsmusterzeiger
Greifen Sie über Python auf Bitcoind zu
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Python aus oder importieren
Schreiben Sie Python2-Code in Python3 um (2to3)
Infomap Python-Zeichencode
Führen Sie die Python-Datei automatisch aus
Verwenden Sie MySQL aus Python
Vor dem Schreiben von Python-Code
Führen Sie Python aus Excel aus
Installieren Sie Python von der Quelle
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
Weiter Python in C-Sprache
Bedienen Sie Neutronen von Python!
Lesen Sie den QR-Code aus der Bilddatei mit Python (Mac).
Betreiben Sie LXC von Python aus
Manipuliere Riak aus Python
[GUI in Python] PyQt5-Dialog-
Erzwinge Python aus Fortran
Führen Sie die Python-Funktion von Powershell aus (wie Sie Argumente übergeben).
Verwenden Sie BigQuery aus Python.
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.