使用Python的Subprocess在新Xterm窗口中显示输出

2 投票
1 回答
10133 浏览
提问于 2025-04-16 15:09

我想在两个终端上输出不同的信息,但都是用同一个Python脚本来实现(就像这位朋友所做的那样)。我研究后发现,可以通过使用subprocess.Popen打开一个新的xterm窗口,并运行cat命令来显示终端的标准输入(stdin)信息。我打算这样把需要的信息写入子进程的标准输入:

from subprocess import Popen, PIPE

terminal = Popen(['xterm', '-e', 'cat'], stdin=PIPE) #Or cat > /dev/null
terminal.stdin.write("Information".encode())

这样一来,字符串“Information”就应该能在新的xterm窗口中显示出来。然而,实际情况并不是这样。xterm窗口没有显示任何内容,而stdin.write方法只是返回了字符串的长度,然后就继续往下执行了。我不太确定自己是否对subprocess和管道的工作方式有误解,如果有人能帮我解决这个问题,我将非常感激。谢谢。

1 个回答

4

这个方法不行,因为你是把东西直接传给了xterm,而不是传给在xterm里面运行的程序。可以考虑使用命名管道来解决这个问题:

import os
from subprocess import Popen, PIPE
import time

PIPE_PATH = "/tmp/my_pipe"

if not os.path.exists(PIPE_PATH):
    os.mkfifo(PIPE_PATH)

Popen(['xterm', '-e', 'tail -f %s' % PIPE_PATH])


for _ in range(5):
    with open(PIPE_PATH, "w") as p:
        p.write("Hello world!\n")
        time.sleep(1)

撰写回答