michahe
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 789
|
Hallo, mein .desktop-Starter für ein PYTHON-Skript:
[Desktop Entry]
Comment=mein Skript ...
Exec=python3 "/Pfad/Skript.py"
GenericName=PYTHON ...
Name=SystemPY
NoDisplay=false
Icon=/Pfad/Icon.png
StartupNotify=true
Terminal=true
Type=Application
Das funktioniert, allerdings wird bei einem Laufzeitfehler das Konsolenfenster geschlossen. Wie kann ich es erhalten, um die Fehlermeldung lesen zu können? Danke, Michael
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28316
|
Hallo,
Das funktioniert, allerdings wird bei einem Laufzeitfehler das Konsolenfenster geschlossen. Wie kann ich es erhalten, um die Fehlermeldung lesen zu können?
Das ist das Standardverhalten. Wenn du in einem nicht-interkativen Terminal ein Skript startest schließt sich der Terminal wieder, wenn das Skript beendet ist. Der Grund für das Ende ist erstmal egal. Die sauberste Lösung wäre IMHO, wenn du eine Logdatei schreibst und darin protokolierst, was passiert. Alternativ kannst du den Fehler auch abfangen und dann das Skript was machen lassen, was den Terminal offen hält. Z.B. auf einen Nutzerinput warten. Welchen Fehler bekommst du denn? Im Idealfall tritt ja erst gar kein Fehler auf. Gruß, noisefloor
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 789
|
Danke, aber ... Welchen Fehler bekommst du denn? Im Idealfall tritt ja erst gar kein Fehler auf.
Das Skript liest Dateien aus einem im Skript definierten Verzeichnis. Nun hatte ich dessen Pfad geändert und vergessen, das Skript anzupassen. Aber im Allgemeinen kann so etwas passieren (und Abfangen wegen der potentiellen Vielfalt eher unmöglich) und mit einer Info an den Anwender unproblematisch. Wenn das Problem das nicht-interaktive Terminal
ist: Wie kann ich ein "aktives" für das PYTHON-Skript nutzen? Starte ich ein Terminal und das Skript darin mit
$ python3 "/Pfad/Skript.py"
wird der Fehler angezeigt ...
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28316
|
Hallo,
Wie kann ich ein "aktives" für das PYTHON-Skript nutzen?
In dem genau das machst, was du selber danach schreibst: händisch einen Terminal öffnen und das Skript händisch starten. Wie gesagt, wenn etwas automatisch starten sollen, dann muss man halt alle Fälle berücksichtigen, die ein Automatismus mitbringt. Ein Weg ist Logging.
Aber im Allgemeinen kann so etwas passieren (und Abfangen wegen der potentiellen Vielfalt eher unmöglich)
Na ja, man kann schon Unit Tests für sein Skript schreiben, um mögliche Fehler zu finden und zu beheben. Plus Python hat Mechanismen an Bord, mit denen man alle Fehler abfangen könnte. Das ist aber selten sinnvoll. Gruß, noisefloor
|
Marant--
Anmeldungsdatum: 4. April 2022
Beiträge: 680
|
Probiere mal Exec=konsole -e "python3 <Pfad_py>" Kannst auch anderes Tertminal nehmen "-e" wird sich mglw. unterscheiden. Habe mal Probiert. Das scheint zu gehen. Exec=konsole -e bash -c "python3 <Pfad_py>;read"
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 789
|
Danke Marant--, Habe mal Probiert. Das scheint zu gehen.
Exec=konsole -e bash -c "python3 <Pfad_py>;read"
Ich habe jatzt:
Exec=konsole NoDisplay=false -e bash -c "python3 /Pfad/Skript.py;read"
ohne Deine spitzen Klammern; was macht der Teil
;read
ohne den das Fenster im Fehlerfall doch geschlossen wird?
|
Marant--
Anmeldungsdatum: 4. April 2022
Beiträge: 680
|
Wartet nach Abschluss "python3 .." auf Eingabe und schließt somit Terminal noch nicht. read x
#da irgendwas eingeben/ Enter
echo $x <...> haben nur die Funktion v. ".." Da "..." aber schon besetzt ist ..
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28316
|
Hallo, IMHO ist das aber ein schlechter Workaround... Kann man doch alles im Pythonskript machen. Einfach eine ordentliche Fehlerbehandlung im Skript einbauen, den Fehler ausgeben und dann noch ein input('Zum Beenden Taste drücken') dahinter packen. Aber, wie gesagt, stilvollendet ist das nicht. Gruß, noisefloor
|
Marant--
Anmeldungsdatum: 4. April 2022
Beiträge: 680
|
Das wollte ich nicht schreiben. Vllt. hat er seine Gründe. ☺
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12527
|
Man kann sich ja ein kleines Helferlein pause-on-error basteln: | #!/bin/sh
"$@" || read -p 'error, press ENTER to exit' foo
|
Dann das als erstes in die Kommandozeile einfügen. Also Exec=pause-on-error python3 "/Pfad/Skript.py"
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 789
|
Danke rklm, Man kann sich ja ein kleines Helferlein pause-on-error basteln:
| #!/bin/sh
"$@" || read -p 'error, press ENTER to exit' foo
|
Dann das als erstes in die Kommandozeile einfügen. Also
Exec=pause-on-error python3 "/Pfad/Skript.py"
Vielleicht ist das ein Missverständnis? Wenn ich mein Skript per Kommandozeile
python3 "/Pfad/Skript.py
starte, ist ja alles OK. Egal ob ein Fehler in meinem Code ist oder ein Laufzeitfehler (mein Beispiel: Pfad existiert nicht) auftaucht, das Konsolenfenster bleibt offen und die Fehlermeldung ist lesbar. Aber ich möchte das Skript per .desktop starten: Dann wird im Fehlerfall das Fenster geschlossen, die Fehlermeldung ist nicht lesbar. Das wird mit dem Code von Marant--
Exec=konsole -e bash -c "python3 <Pfad_py>;read"
umgangen und löst mein Problem. Es ist meine erste reale Anwendung in Python und ich habe noch keine zehn Real-Anwendungen: Es wird also noch viele Fehlermöglichkeiten geben und ich möchte einfach nur die Meldungen lesen können. Und per .desktop starten ... Wenn es kein Missverständnis ist und Deine Exec-Zeile in die .desktop soll, wohin kommt dann der BASH-Code? Und was heißt 'foo'?
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5077
|
michahe schrieb: Wenn es kein Missverständnis ist
ist es nicht und Deine Exec-Zeile in die .desktop soll,
ja wohin kommt dann der BASH-Code?
In die Datei, dessen Pfad du mit "/Pfad/Skript.py" ersetzt. Und was heißt 'foo'?
Das ist nur ein beliebiger Variablenname. read speichert die Eingabe in einer Variable, aber den Wert der Eingabe brauchen wir nicht, weil es nur darum geht, dass der Nutzer zum Enter-Druecken bekommt damit das Fenster offen bleibt. Warum rklm das hinzugefuegt hat, weiss ich aber auch nicht. read braucht den Parameter ja nicht. rlkms Loesung hat den Vorteil, dass das Fenster nur offen bleibt, wenn ein Fehler aufgetreten ist und nicht immer.
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 789
|
Danke sebix, Wenn es kein Missverständnis ist
ist es nicht und Deine Exec-Zeile in die .desktop soll,
ja wohin kommt dann der BASH-Code?
In die Datei, dessen Pfad du mit "/Pfad/Skript.py" ersetzt.
Die letzte Zeile verstehe ich nicht. Ich habe bisher zwei Files:
Die .desktop, mit der Exec-Zeile
Exec=pause-on-error python3 "/Pfad/Skript.py
2. die Skript.py mit meinem Code Wohin soll der BASH-Code?
|
sebix
Moderator, Webteam
Anmeldungsdatum: 14. April 2009
Beiträge: 5077
|
michahe schrieb: Die letzte Zeile verstehe ich nicht. Ich habe bisher zwei Files:
Die .desktop, mit der Exec-Zeile
Exec=pause-on-error python3 "/Pfad/Skript.py
2. die Skript.py mit meinem Code Wohin soll der BASH-Code?
Du ersetze den Platzhalter /Pfad/Skript.py mit dem Pfad zu deinem bestehenden Skript. Das Skript pause-on-error von rklm muss natuerlich im Pfad liegen, also zB /usr/local/bin/pause-on-error .
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12527
|
sebix schrieb:
Das Skript pause-on-error von rklm muss natuerlich im Pfad liegen, also zB /usr/local/bin/pause-on-error .
... oder ~/bin/pause-on-error
|