您可以通过写入伪终端从属子进程来与外壳进行交互。这是一个如何工作的演示。这个答案多少基于对
Linux伪终端 的回答
:执行从一个终端发送到另一个终端的字符串 。
关键是要获得xterm使用的伪终端(通过
tty命令),并将方法的输出和输入重定向到该伪终端文件。例如
ls < /dev/pts/1 >/dev/pts/1 2> /dev/pts/1
注意
- xterm子处理程序泄漏(
os.system
不建议使用,尤其是对于&
说明不推荐使用。请参阅suprocess
模块)。 - 可能无法以编程方式找到使用了哪个tty
每个命令都在新的suprocess中执行(仅显示输入和输出),因此状态修改命令(例如xterm)
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(“
“,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()



