Python 如何将子流程脚本输出到GUI?
我正在努力将输出从另一个GUI转换为GUI。 我知道也有类似的帖子,但如果没有这些知识,我就无法对我的问题做出正面或反面的解释 我有一个使用os.system从mdadm调用信息的脚本——关于我的RAID阵列的详细信息。我还有一个简单的小脚本,用于带有子流程的GUI,因此按钮将调用该脚本。但我无法让它将代码输出到另一个GUI窗口 这是我的操作系统脚本Python 如何将子流程脚本输出到GUI?,python,user-interface,tkinter,subprocess,output,Python,User Interface,Tkinter,Subprocess,Output,我正在努力将输出从另一个GUI转换为GUI。 我知道也有类似的帖子,但如果没有这些知识,我就无法对我的问题做出正面或反面的解释 我有一个使用os.system从mdadm调用信息的脚本——关于我的RAID阵列的详细信息。我还有一个简单的小脚本,用于带有子流程的GUI,因此按钮将调用该脚本。但我无法让它将代码输出到另一个GUI窗口 这是我的操作系统脚本 import os os.system("sudo mdadm -D /dev/md0 | grep -A 3 State &&
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()
系统脚本在终端中工作,并在文本编辑器中返回结果
就GUI的输出而言,我无法获得任何其他工作,因为我不知道代码。您的脚本在这方面的最小更改:
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
属性访问其内容。从Python3.7开始,您可以使用capture\u output=True
调用subprocess.run()
,而不是处理stdout
(和/或stderr
)
正如在您的代码中一样,Python并没有触及脚本输出,所有这些都是由Python实现的。这就是为什么您可以在控制台上看到它,但无法访问它以在GUI中显示它的原因。Ok。这就像:import subprocess,然后subprocess.run使用应该获取输出的相同命令?使它更有可能与GUI一起工作,或者它仍然需要一些调整吗?我做了更改,但仍然收到与以前相同的错误消息,我是否丢失了某种包或关键信息位?Tkinter回调回溯中的异常(最近一次调用):File“/usr/lib/python3.5/Tkinter/uu init_uuuuuuuu.py”,第1562行,在调用返回self.func(*args)文件“/home/pi/Desktop/raidScripts/mdadmStatus.py”的第12行中,在raidStat myproc=subprocess.run(['./raidScripts/mdadmadmadmraid.py'],stdout=subprocess.PIPE)文件“/usr/lib/python3.5/subprocess.py”,第383行中,与Popen(*Popen,**kwargs,**kwargs)一起作为进程运行:文件“/usr/lib/python3.5/subprocess”,第676行,在init restore\u signals中,启动新会话)文件“/usr/lib/python3.5/subprocess.py”,第1282行,在执行子进程引发子进程异常类型(errno\u num,err\u msg)文件notfounderror:[errno 2]没有这样的文件或目录:'./raidScripts/mdadmRaid.py”中,对多条消息表示歉意。尝试添加
print(os.getcwd())
(当然,在调用subprocess.run()
之前需要导入os
)。请注意mdadmRaid.py
与mdadmStatus.py
位于同一目录中,因此os.getcwd()的结果
将是/home/pi/Desktop/raidScripts
。因此,建议将/raidScripts/mdadmRaid.py
更改为mdadmRaid.py
。将这两个脚本放在一起并不是问题的原因。问题是您使用了错误的路径。您可以使用脚本路径=os获取主脚本的目录名.path.dirname(os.path.abspath(_文件__;))
然后使用os.path.join(脚本路径,'mdadmRaid.py')
构造mdadmRaid.py
的完整路径。