Предоставление команды во встроенном терминале

Я использую следующий код python для встраивания окна терминала (из Ubuntu Linux) в окно Tkinter. Я хотел бы дать команду «sh kBegin» в окне автоматически, когда начинается окно терминала:

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() 

Псевдо:

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

Как мне это сделать?

One Solution collect form web for “Предоставление команды во встроенном терминале”

Вы можете взаимодействовать с оболочкой, пиши в псевдотерминальном подчиненном дочернем элементе. Вот демонстрация того, как она может работать. Этот ответ несколько основан на ответе на псевдо-терминалы Linux: выполнение строки, отправленной с одного терминала в другой .

Дело в том, чтобы получить псевдотерминал, используемый xterm (через команду tty ) и перенаправить вывод и ввести ваш метод в этот псевдотерминальный файл. Например, ls < /dev/pts/1 > /dev/pts/1 2> /dev/pts/1

Обратите внимание, что

  1. Обработано обработанное дочерним процессом xterm (использование os.system не рекомендуется, особенно для & инструкций. См. модуль suprocess ).
  2. возможно, не удастся найти программно, какой tty используется
  3. каждая команда выполняется в новом суперпроцессе (отображаются только вход и выход), поэтому команда изменения состояния, такая как cd не имеет эффекта, а также контекст xterm ( cd в 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("<Return>",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() 
Python - лучший язык программирования в мире.