Ausgabe von Prozess bei startDetached abfangen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
JakobDev
User
Beiträge: 63
Registriert: Mittwoch 17. Juli 2019, 17:20

Da mein Programm etwas komplizierter ist, habe ich folgenden Beispielcode geschrieben, um mein Problem darzustellen:

Code: Alles auswählen

from PyQt5.QtWidgets import QPlainTextEdit, QTabWidget, QWidget, QPushButton, QApplication
from PyQt5.QtCore import QProcess
import subprocess
import sys

class GameOutputTab(QPlainTextEdit):
    def dataReady(self):
        cursor = self.textCursor()
        cursor.movePosition(cursor.End)
        cursor.insertText(bytes(self.process.readAll()).decode(encoding=sys.stdout.encoding,errors="replace"))
        self.ensureCursorVisible()

    def executeCommand(self):
        self.setReadOnly(True)
        self.process = QProcess(self)
        self.process.readyRead.connect(self.dataReady)
        self.process.start("ping",["example.com"])

class TabWindow(QTabWidget):
    def setup(self):
        widget = QWidget()
        button = QPushButton("Klick mich!",widget)
        button.clicked.connect(self.runGame)
        self.addTab(widget,"General")

        self.show()

    def runGame(self):
        output = GameOutputTab()
        tabid = self.addTab(output,"Output")
        self.setCurrentIndex(tabid)
        output.executeCommand()

app = QApplication(sys.argv)
tabs = TabWindow()
tabs.setup()
sys.exit(app.exec_())
Das Programm nimmt den Output eines Prozesses (in diesem Beispiel ping) und zeigt ihn in einem Textfeld an. Mein Problem dabei ist, das der Prozess (im Beispiel also ping) beendet wird, wenn das Programm geschlossen wird. Das möchte ich gerne verhindern. Dazu habe ich die Funktion startDetached gefunden. Wenn ich start durch startDetached ersetze, läuft der Prozess auch noch weiter, wenn das Programm geschlossen wird. Ich kann allerdings den Output nicht mehr abfangen. Dieser landet in der Konsole. Wie löse ich das Problem?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist leider gegenseitig aussschliessend. Detached bedeutet faktisch, dass der Prozess die Pipelines zum Eltern-Prozess kappt. Darueber kann also auch nix mehr kommen. Workarounds bestaenden darin, einen detachten Hilfsprozess zu starten, der mit benamten Pipes arbeitet, und *der* startet dann einen nicht-detachten Prozess & greift die Daten ab, und schickt sie via benamter Pipes an die Grossmutter.
Antworten