Python Script in Terminal starten und Terminal offen lassen

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Python Script in Terminal starten und Terminal offen lassen

Beitrag von legion »

Hallo meine Freunde !
Ich tüftle wieder mal seit Tagen an einem Problem und komme nicht dahinter.
Ich möchte einen Python Script im Terminal starten was auch funktioniert aber
das Terminal schließt sich sofort wieder.
Es sollte offen bleiben mit der Meldung:
------------------
(program exited with code: 0)
Press return to continue

So wie es super funktioniert bei Geany oder anderen Editoren.
Ihr habt sicher die Lösung für mich ! Danke !

Code: Alles auswählen

MyProg = RunProgram("x-terminal-emulator","-e python /home/user/MyPython/colorTerm.py", "/home/user/MyPython", #PB_Program_Open | #PB_Program_Read)
  Rueckgabe$ = ""
  If MyProg
    While ProgramRunning(MyProg)
      If AvailableProgramOutput(MyProg)
        Rueckgabe$ + ReadProgramString(MyProg) + Chr(13)
      EndIf
    Wend
    Rueckgabe$ + "Exitcode: " + Str(ProgramExitCode(MyProg))   
    CloseProgram(MyProg)
  EndIf
  MessageRequester("Rueckgabe", Rueckgabe$)
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
Macros
Beiträge: 1314
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von Macros »

Hallo legion,

x-terminal-emulator schließt sich sofort nachdem ein Befehl ausgeführt wurde, (mit --hold lässt sich das verhindern)
Also müssen wir dafür sorgen, dass der Befehl die Ausgabe enthält. Das geht mit dem Linux Befehl read.

Code: Alles auswählen

cmd$=~" -e bash -c \"python /usr/share/doc/python-docopt/examples/arguments_example.py ; read -n1 -r -p 'Press Return To Continue...'\" "
MyProg = RunProgram("x-terminal-emulator",cmd$, "", #PB_Program_Open | #PB_Program_Read)
  Rueckgabe$ = ""
  If MyProg
    While ProgramRunning(MyProg)
      If AvailableProgramOutput(MyProg)
        Rueckgabe$ + ReadProgramString(MyProg) + Chr(13)
      EndIf
    Wend
    Rueckgabe$ + "Exitcode: " + Str(ProgramExitCode(MyProg))   
    CloseProgram(MyProg)
  EndIf
  MessageRequester("Rueckgabe", Rueckgabe$)
Es wird eine Bash Shell ausgeführt, die zuerst dein Python Program aufruft und dann die Meldung anzeigt und auf die Taste wartet. Aber du willst ja auch den Exit Code,
und da wird es nun kompliziert, denn du bekommst den von x-terminal-emulator, und der wird stehts null sein außer dein Pythonprogram bringt ihn zum Abstürtzen ;)

Was du willst ist wahrscheinlich gleich ein Konsolenprogramm schreiben.

Code: Alles auswählen

OpenConsole()
MyProg = RunProgram("/usr/bin/python","/home/user/MyPython/colorTerm.py", "/home/user/MyPython", #PB_Program_Open | #PB_Program_Read)
  Rueckgabe$ = ""
  If MyProg
    While ProgramRunning(MyProg)
      If AvailableProgramOutput(MyProg)
        output$=ReadProgramString(MyProg) 
         ; zeige die Ausgabe direkt an
        PrintN(output$)
        ; Und hänge sie mit Zeilenumbruch an die Variabel Rückgabe
        Rueckgabe$+output$+#CRLF$ 
      EndIf
      Delay(1) ; Damit dein Code die CPU nicht auslastet
    Wend
    
    PrintN("(program exited with code: "+Str(ProgramExitCode(MyProg))+")")
    PrintN("Press return to continue")
    Input()
    CloseProgram(MyProg)
  EndIf
Nicht wundern, unter Linux passiert (scheinbar) nichts, wenn du das startest.
Das liegt daran, das Purebasic unter Windows beim kompilieren eines Consolenprograms ein Konsolenfenster öffnet.
Unter Linux musst du das selbst.

Du kannst dir z.B. ein Werkzeug anlegen (Werkzeuge->Werkzeuge konfigurieren)
Als Kommandozeile gibst du
x-terminal-emulator
an, als Argumente
-e "%EXECUTABLE"
Als Name was du willst und als Auslöser z.B. "Nach dem erstellen des Executable" oder einfach ein Tastenkürzel.
Jetzt kannst du das Programm kompilieren und bequem aus der Purebasic IDE testen.

Du kannst es natürlich auch von Hand in der Konsole starten.

Edit: Das geht auch wesentlich einfacher indem man in den Compileroptionen das "Executable Format" auf "Console" umstellt. Danke NicTheQuick
Zuletzt geändert von Macros am 07.01.2020 17:54, insgesamt 2-mal geändert.
Bild
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von legion »

Vielen lieben Dank für diese ausführliche Unterstützung !!!!
Ich werde das jetzt mal testen !
Vielen vielen Dank !!!!
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von legion »

Du bist ein Chef !!!!
Bitte wie kommt man zu so einer Befehlszeile ?

Code: Alles auswählen

cmd$=~" -e bash -c \"python /home/user/MyPython/colorTerm.py ; read -n1 -r -p 'Press Return To Continue...'\" "
Ich hab seit gestern stundenlang im Netz nach einer Lösung gesucht und unzählige Befehle getestet, keiner hat funktioniert.
Hut ab und vielen Dank !!!!
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von NicTheQuick »

Da 'read' ein nativer Bash-Befehl ist, gibt man im Terminal dafür einfach 'help read' ein. Für alles andere gibt es man.
Macros hat geschrieben:Nicht wundern, unter Linux passiert (scheinbar) nichts, wenn du das startest.
Das liegt daran, das Purebasic unter Windows beim kompilieren eines Consolenprograms ein Konsolenfenster öffnet,
unter Linux musst du das selbst.
Das ist nicht ganz richtig. Wenn man das Executable-Format in den "Compiler-Optionen" auf "Console" stellt und 'OpenConsole()' nutzt, dann geht auch ein Fenster auf, ohne dass man sich zunächst ein Werkzeug basteln muss.
Bild
Benutzeravatar
Macros
Beiträge: 1314
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von Macros »

Danke Nic, wieder was gelernt. Kommt mir sehr gelegen,
da ich selbst immer den obigen Umweg gewählt habe.
Ich passe gleich meinen ersten Beitrag an.

@legion:
Wie man zu solchen Zeilen kommt? Das lernt man mit der Zeit wenn man unter Linux experimentiert. Den Trick bash mit einer Befehlssequenz aufzurufen kann man unter Linux öfters brauchen.
Du kannst da auch noch beliebig weiterbauen. z.B.

Code: Alles auswählen

cmd$=~"  -e bash -c \""+                                                          ; wir starten Bash mit einer Befehlssequenz als Parameter. 
                                                                                  ; Das \" leitet die Befehle ein, in der Variable steht dann :  -e  bash -c "{Befehle die gleich folgen}"
     "python /usr/share/doc/python-docopt/examples/arguments_example.py ; "+      ; Wir rufen dein Python Programm auf
     ~"exitcode=$?; echo exit code was $exitcode;"+                               ; Der Exit Code wird in die bash-Variable exitcode gespeichert und dann zeigt echo die Meldung
     ~"read -n1 -r -p 'Press Return To Continue...';"+                            ; Wir warten auf das Return , -n 1=1 zeichen lesen, -r = erlaube keine Escapesequenzen, -p = Zeige folgende Meldung
     ~"\" "                                                                       ; Abschließende Anführungszeichen für bash
Befehle werden jeweils durch einen ; getrennt. Du kannst auch befehle mit anderen Zeichen voneinander abhängig machen:
Befehl 1 && Befehl 2
heißt in Bash: Führe Befehl 2 nur aus, wenn Befehl 1 einen Exitcode von 0 hatte, also erfolgreich war.
Mehr dazu hier.
Wie man Hilfe zu Befehlen findet hat NicTheQuick schon gesagt, die Befehle selbst, wie z.B. read findest du am besten mit Google und dem Stichwort bash.


Allerdings als Warnung: Bash ist alles andere als eine schöne Programmiersprache. Und langsam zudem. Allerdings auch sehr nützlich zu kennen,
da man sie auf nahezu jedem Linux verfügbar hat, und sei es das auf dem Raspberry Pi, deinem Smart TV von Samsung oder gar deiner Kaffemaschine ;)
Doch allgemein erledige lieber möglich viel in Purebasic und anderen richtigen Programmiersprachen.
Bild
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von legion »

Danke für die tolle Schulung ! :mrgreen: :mrgreen: :mrgreen:
Ich dachte ich bin gut auf Linux und wollte schon die Ausbildung zum
Linux-Admin machen. Jetzt ist mir klar, ich hab keine Ahnung und sollte
lieber eine Tischler Lehre machen.

DANKE !!!
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von NicTheQuick »

In der Ausbildung würdest du die Dinge ja alle lernen. Also gib nicht verfrüht damit auf. :allright:
Bild
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von legion »

Danke für die Motivation !!!!
Ich bin schon 55 Jahre alt und werde nach 33 Dienstjahren bei Opel in Wien
meinen Job als Industrieelektroniker verlieren - PSA sei Dank.
Jetzt hab ich die Möglichkeit und kann mir eine neue Ausbildung aussuchen.
Sollte natürlich auch am Arbeitsmarkt gefragt sein denn mit 55 ist es nicht mehr leicht.

Vorschläge werden gerne angenommen, aber bitte nicht im Pflegebereich, was technisches
sollte es schon sein !

LG
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Python Script in Terminal starten und Terminal offen las

Beitrag von mk-soft »

Als Industrieelektroniker hast du eine gute Basis
dich als SPS Programmierer weiterbilden zu lassen.

Somit kommst du den dem Zertifikaten als Programmierer für SPS und Visualisierung
ohne eine neue Ausbildung anfangen zu müssen.

Ich arbeite in einer kleinen Firma schon über 24 Jahre als SPS Programmierer
und habe leider verpasst mir die Zertifikate bei Siemens zu machen...

Mit unseren alten Vertreter von Siemens hätte ich diese sofort bekommen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten