Dando un comando en una terminal incrustada

Estoy usando el siguiente código de Python para incrustar una ventana de terminal (de Ubuntu Linux) en una ventana de Tkinter. Me gustaría dar el comando ‘sh kBegin’ en la ventana automáticamente cuando se inicia la ventana de terminal:

from Tkinter import * from os import system as cmd root = Tk() termf = Frame(root, height=800, width=1000) termf.pack(fill=BOTH, expand=YES) wid = termf.winfo_id() cmd('xterm -into %d -geometry 160x50 -sb &' % wid) root.mainloop() 

Seudo:

 cmd('xterm -into %d -geometry 160x50 -sb &' % wid) embedded_terminal('sh kBegin') # EMBEDDED TERMINAL DISPLAYS OUTPUT OF sh kBegin## 

¿Cómo podría hacer que esto funcione?

Puede interactuar con un shell escribiendo en el hijo esclavo pseudo-terminal. Aquí está una demostración de cómo podría funcionar. Esta respuesta se basa en cierta medida en una respuesta a los pseudo-terminales de Linux: ejecutar la cadena enviada desde un terminal en otro .

El punto es obtener el pseudo-terminal utilizado por xterm (mediante el comando tty ) y redirigir la salida y la entrada de su método a este archivo de pseudo-terminal. Por ejemplo, ls < /dev/pts/1 > /dev/pts/1 2> /dev/pts/1

Tenga en cuenta que

  1. xterm child procesado se filtran (no se recomienda el uso de os.system , especialmente para las instrucciones. Ver módulo de suprocess ).
  2. puede que no sea posible encontrar programáticamente qué tty se usa
  3. cada comando se ejecuta en un nuevo suproceso (solo se muestra la entrada y la salida), por lo que el comando de modificación de estado como cd no tiene ningún efecto, así como el contexto del xterm ( cd en el xterm)
 from Tkinter import * from os import system as cmd root = Tk() termf = Frame(root, height=700, width=1000) termf.pack(fill=BOTH, expand=YES) wid = termf.winfo_id() f=Frame(root) Label(f,text="/dev/pts/").pack(side=LEFT) tty_index = Entry(f, width=3) tty_index.insert(0, "1") tty_index.pack(side=LEFT) Label(f,text="Command:").pack(side=LEFT) e = Entry(f) e.insert(0, "ls -l") e.pack(side=LEFT,fill=X,expand=1) def send_entry_to_terminal(*args): """*args needed since callback may be called from no arg (button) or one arg (entry) """ command=e.get() tty="/dev/pts/%s" % tty_index.get() cmd("%s <%s >%s 2> %s" % (command,tty,tty,tty)) e.bind("",send_entry_to_terminal) b = Button(f,text="Send", command=send_entry_to_terminal) b.pack(side=LEFT) f.pack(fill=X, expand=1) cmd('xterm -into %d -geometry 160x50 -sb -e "tty; sh" &' % wid) root.mainloop()