如何在从另一个python文件运行python脚本时显示控制台输出

时间:2014-07-05 18:00:47

标签: python ide console tkinter

我正在创建一个带有文本框和运行按钮的简单IDE。这要求用户输入文件名,写入写入文件的代码并运行该文件。 我想显示从控制台输出的任何内容,例如打印,输入等......就像IDE一样。 这可能吗?

这是我的代码:

from Tkinter import *
import tkFileDialog
import ScrolledText
import subprocess
filepath=""
def run():
    global filepath
    print "<<<<<<=====-------------Restart-------------=====>>>>>>"
    py=code.get(1.0,END)
    if filepath=="":
        filepath=tkFileDialog.asksaveasfilename()
        if ".py" not in filepath:
            filepath=filepath+".py"
    script=open(filepath, "w")
    script.write(py)
    script.close()
    p = subprocess.Popen(['python', filepath],
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT,
                         )
    for line in iter(p.stdout.readline, ''):
        print line
    print "<<<<<<=====-------------EXECUTION FINISHED-------------=====>>>>>>"
root = Tk()
code=ScrolledText.ScrolledText(root)
code.pack()
run=Button(root,text="Run", command=run)
run.pack()
root.mainloop()

1 个答案:

答案 0 :(得分:1)

是的,只需使用subprocess模块。

一次性输出

import subprocess

output = subprocess.check_output(['python', filepath])

如果要从被调用的进程中捕获标准错误以及标准输出,请改为使用它:

output = subprocess.check_output(['python', filepath], stderr=subprocess.STDOUT)

或者如果你想分别捕捉它们:

p = subprocess.Popen(['python', filepath],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE,
                     )
out, err = p.communicate()

获取产出后的输出

这为您提供了逐行合并的stdout和strerr输出:

p = subprocess.Popen(['python', filepath],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT,
                     )

for line in iter(p.stdout.readline, ''):
    # process the line

保持用户界面响应

如果在与GUI相同的线程上运行上述代码,则在等待每一行时,实际上阻止了Tk的事件循环运行。这意味着虽然您实时获取每一行并将其写入GUI,但在事件循环再次运行之前它不会更新显示,并处理您对Tk的所有调用。

您需要在新线程上运行子流程代码,并在GUI线程中定期检查新输入。

我已经为你做了一个基于你的例子,你可以在这里找到它:

http://pastebin.com/FRFpaeJ2