2011-06-24 10 views
24

que tienen éxito se ejecutan varios scripts python les llama desde un script de base utilizando el módulo de subproceso:¿Cómo puedo generar nuevos shells para ejecutar scripts de Python desde un script python base?

subprocess.popen([sys.executable, 'script.py'], shell=True) 

Sin embargo, cada una de estas secuencias de comandos ejecuta algunas simulaciones (archivos .exe desde un C++ aplicación) que generan una cierta salida a la cáscara. Todos estos resultados están escritos en el shell base desde donde he lanzado esos scripts. Me gustaría generar un nuevo shell para cada script. Intenté generar nuevos shells utilizando el atributo shell = True al llamar a subprocess.call (también intenté con popen) pero no funciona.

¿Alguna idea sobre cómo obtener un nuevo shell para cada proceso generado con subprocess.call?

Gracias.

Editar: Estaba leyendo el documento sobre stdin y stdout como lo sugirió Spencer, y encontré una marca que resuelve el problema: subprocess.CREATE_NEW_CONSOLE. Tal vez redirigir las tuberías también hace el trabajo, pero esta parece ser la solución más simple (al menos para este problema específico). Acabo de probarlo y funcionó perfectamente:

subprocess.popen([sys.executable, 'script.py'], creationflags = subprocess.CREATE_NEW_CONSOLE) 

Thanks everybody!

+0

Qué quiere decir que desea ejecutar los scripts en diferentes ventanas de terminal? Si es así, ¿qué programa de terminal estás usando? – unutbu

+0

@unutbu: sí, quiero ejecutar cada script en una ventana de terminal diferente. Estoy usando el terminal básico de Windows (solo ejecuta cmd) – emiguel

+0

@Eder: no sé mucho sobre Windows. ¿Esto ayuda: http://stackoverflow.com/questions/303838/create-a-new-cmd-exe-window-from-within-another-cmd-exe-prompt? (es decir, 'start cmd.exe' o' start python script.py' ...) – unutbu

Respuesta

9

Popen ya genera un subproceso para manejar las cosas. Solo necesita redirigir las tuberías de salida. Mire los documentos subprocess, específicamente la sección sobre la redirección stpen, stdout y stderr de popen.

Si no redirige estas tuberías, las hereda del padre. Solo tenga cuidado con el bloqueo de sus procesos.

EDIT:

no me di cuenta que quería ventanas adicionales para cada subproceso. Esto se maneja también. Mire la sección startupinfo del subproceso. Explica qué opciones configurar en Windows para generar una nueva terminal para cada subproceso. Tenga en cuenta que requiere el uso de la opción shell = True.

EDIT 2:

Huh, de alguna manera se perdió el apartado de crear una nueva consola. Gracias por señalar eso.

2

Esto realmente no responde su pregunta. Pero también he tenido mis problemas con el subproceso, y pexpect resultó ser realmente útil.

+0

Dudo que 'pexpect' sea de mucha ayuda porque requiere el módulo' pth' porque no es compatible con Windows (que creo que el OP está usando porque mencionó la ejecución de archivos ".exe"). – martineau

+0

@martineau: Gracias por la información, no estaba al tanto de esto. –

33

para abrir en una consola diferente, no (probado en Win7/Python 3):

from sys import executable 
from subprocess import Popen, CREATE_NEW_CONSOLE 

Popen([executable, 'script.py'], creationflags=CREATE_NEW_CONSOLE) 

input('Enter to exit from this launcher script...') 
+0

funciona muy bien, excepto el uso de raw_input en lugar de la entrada – cowlinator

+8

Python 3 usa la entrada en lugar de la entrada raw_input. – Shule

+3

aaaaaahhhhhhhhh !!!! Me llevó 30 minutos encontrar esta respuesta en particular. Gracias y puede obtener otros 10 k votaciones ascendentes por ello. – velis

Cuestiones relacionadas