Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将子流程脚本输出到GUI?_Python_User Interface_Tkinter_Subprocess_Output - Fatal编程技术网

Python 如何将子流程脚本输出到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 &&

我正在努力将输出从另一个GUI转换为GUI。 我知道也有类似的帖子,但如果没有这些知识,我就无法对我的问题做出正面或反面的解释

我有一个使用os.system从mdadm调用信息的脚本——关于我的RAID阵列的详细信息。我还有一个简单的小脚本,用于带有子流程的GUI,因此按钮将调用该脚本。但我无法让它将代码输出到另一个GUI窗口

这是我的操作系统脚本

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
的完整路径。