Diese Art von Frage wurde schon früher in unterschiedlichem Maße gestellt, aber ich habe das Gefühl, dass sie nicht präzise beantwortet wurde, und deshalb stelle ich sie erneut.
Ich möchte ein Skript in Python ausführen. Nehmen wir an, es ist das:
if __name__ == '__main__':
with open(sys.argv[1], 'r') as f:
s = f.read()
print s
Wer bekommt einen Dateispeicherort, liest ihn und druckt dann seinen Inhalt. Nicht so kompliziert.
Okay, wie führe ich das in C # aus?
Das habe ich jetzt:
private void run_cmd(string cmd, string args)
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = cmd;
start.Arguments = args;
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using (Process process = Process.Start(start))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.Write(result);
}
}
}
Wenn ich den code.py
Ort als cmd
und den filename
Ort übergebe args
, funktioniert es nicht. Mir wurde gesagt, ich sollte python.exe
als der cmd
und dann code.py filename
als der passieren args
.
Ich habe jetzt schon eine Weile gesucht und kann nur Leute finden, die vorschlagen, IronPython oder ähnliches zu verwenden. Es muss jedoch eine Möglichkeit geben, ein Python-Skript von C # aus aufzurufen.
Einige Klarstellungen:
Ich muss es von C # aus ausführen, ich muss die Ausgabe erfassen und ich kann IronPython oder irgendetwas anderes nicht verwenden. Welchen Hack du auch hast, es wird gut.
PS: Der tatsächliche Python-Code, den ich ausführe, ist viel komplexer als dieser und gibt die Ausgabe zurück, die ich in C # benötige, und der C # -Code ruft ständig den Python-Code auf.
Stellen Sie sich vor, dies ist mein Code:
private void get_vals()
{
for (int i = 0; i < 100; i++)
{
run_cmd("code.py", i);
}
}
quelle
Antworten:
Der Grund, warum es nicht funktioniert, ist, dass Sie haben
UseShellExecute = false
.Wenn Sie die Shell nicht verwenden, müssen Sie den vollständigen Pfad zur ausführbaren Python-Datei als angeben
FileName
und die erstellenArguments
Zeichenfolge , um sowohl Ihr Skript als auch die Datei bereitzustellen, die Sie lesen möchten.Beachten Sie auch, dass Sie nicht können, es
RedirectStandardOutput
sei dennUseShellExecute = false
.Ich bin mir nicht ganz sicher, wie die Argumentzeichenfolge für Python formatiert werden soll, aber Sie benötigen ungefähr Folgendes:
quelle
c:\python26\python.exe
alscmd
und dann bestanden habe,c:\temp\code.py c:\temp\testfile.txt
wieargs
es funktionieren sollte?"PATH"
UseShellExecute
auffalse
undRedirectStandardOutput
zutrue
.Wenn Sie bereit sind, IronPython zu verwenden, können Sie Skripte direkt in C # ausführen:
Holen Sie sich IronPython hier.
quelle
Führen Sie das Python-Skript von C aus
Erstellen Sie ein C # -Projekt und schreiben Sie den folgenden Code.
Python sample_script
Sie sehen den 'Python C # -Test' in der Konsole von C #.
quelle
C:\Users\Documents\Visual Studio 2019
. Aufgrund des Leerzeichens im Ordnerpfad wird es als Trennzeichen für Argumente behandelt, sodass ich dasfileName
nicht gefundene erhalten habe. Gibt es eine Möglichkeit, dem Raum zu entkommen?Ich hatte das gleiche Problem und die Antwort von Master Morality hat es nicht für mich getan. Folgendes, das auf der vorherigen Antwort basiert, hat funktioniert:
Als Beispiel wäre cmd
@C:/Python26/python.exe
und args wäre,C://Python26//test.py 100
wenn Sie test.py mit dem cmd-Zeilenargument 100 ausführen möchten. Beachten Sie, dass der Pfad in der .py-Datei nicht das @ -Symbol enthält.quelle
start
hat die gleichen WerteNur um Ihre Aufmerksamkeit darauf zu lenken:
https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee
Es funktioniert großartig.
quelle
Legen Sie WorkingDirectory fest oder geben Sie den vollständigen Pfad des Python-Skripts im Argument an
quelle
Eigentlich ist es ziemlich einfach, die Integration zwischen Csharp (VS) und Python mit IronPython durchzuführen. Es ist nicht so komplex ... Wie Chris Dunaway bereits im Antwortbereich sagte, begann ich, diese Integration für mein eigenes Projekt zu erstellen. N es ist ziemlich einfach. Befolgen Sie einfach diese Schritte N Sie erhalten Ihre Ergebnisse.
Schritt 1: Öffnen Sie VS und erstellen Sie ein neues leeres ConsoleApp-Projekt.
Schritt 2: Gehen Sie zu Tools -> NuGet Package Manager -> Package Manager Console.
Schritt 3: Öffnen Sie anschließend diesen Link in Ihrem Browser und kopieren Sie den NuGet-Befehl. Link: https://www.nuget.org/packages/IronPython/2.7.9
Schritt 4: Kopieren Sie nach dem Öffnen des obigen Links den Befehl PM> Install-Package IronPython -Version 2.7.9 und fügen Sie ihn in NuGet Console in VS ein. Die unterstützenden Pakete werden installiert.
Schritt 5: Dies ist mein Code, mit dem ich eine in meinem Verzeichnis Python.exe gespeicherte .py-Datei ausgeführt habe.
Schritt 6: Speichern und Ausführen des Codes
quelle
Ich habe Probleme mit
stdin/stout
- wenn die Nutzlastgröße mehrere Kilobyte überschreitet, hängt sie. Ich muss Python-Funktionen nicht nur mit einigen kurzen Argumenten aufrufen, sondern auch mit einer benutzerdefinierten Nutzlast, die groß sein könnte.Vor einiger Zeit habe ich eine virtuelle Akteursbibliothek geschrieben, mit der Aufgaben über Redis auf verschiedenen Computern verteilt werden können. Um Python-Code aufzurufen, habe ich Funktionen hinzugefügt, mit denen Sie auf Nachrichten aus Python warten, diese verarbeiten und die Ergebnisse an .NET zurückgeben können. Hier ist eine kurze Beschreibung, wie es funktioniert .
Es funktioniert auch auf einem einzelnen Computer, erfordert jedoch eine Redis-Instanz. Redis fügt einige Zuverlässigkeitsgarantien hinzu - Nutzdaten werden gespeichert, bis eine Arbeit den Abschluss bestätigt. Wenn eine Arbeit stirbt, wird die Nutzlast in eine Jobwarteschlange zurückgeführt und dann von einem anderen Arbeiter erneut verarbeitet.
quelle