如何将子流程脚本输出到GUI?

时间:2019-03-25 07:01:55

标签: python user-interface tkinter subprocess output

我正在努力将输出从另一个GUI转换为GUI。 我知道也有类似的帖子,但是在不知情的情况下,我无法解决问题。

我有一个使用os.system的脚本来从mdadm调用信息-有关我的RAID阵列的详细信息。我还为带有子流程的GUI提供了一个简单的小型脚本,因此该按钮将调用该脚本。但是我无法将其输出到另一个GUI窗口。

这是我的os.system脚本。

import os
os.system("sudo mdadm -D /dev/md0 | grep -A 3 State && grep -A 3 RaidDevice")

另一个脚本是我无法调整的简单GUI,以获得我想要的结果。

from tkinter import *
from tkinter import messagebox
top = Tk()

top.title('RAID Status')
top.geometry("250x160")

def raidStat():
   import subprocess
   subprocess.call(['./raidScripts/mdadmRaid.py'])

button1 = Button(top, text = "Check Status", command = raidStat)
button1.grid(row=1,column=0)

top.mainloop()

os.system脚本在终端中运行,并在文本编辑器中返回结果。

就GUI的输出而言,我什么也做不了,因为我不知道代码。

1 个答案:

答案 0 :(得分:0)

您的脚本要做的最小更改:

from tkinter import *
from tkinter import messagebox
top = Tk()

top.title('RAID Status')
top.geometry("250x160")

def raidStat():
   import subprocess
   myproc = subprocess.run(['./raidScripts/mdadmRaid.py'], stdout=subprocess.PIPE)
   messagebox.showinfo("Result", myproc.stdout)

button1 = Button(top, text = "Check Status", command = raidStat)
button1.grid(row=1,column=0)

top.mainloop()

请注意,我们现在将stdout重定向到subprocess.PIPE,并使用创建的流程对象的stdout属性访问其内容。从Python 3.7开始,您可以仅用subprocess.run()调用capture_output=True而不是处理stdout(和/或stderr)。

与您的代码一样,脚本输出并未被Python完全触摸到。这就是为什么您可以在控制台上看到它,但是无法访问它以在GUI中显示它的原因。