我正在使用PyQt5中的图形用户界面在Python中构建应用程序。我需要在应用程序中插入某种“终端控制台”。用户可以通过单击按钮启动批处理文件,并且应该看到输出显示在文本字段中。
此时,我使用以下方法。当用户按下按钮时,程序将启动批处理脚本(例如“myBat.bat”)。提取标准输出并将其写入QTextEdit小部件。
这很有效,但有两个严重的问题。
(问题1)输出显示在批处理执行结束时..
这有时真的很痛苦。特别是如果bat文件需要一些时间来执行,用户会得到一切都冻结的印象。
(问题2)用户无法发出命令..
某些bat文件需要用户输入。我不知道如何做到这一点。
(问题3)批处理文件完成后,结束了..
有时用户希望继续向终端发出命令,即使批处理文件已完成。例如,一个简单的dir
命令,用于列出目录中的文件。一切皆有可能。
总结一切,我只需要在我的应用程序中创建一个功能终端控制台。
有一个人将QTermWidget移植到PyQt4。这是链接: https://sourceforge.net/projects/qtermwidget/?source=typ_redirect。不幸的是他的代码不是为Windows编译的(我正在使用Windows 10机器)。他的端口是为PyQt4制作的。我的整个应用程序都是用PyQt5编写的。我有理由不能回到PyQt4。
另一个人制作了这个软件: https://bitbucket.org/henning/pyqtermwidget/overview。同样非常有趣,但没有Windows支持。
请帮助..
编辑:
这是我目前正在运行的代码:
###############################################
### This function gets called when the user ###
### pushes the button ###
###############################################
def myBatFunction(self):
# 1. Call the proper batch file
p = Popen("C:\\..\\myFolder\\myBat.bat" , cwd=r"C:\\..\\myFolder", stdout = subprocess.PIPE, stderr = subprocess.PIPE)
stdout, stderr = p.communicate()
p.wait()
if p.returncode == 0:
pass
else:
return
# 2. Capture the standard out stream from the batch file
msg = stdout.decode("utf-8")
errMsg = stderr.decode("utf-8")
self.myTextArea.setText(msg + errMsg)
###############################################
编辑:如果您认为这是一个重复的问题,请先验证其他问题是否为Windows 10用户提供解决方案,并与PyQt5配合使用: - )
答案 0 :(得分:1)
在您的代码中p.wait()
是与已打开进程同步的点。在该行之后,外部过程完成。因此,您需要在该行之前的循环中阅读p.stout
。请检查以下示例:
#!/usr/bin/env python2
from subprocess import Popen, PIPE
p = Popen(["C:\\..\\myFolder\\myBat.bat"], stdout=PIPE, bufsize=1)
with p.stdout:
for line in iter(p.stdout.readline, b''):
print line,
p.wait() # wait for the subprocess to exit
请注意,bufsize
应为1
以禁止缓冲。