Seite 1 von 1

Ausgabe von Prozess bei startDetached abfangen

Verfasst: Sonntag 24. Mai 2020, 13:04
von JakobDev
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?

Re: Ausgabe von Prozess bei startDetached abfangen

Verfasst: Sonntag 24. Mai 2020, 14:19
von __deets__
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.