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

Resuelto Inbar Rose asked hace 12 años • 10 respuestas

Este tipo de preguntas se han hecho antes en diversos grados, pero siento que no han sido respondidas de manera concisa y por eso la hago de nuevo.

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

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

Que obtiene la ubicación del archivo, lo lee y luego imprime su contenido. No tan complicado.

Bien, entonces, ¿cómo ejecuto 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 code.pyubicación como cmdy la filenameubicación como argsno funciona. Me dijeron que debería pasar python.execomo cmd, y luego code.py filenamecomo args.

He estado buscando por un tiempo y solo puedo encontrar personas que sugieran usar IronPython o algo así. Pero debe haber una manera de llamar a un script de Python desde C#.

Algunas aclaraciones:

Necesito ejecutarlo desde C#, necesito capturar el resultado y no puedo usar IronPython ni nada más. Cualquier truco que tengas estará bien.

PD: El código Python real 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 código Python.

Imagina que este es mi código:

    private void get_vals()
    {
        for (int i = 0; i < 100; i++)
        {
            run_cmd("code.py", i);
        }
    }
Inbar Rose avatar Aug 02 '12 21:08 Inbar Rose
Aceptado

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

Si no utiliza el shell, deberá proporcionar la ruta completa al ejecutable de Python como FileNamey crear la Argumentscadena para proporcionar tanto el script como el archivo que desea leer.

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

No estoy muy seguro de cómo se debe formatear la cadena de argumentos para Python, pero necesitarás 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);
         }
     }
}
Master Morality avatar Aug 02 '2012 14:08 Master Morality

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í.

Chris Dunaway avatar Aug 02 '2012 14:08 Chris Dunaway