Seite 1 von 1

Python Script in Terminal starten und Terminal offen lassen

Verfasst: 07.01.2020 11:38
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$)

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 07.01.2020 12:45
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

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 07.01.2020 13:34
von legion
Vielen lieben Dank für diese ausführliche Unterstützung !!!!
Ich werde das jetzt mal testen !
Vielen vielen Dank !!!!

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 07.01.2020 16:19
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 !!!!

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 07.01.2020 17:10
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.

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 07.01.2020 17:50
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.

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 07.01.2020 22:37
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 !!!

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 08.01.2020 11:11
von NicTheQuick
In der Ausbildung würdest du die Dinge ja alle lernen. Also gib nicht verfrüht damit auf. :allright:

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 08.01.2020 19:02
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

Re: Python Script in Terminal starten und Terminal offen las

Verfasst: 08.01.2020 19:47
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.