Ejecutando un script secundario en una nueva terminal

Al ejecutar un script de python secundario:

  • ¿Es posible ejecutar un subprocess.Popen , o subprocess.call o incluso execfile en un nuevo terminal? (como en simplemente un terminal diferente que el terminal actual donde se ejecuta el script).
  • Alternativamente, si antes de ejecutar mi progtwig (principal), abro dos terminales primero, ¿puedo luego apuntar el script secundario al segundo terminal? (para obtener el ID de los terminales abiertos, y luego usar uno específico entre ellos, para realizar el subproceso).

Un ejemplo, dos subprocesos que deben ejecutarse, first.py debe llamarse primero, solo entonces se llama el segundo, second.py . Debido a que los dos scripts first.py y second.py son interdependientes (como en first.py va al modo de espera, hasta que se ejecuta first.py , luego se reanuda first.py , y no sé cómo hacer que esta comunicación funcione entre en términos de subprocesos)

 import subprocess command = ["python", "first.py"] command2 = ["python", "second.py"] n = 5 for i in range(n): p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) p2 = subprocess.Popen(command2, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while True: output = p.stdout.readline().strip() print output if output == 'stop': print 'success' p.terminate() p2.terminate() break 

Framework (Ubuntu, Python 2.7)

Supongo que quieres algo como

 subprocess.call(['xterm','-e','python',script]) 

El viejo xterm casi no tiene lujos; en un sistema Freedesktop, tal vez ejecute xdg-terminal lugar. En Debian, intente x-terminal-emulator .

Sin embargo, hacer que su progtwig requiera X11 es, en la mayoría de los casos, un error. Una mejor solución es ejecutar los subprocesos con salida a un archivo de registro (o un socket, o lo que sea) y luego ejecutar tail -f por separado en esos archivos (en un terminal diferente, o desde un servidor diferente a través de ssh , o con salida a un registrador que admite rsyslog , o o o …) que mantiene su progtwig simple y modular, libre de dependencias de “conveniencia”.

Si está utilizando tmux , puede especificar en qué destino desea que se ejecute el comando:

 tmux send -t foo.0 ls ENTER 

Entonces, si has creado una sesión tmux foo.0 , deberías poder hacer:

 my_command = 'ls' tmux_cmd = ['tmux', 'send', '-t', 'foo.0', my_command] p = subprocess.Popen(tmux_cmd) 

Puede especificar el tty de la ventana de terminal donde desea que se ejecute el comando en:

 ls > /dev/ttys004 

Sin embargo, recomendaría optar por el enfoque tmux para un mayor control (vea mi otra respuesta).