python - readyReadStandardOutput 信号不起作用
问题描述
我正在尝试使用 PyQt5 QProcess 类从子进程中获取标准输出输出。如果我使用 waitForFinished(),QMainWindow 将被冻结。但是信号 readyReadStandardOutput 不起作用,尽管进程已启动。这是我的代码:
启动.py
from PyQt5.QtCore import QDir, QObject, QProcess
import settings_store
import os.path
import sys
class Getter(QObject):
process = QProcess()
output = ''
def __init__(self):
super().__init__()
self.process.setProcessChannelMode(QProcess.MergedChannels)
self.process.readyReadStandardOutput.connect(self.ready)
def start(self):
templates_folder = QDir(templates_path())
for template in templates_folder.entryList(['*.py'], QDir.Files):
self.process.start(sys.executable, [file_(template), 'on_startup'])
def ready(self):
self.output = bytes(self.process.readAllStandardOutput()).decode('UTF-8').strip()
print(self.output, 'yeah')
# constants
def templates_path():
return os.path.join(settings_store.settings_path(), settings_store.directory(), 'templates')
def file_(template):
return os.path.join(templates_path(), template)
greetings_template.py - 模板文件夹中的文件
import sys
import time
def on_startup():
print('Can we wait a bit?')
time.sleep(5)
count = 0
while count < 5:
time.sleep(1)
print("waiting now too")
count += 1
print('jeff.find_reagent hello')
if sys.argv[1] == 'on_startup':
on_startup()
解决方案
当您进行迭代时,您正在使用相同的QProcess
消除先前不正确的任务,您必须做的是为您启动QProcess
的每个.py
文件创建一个新文件,另一方面要返回结果,您必须创建一个信号,因为它没有你知道你在什么时候得到结果。
启动.py
import sys
import os.path
from PyQt5.QtCore import QDir, QObject, QProcess, pyqtSlot, pyqtSignal
import settings_store
class Getter(QObject):
resultChanged = pyqtSignal(str)
def start(self):
templates_folder = QDir(templates_path())
for template in templates_folder.entryList(['*.py'], QDir.Files):
process = QProcess(self)
process.setProcessChannelMode(QProcess.MergedChannels)
process.readyReadStandardOutput.connect(self.ready)
process.start(sys.executable, [file_(template), 'on_startup'])
@pyqtSlot()
def ready(self):
process = self.sender()
output = bytes(process.readAllStandardOutput()).decode('UTF-8').strip()
print(output, 'yeah')
self.resultChanged.emit(output)
# constants
def templates_path():
return os.path.join(settings_store.settings_path(), settings_store.directory(), 'templates')
def file_(template):
return os.path.join(templates_path(), template)
主文件
from PyQt5.QtWidgets import *
from startup import Getter
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
button = QPushButton("Press me")
textEdit = QTextEdit()
widget = QWidget()
self.setCentralWidget(widget)
lay = QVBoxLayout(widget)
lay.addWidget(button)
lay.addWidget(textEdit)
getter = Getter(self)
getter.resultChanged.connect(textEdit.append)
button.clicked.connect(getter.start)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
推荐阅读
- python - Python 如何销毁垃圾?
- c# - 如何使用异步技巧在 C# 中处理 IO 和 CPU 混合绑定任务?
- corda - build\nodes\runnodes 有问题
- javascript - 如何循环遍历 div?
- azure - 如何在 .net core 3.1 中使用 log4net 将日志保存在 blob 文本文件中
- xaml - Xamarin DataGrid 标题垂直向下
- c# - 保护内存中的对称加密密钥
- c# - IAsyncEnumerable 不包含 ADO.NET 中“GetAwaiter”的定义
- html - 授权函数的thymeleaf语法
- jmeter - 事务控制器中的实际失败消息(如果它由多个采样器组成)