Starten eines python-Programmes/ Tastenbelegung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
juergewa
User
Beiträge: 1
Registriert: Sonntag 17. Februar 2019, 11:16

Ich bin absoluter Programmierneuling und fange mit ganz einfachen Programmen an. Ich kann ein geschriebenes Programm zwar speichern und auch wieder aufrufen, aber ich habe ein Problem damit, das Programm zum Laufen zu bekommen. Das programm lautet: print('Bitte einen Text eingeben')
x = input()
print('Ihre Eingabe::' x)
Die Eingabeaufforderung kommt, aber wenn ich einen Text eingebe und dann auf enter drücke verschwindet das Fenster ( unter windows 1o). Habe ich einen Fehler im Programm ? Welche Taste muss ich nach der Eingabe drücken, damit das Programm weitergeht?
Jürgen
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dein Problem besteht im Verhalten von Windows: das per Doppelklick gestartete Programm tut seinen Dienst klaglos. Aber nach der letzten Anweisung ist es vorbei. Und was mach Windows dann? Es schließt das Fenster.

Da es sowieso gut ist, sich mit der kommandozeile vertraut zu machen, würde ich so vorgehen:

- starte CMD.EXE aus dem schnellstarter von Windows.
- navigiere mit cd zu der Stelle, an der dein Programm liegt.
- ruf es da auf.
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ juergewa :
1. bitte deinen code hier im forum zwischen die dafür vorgesehenen code-Tags schreiben. Dazu oberhalb des Editors auf den Button "</>" klicken.
2. schreibe deine Skripte immer so, dass ein dritter auch weiß, was du tust. Dafür sind Bezeichner wie 'x' eher unangebracht.
3. dein code ist auch nicht richtig.

Code: Alles auswählen

eingabe = input()
print("Ihre Eingabe :  ", eingabe)
wenn du jedesmal ans Ende eines Skriptes folgendes hängst :

Code: Alles auswählen

if(__name__ == "__main__"):
    print()
    print("Programm schliessen mit <Enter>")

dann bleibt das Fenster auch offen.
Ich habe mir beispielsweise eine Vorlagendatei "vorlage_script_neu.py" erstellt, die ich immer aufrufe und dann unter dem entsprechenden Namen speichere mittels STRG + Shift + s
die sieht so aus:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Autor: 
# Datum: 
# Dateiname :
# Sinn/Zweck :

#TO DO
"""
text
"""

#IMPORT
#from [modul] import */[Funktion]
#import [modul]


#FUNKTIONDEFINITIONEN
#class [name](object) :
#def [name](Parameter/Argumente) :


#KONFIGURATION


#ANWEISUNGEN


#ENDE
if(__name__ == "__main__"):
    print()
    print("Programm schliessen mit <Enter>")
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Perlchamp hat geschrieben: Sonntag 17. Februar 2019, 12:30 Ich habe mir beispielsweise eine Vorlagendatei "vorlage_script_neu.py" erstellt, die ich immer aufrufe und dann unter dem entsprechenden Namen
An sich ist dein Template recht gelungen. Allerdings ist es üblich, eine main-Funktion zu haben, die in dem 'if __name__ == '__main__' Block aufgerufen wird, statt den Code dort zu platzieren und oft als unterste Funktion direkt darüber steht. In Python braucht man (anders als in Perl) keine Klammern um die Bedingung. Die Import-Reihenfolge handhabe ich immer so, dass erst Standardbibliotheken kommen, dann 3rd Party Bibliotheken und dann eigene, sowie pro Block Importe ganzer Module vor "from" Importen (siehe: https://www.python.org/dev/peps/pep-0008/#imports); bei deinem Beispiel ist es anders rum.
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@nezzcarth :
danke für deine Hilfestellung und deine Tipps !
Habe es jetzt derart geändert :

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Autor:
# Datum:
# Datei:
# Zweck/Sinn:


#TO DO
"""
text
"""

#IMPORT
#import [modul]
#from [modul] import [Funktion]/*


