重定向子进程标准输出

Posted

技术标签:

【中文标题】重定向子进程标准输出【英文标题】:Redirecting subprocess stdout 【发布时间】:2013-06-02 16:56:26 【问题描述】:

我已经使用 test.py 中的类 Redir 设置了一个标准输出重定向(如下)。

输出应在文本框中显示两个打印语句。但目前只有“Output1”发送到文本框,“Output2”打印在后面的控制台中。

我想知道是否有办法重定向子进程的标准输出?我尝试使用 subprocess.PIPE 和 Redir 类本身,但无法正确使用。

注意:最终,Popen 调用不会调用 python 文件,所以我不能只从 Test2 获取字符串。不幸的是,我也仅限于 Python 2.6。

谢谢!

test.py:

import sys
from Tkinter import *
import subprocess

class Redir(object):
    def __init__(self, textbox):
        self.textbox = textbox
        self.fileno = sys.stdout.fileno

    def write(self, message):
        self.textbox.insert(END, str(message))

class RedirectGUI(object):
    def __init__(self):
        # Create window - Ignore this bit.
        # ================================
        self.root = Tk()
        self.btn = Button(self.root, text="Print!", command=self.print_stuff, state=NORMAL)
        self.btn.pack()
        self.textbox = Text(self.root)
        self.textbox.pack()

        # Setup redirect
        # ==============
        self.re = Redir(self.textbox)
        sys.stdout = self.re

        # Main window display
        # ===================
        self.root.mainloop()

    def print_stuff(self):
        subprocess.Popen(["python", "test2.py"], stdout=self.re)
        print "Output1"

if __name__ == "__main__":
    RedirectGUI()

test2.py:

class Test2(object):
    def __init__(self):
        print "Output2"

if __name__ == "__main__":
    Test2()

【问题讨论】:

这里是an example on how to show subprocess output in "real time" in tkinter GUI 【参考方案1】:

你可以试试这个,看看你是否得到“Output2”

task = subprocess.Popen(["python", "test2.py"], stdout=subprocess.PIPE)
print task.communicate()

如果你这样做,请将其发送到文本框:)

【讨论】:

以上是关于重定向子进程标准输出的主要内容,如果未能解决你的问题,请参考以下文章

使用带有标准输入和标准输出重定向的 2 进程管道时如何避免标准输入上的重复输入

将进程的标准输出重定向到多个管道

Linux标准输入输出与重定向详解果断收藏

C - 将标准输入/输出重定向到单个双向文件描述符

linux中重定向学习总结

python:multiprocessing.Pipe和重定向标准输出