2011-05-20 11 views
8

Estoy aprendiendo C# en este momento por un poco de diversión y estoy tratando de hacer una aplicación de Windows que tiene un poco de gui para ejecutar algunos comandos de python. Básicamente, estoy tratando de enseñarme las agallas de ejecutar un proceso y enviarle comandos, así como recibir comandos de él.¿Por qué Shellexecute = false rompe esto?

tengo el siguiente código en la actualidad

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.FileName = "C:/Python31/python.exe"; 
p.Start(); 
string output = p.StandardOutput.ReadToEnd(); 
p.WaitForExit(); 
textBox1.Text = output; 

Correr python.exe desde un símbolo del sistema da un texto introductorio que me gustaría capturar y enviar a un cuadro de texto en forma de ventanas (textBox1) Básicamente, el objetivo es tener algo que se parece a la consola de python que se ejecuta desde la aplicación de Windows. Cuando no configuro UseShellExecute en falso, aparece una consola y todo funciona bien; sin embargo, cuando establezco UseShellExecute en falso para redirigir la entrada, todo lo que obtengo es que una consola aparece muy rápido y se cierra de nuevo.

¿Qué estoy haciendo mal aquí?

Respuesta

3

Por alguna razón, no se debe utilizar barras diagonales cuando comienzas el proceso

comparación (no funciona):

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.RedirectStandardInput = true; 
p.StartInfo.CreateNoWindow = true; 

p.StartInfo.FileName = "C:/windows/system32/cmd.exe"; 
p.StartInfo.Arguments = "/c dir" ; 
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 
bool f = p.Start(); 
p.BeginOutputReadLine(); 
p.WaitForExit(); 


[...] 


static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Console.WriteLine(e.Data); 
} 

a (funciona como se espera):

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.RedirectStandardInput = true; 
p.StartInfo.CreateNoWindow = true; 

p.StartInfo.FileName = @"C:\windows\system32\cmd.exe"; 
p.StartInfo.Arguments = "/c dir" ; 
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 

bool f = p.Start(); 
p.BeginOutputReadLine(); 
p.WaitForExit(); 


[...] 

static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Console.WriteLine(e.Data); 
} 
+0

Gracias! Ahora puedo obtenerlo ejecutando un script de Python usando este método (más algunos de los enlaces provistos por @Chris Haas, pero no parece posible obtener el resultado completo del ejecutable de python interactivo. –

+0

Cuando no usa ShellExecute , la API llamada es 'CreateProcess' y se sabe que no acepta'/'como un separador de directorio. –

1

Python parece estar haciendo algo raro. No lo creería hasta que lo probé y luego investigué. Pero todos estos mensajes parecen básicamente a tener el mismo problema exacto:

+1

¿Todavía no funciona si cambia de avance a barras invertidas? Hace una diferencia en mi prueba con cmd, pero no tengo Python instalado, así que no puedo probarlo con Python ... –

+0

Gracias a ambos por las respuestas. He probado el código con barras diagonales inversas en su lugar , y todavía aparece con la ventana de la consola que luego desaparece muy rápidamente. ¡Es muy extraño! –

+1

Lo probé con Python 2.6 y tampoco pude hacerlo funcionar. Utilicé slahes hacia adelante, compruebé StdErr además de StdOut, establecí la variable de entorno 'PYTHONUNBUFFERED', pasé' -v' como argumento e incluso utilicé un controlador de datos recibidos asíncronos y no pude hacer que funcionara. –

Cuestiones relacionadas