#FUNKTIONDEFINITIONEN
#class [name](object) :
#def [name](Parameter/Argumente) :


#KONFIGURATION


#HAUPTPROGRAMM
if __name__ == "__main__" :
    main()

#ENDE
if __name__ == "__main__" :
    print()
    print("Programm schliessen mit <Enter>")
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Perlchamp hat geschrieben: Sonntag 17. Februar 2019, 12:30 wenn du jedesmal ans Ende eines Skriptes folgendes hängst :

Code: Alles auswählen

if(__name__ == "__main__"):
    print()
    print("Programm schliessen mit <Enter>")

dann bleibt das Fenster auch offen.
Dem ist nicht so. Mal abgesehen von den unueblichen Klammern um die Bedingung macht dieses Snippet nichts anders als der TE. Der __main__-Guard verhindert nur, dass dieser Code beim *importieren* ausgefuehrt wird.

Was du wohl meinst ist sowas hier:

Code: Alles auswählen

if __name__ == "__main__":
    print("Programm schliessen mit <Enter>")
    input()


Das ist natuerlich moeglich, aber hat einen entscheidenden Nachteil: genau dann wenn es NICHT funktioniert, naemlich wenn man einen Fehler gemacht hat, stuerzt das Programm ab & schliesst sofort die Fehlermeldung. Das Problem hat man nicht, wenn man im Terminal arbeitet. Natuerlich kann man auch die Exception abfangen & ausgeben, aber man kann sich auch einfach an das Terminal gewoehnen..
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _deets_ :
super !, danke !

edit: Klammern waren bereits entfernt, habe Skript-Vorlage deinen Tipps entsprechende geändert.

ich arbeite ungern am Terminal, wegen des fehlenden Syntaxhighlightings. Ich arbeite entweder mit der IDLE oder mit Spider.
Als Anfänger ist mir Syntaxhighlighting sehr sehr wichtig und hat mir bereits oft geholfen !
... und ich kann dann auch mit try...except-, oder try...finally-Anweisungen besser umgehen (da häufiger Umgang damit) ;-) und die Fehlermeldungen (z.B. mittels pickle-Modul) in ein log-file schieben ...
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Aber was hat denn das Syntax-Highlighting damit zu tun? Ich rede ja vom ausfuehren deines Programms. Nicht davon, wie du das erstellst. Ob der TE (oder du) da IDLE oder Emacs oder was auch immer benutzen hat damit doch gar nichts zu tun.

Logfiles sollten Text enthalten. Was ist der Gewinn, den mit pickle zu garnieren?
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ TE:
so hier erneut die Vorlage:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Autor: 
# Datum:
# Datei:
# Zweck/Sinn:


#TO DO
"""
text
"""

#IMPORT
#import [modul]
#from [modul] import [Funktion1, Funktion2]/*


#FUNKTIONSDEFINITIONEN
#class [name](object) :
#def [name](Parameter/Argumente) :


#KONFIGURATION


#HAUPTPROGRAMM
if __name__ == "__main__" :
    main()

#ENDE
if __name__ == "__main__" :
    print()
    print("Programm schliessen mit <Enter>")
    input()

wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ _deets_ :
du merkst an meiner Antwort, dass ich das Terminal nicht kenne. Aber werde dennoch einmal den Umgang damit versuchen.
Ich speichere üblicherweise alles mit pickle ab, als .dmp-Datei. Ich hoffe, ich schreibe jetzt keinen Mist:
mit pickle gespeicherte Dateien sind konsistenter und weniger fehleranfällig.
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Perlchamp hat geschrieben: Sonntag 17. Februar 2019, 13:38 Ich speichere üblicherweise alles mit pickle ab, als .dmp-Datei. Ich hoffe, ich schreibe jetzt keinen Mist:
mit pickle gespeicherte Dateien sind konsistenter und weniger fehleranfällig.
Ich glaube, jetzt kommen wir sehr vom ursprünglichen Thema ab, aber ich sehe das etwas anders. Die Frage ist sicher, was man vorhat. Dumps und Log Dateien sind ja zwei verschiedene Dinge. Logs erfüllen eine Berichtsfunktion, Dumps dienen dazu, Daten aus einem Prozess möglichst unverfälscht abzubilden, zu Diagnose- (z.B. Core Dump) und/oder Rekonstruktionszwecken (z.B. Datenbankdump). Pickle eignet sich für den zweiten Zweck (pickle ist allerdings auch umstritten, da es eine Reihe von Problemen z.B. im Bereich Portablität und Sicherheit hat, die es auch als Datenaustauschformat ungeeignet machen); also z.B. um eine Datenstruktur serialisiert wegzuschreiben und sie später wieder zu laden. Aber schon dafür, würden viele argumentieren, eignet sich ein neutraleres, (nicht-binäres), nicht-python-spezifisches Format wie json besser. Für Log Dateien ist es zumindest unter Unix-Systemen üblich, mit Plaintext zu arbeiten, alleine schon, da die Verarbeitung und Manipulation von Text eine der großen Stärken von Unix ist; durch eine Pickle-Datei lässt sich schlecht greppen ;) Das ist ja u.a. einer der größeren Kritikpunkte an systemd.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Perlchamp: Terminal-Programme sind dazu da, aus einem Terminal heraus gestartet zu werden. Du verwechselst das wahrscheinlich mit dem interaktiven Python-REPL, wo es mit ipython auch eine deutlich komfortablere Variante gibt. Wenn man wirklich will, dass Programme nach einem Doppelklick laufen und nicht sofort das Fenster zugeht, sollte man sich ein Batch-Skript schreiben, das Python aufruft und zum Schluß mit PAUSE wartet. Das hat den Vorteil, dass man sich nicht alle Python-Programme für das normale benutzen kaputt macht und auch bei Fehlern das Fenster offen bleibt.

Warum hast Du zwei if-Blöcke mit der exakt selben Bedingung hintereinander?
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ nezzcarth :
ja, verstehe ich schon ... eigentlich schiesse ich mit Kanonen auf Spatzen, schon klar.
.json sagt mir jetzt leider gar nichts.
und vielen lieben Dank für deine gute Ausführung/Erklärung :-)
vielleicht kann ja ein Mod die Texte in ein neues Thema verschieben ?

@sirius3 :
Ja, hatte ich in der Tat verwechselt, ich Thor.
Ist ja 'nur' ein Template, aber um richtig zu antworten:
da es unter zwei verschiedenen 'Blöcken' steht (Hauptprogramm, Ende).
Und das mit der Batch-Datei klingt schon mal sehr gut, danke !
Sollte auch einfach zu erstellen sein, oder ?
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Perlchamp hat geschrieben: Sonntag 17. Februar 2019, 15:27 Ja, hatte ich in der Tat verwechselt, ich Thor.
Da du dich auch in einem anderen Thread als Marvel Figur betitelst, schau mal hier: https://de.wikipedia.org/wiki/Torheit
Aber imho finde ich das auch dieser Titel nicht passend ist, etwas zu negativ.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
Perlchamp
User
Beiträge: 172
Registriert: Samstag 15. April 2017, 17:58

@ ThomasL :
war sarkastisch gemeint (Tor mit 'h'), um meine 'Unfähigkeit' zu unterstreichen, und vor allem, dass ich als Anfänger keine Ratschläge geben sollte, sonst bekommt man schnell den Titel "Dummschwätzer".
Und danke für deine Anmerkung !
wer lesen kann ist klar im Vorteil ;-)
es gibt keine Probleme, sondern nur Lösungen !
Bildung ist die Freude auf mich selbst !
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Enthusiasmus ist manchmal ein schlechter Ratgeber, diese Erfahrung habe ich in diesem Forum als Neuling auch gemacht.
Das gibt sich mit der Zeit und wachsendem Wissen.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten