如何在与原始终端窗口相同的进程中在新终端窗口中运行命令?

如何在与原始终端窗口相同的进程中在新终端窗口中运行命令?

相当于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/NUMBERttyecho 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 终端不是无论如何可见?在我看来,这就是你应该使用的终端,而不是浪费时间去购买一些新的终端。

我想我会这样做:

  1. -m在原始终端中启动监控 shell。

  2. 图标化终端窗口。

  3. 开始你的 Python 事情。

  4. 当您要调用第二个终端时,请让 Python 向自身发送 SIGSTOP。

  5. 显示终端。

  6. 呼叫你的命令。

  7. 完成后,再次隐藏您的终端和fgPython。

相关内容