¿Cómo ejecuto un script de Python desde C#?
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.py
ubicación como cmd
y la filename
ubicación como args
no funciona. Me dijeron que debería pasar python.exe
como cmd
, y luego code.py filename
como 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);
}
}
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 FileName
y crear la Arguments
cadena para proporcionar tanto el script como el archivo que desea leer.
También tenga en cuenta que no puede hacerlo RedirectStandardOutput
a 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);
}
}
}
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í.