Сигнал Python PyQt5 для того, чтобы стандартный вывод не работал

Я испытываю довольно странную ошибку. Я пытаюсь перенаправить вывод QProcess в textbrowser.append() в режиме отладки он работает в VS и VSCode, но не работает в режиме выпуска. Сигналы readyReadStandardError и readyReadStandardOut не выдают сигнал во время процесса. Только когда оно закончилось. Но мне нужно, чтобы он излучал сигнал во время процесса.

я пробовал все вроде

  • поиск проблем в каналах (setProcessChannelMode(QtCore.QProcess.ForwardedOutputChannel) работает и печатает в режиме реального времени в main.sys.stdout, но мне нужен только стандартный вывод из Qprocess для передачи в QtextBrowser. Когда я переключаю канал на отдельные каналы или объединенные каналы я не получаю выход.
  • Пробовал разные методы сигналов (-started(), -errorOccured())

мой код выглядит так:

    self.process = QtCore.QProcess()
    self.process.setProgram("python")
    self.process.setArguments(["run.py"])

    #both not working when no debugging mode in VSCode
    #self.process.readyReadStandardError.connect(self.on_readyReadStandardError)
    #self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)

    #ForwardedOutputChannel is working
    self.process.setProcessChannelMode(QtCore.QProcess.ForwardedOutputChannel)

    #another try not working
    #self.process.setReadChannel(QtCore.QProcess.StandardOutput)

    #tried here a different signal with no luck
    #self.process.started.connect(self.on_readyReadStandardOutput)
    
    self.pushButton.clicked.connect(self.accepted)

  #starting process on button click
  def accepted(self):
    self.process.start()

  #what to do when readyReadStandardOutput signal is emitted - i did the same for stderr
  def on_readyReadStandardOutput(self):
    print("hi") #test if the signal is being send
    out = self.processSubscribe.readAllStandardOutput().data().decode().strip()
    self.textBrowser.append(out)

РЕДАКТИРОВАТЬ здесь у вас есть небольшой фрагмент для тестирования:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser.setObjectName("textBrowser")
        self.gridLayout.addWidget(self.textBrowser, 1, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))

        self.process = QtCore.QProcess()
        self.process.setProgram("python")
        self.process.setArguments(["[INPUT PATH TO FILE]\\run.py"])

        #both not working when no debugging mode in VSCode
        self.process.readyReadStandardError.connect(self.on_readyReadStandardError)
        self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)

        #ForwardedOutputChannel is working
        #self.process.setProcessChannelMode(QtCore.QProcess.ForwardedOutputChannel)

        self.pushButton.clicked.connect(self.accepted)

    #starting process on button click
    def accepted(self):
        self.process.start()

  #what to do when readyReadStandardOutput signal is emitted - i did the same for stderr
    def on_readyReadStandardOutput(self):
        print("hi") #test if the signal is being send
        out = self.process.readAllStandardOutput().data().decode().strip()
        self.textBrowser.append(out)

    def on_readyReadStandardError(self):
        err = self.process.readAllStandardError().data().decode().strip()
        self.textBrowser.append(err)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

run.py выглядит так (внешняя программа python для QProcess)


import time
for i in range(5):
    print(i)
    time.sleep(1)

просто скопируйте и попробуйте сами

Попробуйте изменить run.py на его полный путь, например /path/of/run.py

eyllanesc 18.12.2020 17:38

пожалуйста, предоставьте минимальный воспроизводимый пример

eyllanesc 18.12.2020 18:06

Я сделал подсказку, которую вы мне дали, и это действовало очень странно. Он работал, но почему-то перестал работать. Компьютеры иногда действительно странные. Но вот тебе @eyllanesc

hamze55_ 18.12.2020 20:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
297
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел ответ прямо здесь. У меня есть editet run.py со строкой

sys.stdout.flush()

так:

import time
for i in range(5):
  print(i)
  sys.stdout.flush()
  time.sleep(1)

Другие вопросы по теме