¿Ejecutar comando de terminal desde python en la nueva ventana de terminal?

El objective aquí es ejecutar un nuevo archivo de python en un nuevo shell y un archivo de python existente en un shell existente. Digamos que tengo dos archivos, aaa.py y bbb.py. Digamos por simplicidad que todo lo que aaa.py hace es …

subprocess.call('python bbb.py', shell=True) 

… y digamos que bbb.py lo hace es …

 print 'It worked' 

Ahora el objective es ejecutar aaa.py en el terminal 1 y hacer que se inicie bbb.py en el terminal 2. Esperaría que existiera algo como el comando a continuación, pero no puedo resolverlo.

 subprocess.call_in_new_window('python bb.py', shell=True) 

No hay manera de hacer esto en general desde un shell. Lo que tienes que hacer es ejecutar el progtwig de terminal en sí, o algún progtwig de inicio que lo haga por ti. Y la forma de hacerlo es diferente para cada progtwig terminal.

En algunos casos, os.startfile hará lo que quieras, pero esto no va a ser universal.

Además, tenga en cuenta que en general necesitará una ruta de acceso absoluta a su script, ya que la nueva ventana del terminal ejecutará un nuevo shell y, por lo tanto, no tendrá necesariamente su mismo directorio de trabajo. Pero lo ignoraré por los ejemplos.


Con Windows cmd, la forma más sencilla de hacerlo es con el comando start shell. Si lo que start es cualquier progtwig de línea de comandos, incluido python , obtendrá una nueva ventana de cmd. Entonces, algo como:

 subprocess.call('start /wait python bb.py', shell=True) 

OS X tiene un comando similar, open . Y es un progtwig real en lugar de un comando de shell, por lo que no necesita shell=True . Sin embargo, ejecutar un progtwig de línea de comandos o un script con open generalmente no abre una nueva ventana de terminal. De hecho, el objective principal es permitirle ejecutar progtwigs como si se estuvieran haciendo doble clic en Finder, que nunca ejecuta algo en el terminal a menos que sea un archivo .command.

Por lo tanto, puede crear un archivo de envoltorio .command temporal y open ; algo como esto (no probado):

 with tempfile.NamedTemporaryFile(suffix='.command') as f: f.write('#!/bin/sh\npython bb.py\n') subprocess.call(['open', '-W', f.name]) 

Alternativamente, puedes dejarlo explícitamente open para usar Terminal.app, algo como esto:

 subprocess.call(['open', '-W', '-a', 'Terminal.app', 'python', '--args', 'bb.py']) 

O puede hacer un script de Terminal.app a través de AppleEvents. Por ejemplo:

 appscript.app('Terminal').do_script('python bb.py') 

El evento “do script” abre una nueva ventana y ejecuta su argumento como un comando. Si desea un control más detallado, abra el diccionario de scripting en AppleScript Editor y vea todas las cosas divertidas que puede hacer.


En Linux u otros sistemas * nix … bueno, hay 65,102 entornos de escritorio, lanzadores y progtwigs de terminal diferentes. ¿Necesitas trabajar en todos ellos?

Con gnome-terminal, simplemente ejecutando el terminal de nuevo le da una nueva ventana, y el argumento -x permite especificar un comando inicial, por lo que:

 subprocess.call(['gnome-terminal', '-x', 'python bb.py']) 

Muchos terminales más antiguos intentan ser compatibles con xterm , que hace lo mismo con -e , así que:

 subprocess.call(['xterm', '-e', 'python bb.py']) subprocess.call(['rxvt', '-e', 'python bb.py']) 

… etc.

¿Cómo sabes qué terminal está utilizando el usuario? Buena pregunta. Podrías recorrer procesos similares de ti mismo hasta que encuentres algo que parezca un terminal. O simplemente puedes asumir que todos tienen xterm . O puede observar cómo las distintas distribuciones configuran un terminal predeterminado y las buscan todas. O…

No podrá hacer que eso suceda, al menos no tan simplemente como lo está pensando. Sospecho que estás hablando de una Mac debido a la “ventana de terminal”.

Es posible que pueda hacerlo usando el sistema X Window, pero necesitará un montón de cosas para configurar, servidores X, permisos, etc., para que esto suceda.

En estos días, estas cosas suelen violar los límites de seguridad normales. Digamos que descarga un progtwig que se comporta como usted sugiere. Abre una ventana (terminal) (invisible para usted) que tiene los mismos privilegios que usted tiene. Procede a leer todos sus directorios y archivos y los envía al creador del progtwig. Puede que no estés feliz con eso. Todo el tiempo, crees que estás jugando un juego, luego sales y el segundo shell sigue funcionando.

Las ventanas y las conchas son un poco inconexas.

Probablemente debería ser un comentario, pero como todavía no puedo …

En Windows, puedes hacer:

 subprocess.call('python bb.py', creationflags=subprocess.CREATE_NEW_CONSOLE)