it-swarm.com.de

Wie führe ich ein Python-Skript von C # aus?

Diese Art von Frage wurde bereits in unterschiedlichem Maße gestellt, aber ich glaube, dass sie nicht prägnant beantwortet wurde, und deshalb frage ich sie noch einmal.

Ich möchte ein Skript in Python ausführen. Sagen wir mal es ist so:

if __== '__main__':
    with open(sys.argv[1], 'r') as f:
        s = f.read()
    print s

Welches einen Dateispeicherort erhält, liest es 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 die code.py-Position als cmd und die filename-Position als args übergeben habe, funktioniert es nicht. Mir wurde gesagt, ich sollte python.exe als cmd und dann code.py filename als args übergeben.

Ich habe schon lange gesucht und kann nur Leute finden, die die Verwendung von IronPython oder ähnlichem vorschlagen. Es muss jedoch eine Möglichkeit geben, ein Python-Skript aus C # aufzurufen.

Einige Klarstellung:

Ich muss es von C # ausführen, ich muss die Ausgabe erfassen, und ich kann IronPython oder etwas anderes nicht verwenden. Was für ein Hack du auch hast, wird gut.

P.S .: Der eigentliche Python-Code, den ich ausführt, ist viel komplexer und gibt die Ausgabe aus, die ich in C # benötige. Der C # -Code ruft ständig Python auf.

So tun, als wäre dies mein Code:

    private void get_vals()
    {
        for (int i = 0; i < 100; i++)
        {
            run_cmd("code.py", i);
        }
    }
97
Inbar Rose

Der Grund, warum es nicht funktioniert, ist, dass Sie UseShellExecute = false haben.

Wenn Sie die Shell nicht verwenden, müssen Sie den vollständigen Pfad zur ausführbaren Python-Datei als FileName angeben und die Arguments-Zeichenfolge erstellen, um sowohl Ihr Skript als auch die zu lesende Datei bereitzustellen.

Beachten Sie auch, dass Sie nur dann RedirectStandardOutput verwenden können, wenn UseShellExecute = false.

Ich bin nicht ganz sicher, wie der Argumentstring für Python formatiert werden soll, aber Sie benötigen etwas wie das Folgende:

private void run_cmd(string cmd, string args)
{
     ProcessStartInfo start = new ProcessStartInfo();
     start.FileName = "my/full/path/to/python.exe";
     start.Arguments = string.Format("{0} {1}", cmd, 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);
         }
     }
}
91
Master Morality

Wenn Sie IronPython verwenden möchten, können Sie Skripts direkt in C # ausführen:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

private static void doPython()
{
    ScriptEngine engine = Python.CreateEngine();
    engine.ExecuteFile(@"test.py");
}

Holen Sie sich hier IronPython.

49
Chris Dunaway

Python-Skript von C ausführen

Erstellen Sie ein C # -Projekt und schreiben Sie den folgenden Code.

using System;
using System.Diagnostics;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            run_cmd();
        }

        private void run_cmd()
        {

            string fileName = @"C:\sample_script.py";

            Process p = new Process();
            p.StartInfo = new ProcessStartInfo(@"C:\Python27\python.exe", fileName)
            {
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };
            p.Start();

            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();

            Console.WriteLine(output);

            Console.ReadLine();

        }
    }
}

Python sample_script

print "Python C # Test"

In der Konsole von C # wird der'Python C # -Test'angezeigt.

22
Rohit Salunke

Ich bin auf das gleiche Problem gestoßen und die Antwort von Master Morality hat das für mich nicht getan. Folgendes, das auf der vorherigen Antwort basiert, hat funktioniert:

private void run_cmd(string cmd, string args)
{
 ProcessStartInfo start = new ProcessStartInfo();
 start.FileName = cmd;//cmd is full path to python.exe
 start.Arguments = args;//args is path to .py file and any cmd line 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);
     }
 }
}

Zum 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 der .py-Datei nicht das @ -Zeichen enthält.

10
Derek

Nur um Sie darauf aufmerksam zu machen:

https://code.msdn.Microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee

Es funktioniert super.

2
cs0815

Die Integration zwischen Csharp (VS) und Python mit IronPython ist ziemlich einfach. Es ist nicht so komplex ... Wie Chris Dunaway bereits in der Antwort sagte, begann ich mit der Integration dieser Integration für mein eigenes Projekt. N es ist ziemlich einfach. Befolgen Sie einfach diese Schritte. N erhalten Sie 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: Danach öffnen Sie diesen Link in Ihrem Browser und kopieren Sie den NuGet-Befehl. Link: https://www.nuget.org/packages/IronPython/2.7.9

schritt 4: Nach dem Öffnen des obigen Links kopieren Sie das PM> Install-Package IronPython -Version 2.7.9 Befehl und fügen Sie es in der NuGet Console in VS ..__ ein. Es werden die unterstützenden Pakete installiert.

schritt 5: Dies ist mein Code, den ich zum Ausführen einer .py-Datei verwendet habe, die in meiner Python.exe .__ gespeichert ist. Verzeichnis.

using IronPython.Hosting;//for DLHE
using Microsoft.Scripting.Hosting;//provides scripting abilities comparable to batch files
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Sockets;
class Hi
{
private static void Main(string []args)
{
Process process = new Process(); //to make a process call
ScriptEngine engine = Python.CreateEngine(); //For Engine to initiate the script
engine.ExecuteFile(@"C:\Users\daulmalik\AppData\Local\Programs\Python\Python37\p1.py");//Path of my .py file that I would like to see running in console after running my .cs file from VS.//process.StandardInput.Flush();
process.StandardInput.Close();//to close
process.WaitForExit();//to hold the process i.e. cmd screen as output
}
} 

schritt 6: Code speichern und ausführen 

0
Daulmalik

Ich habe Probleme mit stdin/stout - wenn die Payload-Größe mehrere Kilobyte überschreitet, hängt es. 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 Schauspieler-Bibliothek geschrieben, die es erlaubt, Aufgaben über Redis auf verschiedene Maschinen zu verteilen. Um Python-Code aufzurufen, fügte ich Funktionen hinzu, um auf Nachrichten von Python zu warten, sie zu verarbeiten und die Ergebnisse an .NET zurückzugeben. Hier ist eine kurze Beschreibung, wie es funktioniert .

Es funktioniert auch auf einem einzelnen Rechner, erfordert jedoch eine Redis-Instanz. Redis fügt einige Zuverlässigkeitsgarantien hinzu - die Nutzdaten werden gespeichert, bis die Fertigstellung bestätigt ist. Wenn ein Bearbeiter stirbt, wird die Nutzlast in eine Auftragswarteschlange zurückgegeben und von einem anderen Mitarbeiter erneut verarbeitet.

0
V.B.

Legen Sie WorkingDirectory fest oder geben Sie den vollständigen Pfad des Python-Skripts im Argument an

ProcessStartInfo start = new ProcessStartInfo();
start.FileName = "C:\\Python27\\python.exe";
//start.WorkingDirectory = @"D:\script";
start.Arguments = string.Format("D:\\script\\test.py -a {0} -b {1} ", "some param", "some other param");
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
using (Process process = Process.Start(start))
{
    using (StreamReader reader = process.StandardOutput)
    {
        string result = reader.ReadToEnd();
        Console.Write(result);
    }
}
0
LIU YUE