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.
Der Bildschirm ist wie folgt. Der Bildschirm zeigt das Ergebnis der Ausführung der Berechnung nach Anzahl.
Wenn die Syntax unterschiedlich ist, wird der folgende Fehler angezeigt.
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)
{
}
}
}
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