ubuntuusers.de

Aus Python-Programm Terminal öffnen

Status: Gelöst | Ubuntu-Version: Lubuntu 16.04 (Xenial Xerus)
Antworten |

Larry0201

Anmeldungsdatum:
5. September 2017

Beiträge: Zähle...

Ich möchte aus meinen PyQt5 Programm das Terminal öffnen, bzw. wenn man das Programm schließt die Shell/Terminal aufgeht. Habe es bis jetzt über os.system probiert, allerdings haben jegliche Eingaben bezüglich Strg+Alt+F1-8/T nicht funktioniert. Am liebsten wäre mir ein Befehl, den ich in os.system Eingeben kann.

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: 2943

Beschreibe bitte, was du erreichen möchtest und nicht wie. Möglicherweise gibt es ganz andere Lösungsansätze.

Wieso muss es eine virtuelle Konsole sein? Oder anders gefragt, wieso reicht dir LXTerminal nicht?

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

Larry0201 schrieb:

Ich möchte aus meinen PyQt5 Programm das Terminal öffnen,

QProcess nutzt man dafür

Larry0201 schrieb:

Am liebsten wäre mir ein Befehl, den ich in os.system Eingeben kann.

Dazu müßtest Du wissen welches Terminal Programm Du benutzt. In xfce z.B.

os.system("xfce4-terminal")

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Habe es bis jetzt über os.system probiert

  1. Ist os.system() veraltet und sollte nicht mehr benutzt werden. Das subprocess Modul ist besser. Steht so auch quasi wörtlich in der Python-Doku.

2. Funktioniert das so nicht, weil os.system() "blocking" ist - heißt, der Befehl blockiert die Ausführung des Skripts so lange, bis der Terminal geschlossen wird - und damit würde auch das Ende deines Programms geblockt 3. Mit subprocess.Popen() kannst du grundsätzlich einen Befehl non blocking ausführen.

allerdings haben jegliche Eingaben bezüglich Strg+Alt+F1-8/T nicht funktioniert.

Damit schaltest du zwischen virtuellen Konsolen um. In einem Terminalfenster bewirkt das nichts.

Grundsätzlich würde ich es auch als "unerwartetes" Verhalten bezeichnen, wenn eine GUI-Anwendung beim Beende Auto-magisch einen Terminal öffnet...

Gruß, noisefloor

Larry0201

(Themenstarter)

Anmeldungsdatum:
5. September 2017

Beiträge: 5

apt-ghetto schrieb:

Beschreibe bitte, was du erreichen möchtest und nicht wie. Möglicherweise gibt es ganz andere Lösungsansätze.

Wieso muss es eine virtuelle Konsole sein? Oder anders gefragt, wieso reicht dir LXTerminal nicht?

Das Ziel, ist ein Beaglebone, der direkt das PyQt5 Programm beim hochfahren öffnet, ohne einen anderen Desktop im Hintergrund und wenn das Programm geschlossen wird, soll das Terminal aufgehen. Möchte damit die Laufzeit für Hochfahren, sowie innerhalb der Gui verringern

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@Larry0201: Kann es sein das wir nicht von einem Terminal(emulator) öffnen reden, sondern das Du gerne zu einer Textkonsole wechseln möchtest‽

Larry0201

(Themenstarter)

Anmeldungsdatum:
5. September 2017

Beiträge: 5

Marc_BlackJack_Rintsch schrieb:

@Larry0201: Kann es sein das wir nicht von einem Terminal(emulator) öffnen reden, sondern das Du gerne zu einer Textkonsole wechseln möchtest‽

Da beide auf das gleiche Dateisystem zugreifen,ist es vom Prinzip egal - also es geht beides.

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

Kannst Du nicht vielleicht dein Python Programm von der Textkonsole starten, dann müsste es ja nach dem Beenden dorthin zurückkehren.

Larry0201

(Themenstarter)

Anmeldungsdatum:
5. September 2017

Beiträge: 5

Axel-Erfurt schrieb:

Kannst Du nicht vielleicht dein Python Programm von der Textkonsole starten, dann müsste es ja nach dem Beenden dorthin zurückkehren.

Leider nein. Da die Gui beim Start, wie sonst ein Desktop seien soll.

Habe aber inzwischen 2 verschiedene Lösungen gefunden 1. os.system("xterm") 2. Unter Autostart Einstellungen zuerst das Terminal und dann die Gui hinzufügen

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: 2943

Wenn ich dich richtig verstehe, möchtest du das System starten und nach dem Login des Nutzers, wird dein Programm anstelle eines Desktops geladen? Beendet sich deine graphische Applikation, dann ist der Nutzer wieder in seiner Loginshell?

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Habe aber inzwischen 2 verschiedene Lösungen gefunden 1. os.system("xterm")

Die Lösung ist nicht gut. Grund: siehe mein vorheriger Post.

Gruß, noisefloor

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

in PyQt5

oben

1
from PyQt5.QtCore import QProcess

dann

1
2
process = QProcess()
process.execute("xterm")

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

@Axel-Erfurt: Warum? Ich meine es ist ja schön das es QProcess gibt, aber davon wird doch hier überhaupt nichts benutzt was subprocess.call() nicht auch machen würde.

Und alle drei ”Lösungen” haben das Problem, dass sie nicht funktionieren wenn man das Programm schliesst. Genau dann soll ja laut OP das Terminal kommen. Nur wenn man eine der drei Möglichkeiten verwendet, schliesst sich das Programm nicht, denn es muss ja weiterlaufen solange bis das externe Programm beendet ist.

@Larry0201: Wobei mir immer noch nicht klar ist, was das eigentlich letztendlich bringen/lösen soll.

Axel-Erfurt

Anmeldungsdatum:
18. Mai 2016

Beiträge: 1347

Marc_BlackJack_Rintsch schrieb:

Und alle drei ”Lösungen” haben das Problem, dass sie nicht funktionieren wenn man das Programm schliesst.

Ich habe es gerade noch mal getestet und wenn mann startDetached verwendet funktioniert es.

1
2
3
4
5
    def closeEvent(self, event):
        process = QProcess()
        process.startDetached("xfce4-terminal")
        print("Goodbye -- starting Terminal")
        event.accept()

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

@BlackJack: subprocess.Popen() ist doch non-blocking, damit wird der Ablauf des Hauptprogramms nicht gestoppt?!

Gruß, noisefloor

Antworten |