相当于xfce4-terminal -e bash -c 'myCommand'
不使用终端启动新进程,但仍然为输出打开一个新的终端窗口(也需要接受输入)?我希望原始终端(无论如何都不可见)停止,直到新的可见终端完成为止。
假设我有一个调用上述命令的 Python GUI。我希望 Python 脚本在新打开的终端窗口运行其命令时停止,并在停止后继续。
编辑:为了回应有关我的情况的更多信息的请求,更具体地说,这里是:
我使用 Python 3.x 制作了一个 IDE,并使用 Tkinter 作为 GUI。没有打开终端窗口,只是因为它是一个基于 GUI 的程序(如果有的话,无论如何,它都会在后台,并且没有人有特定的理由知道查看它是否在说什么,因为整个 IDE 都在 GUI 中)。
我正在选择使用 gpg 命令行工具对选定的文本进行非对称加密(对于我的其他更突出的用途,这比 Python 模块更方便且有记录,这超出了这个问题的范围;另外还有使用编译的二进制文件没有那么多许可问题)。对于对称加密,我没有问题,因为我不需要打开的终端窗口,但非对称加密往往会提示输入更多可能重要也可能不重要的内容,并且用户需要响应这些提示。
将要加密的文本保存到临时文件中,而gpg是对整个文件进行加密(因为文本可能是任意长的,如果将其输出到终端而不是保存到文件中可能会出现问题)。
因此,当用户选择文本并执行该方法时,我希望弹出一个终端窗口,并显示 gpg 的提示。理想情况下,用户会说“是”或“否”,然后按 Enter 键,终端窗口就会消失;然后所选文本将被非对称加密文本替换。然而,实际发生的是终端窗口弹出,程序在实际加密之前尝试获取加密文本(因为它不等待用户输入任何内容)。我不希望用户在说“是”或“否”后必须手动告诉 IDE 是时候对其进行加密了。
您可能认为可以使用管道将基于 GUI 的用户输入路由到隐藏终端。然而,由于某些奇怪的原因,例如不起作用。y | gpg -a --encrypt --recipient [email protected] tempFile.txt
答案1
当您运行新的终端模拟器时,会创建一个新终端(在 Linux 上)。程序不必由该终端启动才能在那里输出(尝试在终端中运行,然后在另一个终端中运行)。所以你可以告诉你的 Python 脚本从终端读取和写入;您所需要的只是找出设备文件的路径。/dev/pts/NUMBER
tty
echo hello >/dev/pts/NUMBER
使用 xterm,这非常简单:xterm -e 'tty >&3; myCommand'
使用连接到管道的文件描述符 3 运行,程序从该管道读取终端设备的路径。
p = subprocess.Popen("xterm -e 'tty >&3; exec sleep 99999999' 3>&1",
shell=True, stdout=subprocess.PIPE)
tty_path = readline(p.stdout)
tty = open(tty_path, 'r+')
您的 Python 程序现在可以读取和写入tty
.完成后,关闭终端模拟器 ( os.kill(p.pid, signal.SIGTERM)
)。
对于基于多个窗口的单个进程的终端仿真器(例如 xfce4-terminal),您想要做的事情要困难得多。运行xfce4-terminal
会破坏终端仿真器的父进程和子进程之间的链接,并且不会为您提供可以杀死的良好 PID。您可以使用命名管道进行通信,但它是一个更难设置的机器人。
答案2
看起来你应该做的事情与你希望实现的方式恰恰相反。例如 - 为什么你的 python 终端不是无论如何可见?在我看来,这就是你应该使用的终端,而不是浪费时间去购买一些新的终端。
我想我会这样做:
-m
在原始终端中启动监控 shell。图标化终端窗口。
开始你的 Python 事情。
当您要调用第二个终端时,请让 Python 向自身发送 SIGSTOP。
显示终端。
呼叫你的命令。
完成后,再次隐藏您的终端和
fg
Python。