script ejecutar desde conectar con codigo c# python .net ironpython python.net

ejecutar - ¿Cómo ejecuto un script de Python desde C#?



ejecutar python desde c (6)

Ejecute el script de Python desde C

Crea un proyecto de C # y escribe el siguiente código.

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"

Verás la ''Prueba de Python C #'' en la consola de C #.

Este tipo de pregunta se ha formulado anteriormente en diversos grados, pero creo que no se ha respondido de manera concisa y lo vuelvo a preguntar.

Quiero ejecutar un script en Python. Digamos que es esto:

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

Que obtiene una ubicación de archivo, la lee y luego imprime su contenido. No es tan complicado.

De acuerdo, entonces, ¿cómo puedo ejecutar esto en C #?

Esto es lo que tengo ahora:

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); } } }

Cuando paso la ubicación code.py como cmd y la ubicación del filename como args , no funciona. Me dijeron que debería pasar python.exe como el cmd , y luego code.py filename como los args .

He estado buscando desde hace un tiempo y solo puedo encontrar personas que sugieran usar IronPython o tal. Pero debe haber una forma de llamar a un script de Python desde C #.

Alguna aclaración:

Necesito ejecutarlo desde C #, necesito capturar la salida, y no puedo usar IronPython o cualquier otra cosa. Cualquier pirateo que tengas estará bien.

PD: El código real de Python que estoy ejecutando es mucho más complejo que esto, y devuelve el resultado que necesito en C #, y el código C # llamará constantemente al Python.

Imagina que este es mi código:

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


Establezca WorkingDirectory o especifique la ruta completa de la secuencia de comandos python en el Argumento

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); } }


Estoy teniendo problemas con stdin/stout : cuando el tamaño de la carga excede varios kilobytes, se bloquea. Necesito llamar a las funciones de Python no solo con algunos argumentos cortos, sino con una carga útil personalizada que podría ser grande.

Hace un tiempo, escribí una biblioteca de actores virtuales que permite distribuir tareas en diferentes máquinas a través de Redis. Para llamar al código de Python, agregué funcionalidad para escuchar los mensajes de Python, procesarlos y devolver los resultados a .NET. Aquí hay una breve descripción de cómo funciona .

Funciona en una sola máquina también, pero requiere una instancia de Redis. Redis agrega algunas garantías de confiabilidad: la carga útil se almacena hasta que se finaliza el trabajo confirmado. Si muere un trabajo, la carga útil se devuelve a una cola de trabajos y luego es reprocesada por otro trabajador.


La razón por la que no funciona es porque tiene UseShellExecute = false .

Si no usa el intérprete de comandos, deberá proporcionar la ruta completa al ejecutable de Python como FileName y compilar la cadena de Arguments para suministrar su secuencia de comandos y el archivo que desea leer.

También tenga en cuenta que no puede RedirectStandardOutput UseShellExecute = false menos que UseShellExecute = false .

No estoy muy seguro de cómo se debe formatear la cadena de argumentos para Python, pero necesitará algo como esto:

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); } } }


Me encontré con el mismo problema y la respuesta de Master Morality no lo hizo por mí. Lo siguiente, que se basa en la respuesta anterior, funcionó:

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); } } }

Como ejemplo, cmd sería @C:/Python26/python.exe y args sería C://Python26//test.py 100 si quisiera ejecutar test.py con el argumento de la línea cmd 100. Tenga en cuenta que la ruta el archivo .py no tiene el símbolo @.


Si está dispuesto a utilizar IronPython, puede ejecutar scripts directamente en C #:

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

Obtenga IronPython aquí.