Programm beenden

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.
Anfänger1911
User
Beiträge: 62
Registriert: Donnerstag 17. November 2005, 16:25

Hi!

Ich habe in mein Programm ein paar if und else Befehle hineingeschrieben.
Nun würde ich gerne als else Befehl programmieren, dass das Programm
direkt zum Ende springt und nicht erst die dazwischen folgenden Teile
abspielt. Wie lautet der Befehl?

Danke schonmal!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

sys.exit() ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Oder auch

Code: Alles auswählen

 raise SystemExit,"Ihr seid doof! Mit euch spiele ich nicht mehr!"
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

:shock: :lol: :D

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Gast

Egal welchen der beiden Befehle ich eingebe es funktioniert nicht!
Das Programm zeigt mir folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Mein Benutzername\Eigene Dateien\Python Programme\Programmname", line 46, in -toplevel-
    l = Anmelden()
  File "C:\Dokumente und Einstellungen\Mein Benutzername\Eigene Dateien\Python Programme\Programmname", line 44, in __init__
    raise SystemExit
SystemExit
Woran liegt das?

Hier ist ein Auschnitt meines Programms:

Code: Alles auswählen

# Anmelden
class Anmelden:
  def login():
    print "Geben sie ihren Benutzernamen ein!"
    print
    userscan="Testnutzer"
    user=raw_input()
    print
    if user == userscan:
        print "Geben sie nun ihr Passwort ein!"
        passwortscan="Test"
        print
        passwort=raw_input()
        print
        if passwort == passwortscan:
            print "Herzlich Wilkommen!"
        else:
            print "Passwort falsch!"
            print "Sie sind nicht berechtigt dieses Programm zu benutzen!"
            raise SystemExit,"Das Programm wird jetzt beendet!"
    else:
        print "Unbekannter Benutzer! Sie sind nicht berechtigt dieses"
        print "Programm zu benutzen!"
        raise SystemExit,"Das Programm wird jetzt beendet!"
                
l = Anmelden()
Edit (Leonidas): Code in Python-Tags gesetzt.
Anfänger1911
User
Beiträge: 62
Registriert: Donnerstag 17. November 2005, 16:25

Sorry!

Der letzte Beitrag war von mir!
Hab mich ausgeloggt und vergessen mich wieder einzuloggen!
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Poste das Ding nochmal mit Python-Tags. Ohne Einrückungen ist das nicht zu analysieren.

BTW: Für deinen Fall wäre ein sys.Exit(1) oder so doch besser geeignet. SystemExit gibt nämlich immer 0 an die Shell zurück, IIRC. Aber der Fehler liegt woanders.

Edit2: Welche Pythonversion ist das denn? Es scheint so, als ob der raise SystemExit genau das mach, was er soll, nämlich die SystemExit Exception auszulösen. Nur diese führt nicht zum sofortigen Abbruch sondern zu einem Traceback.

Ersetze es mal durch sys.exit(1) (das import sys nicht vergessen)

Ach übrigens: es muss def login(self): heißen!
Anfänger1911
User
Beiträge: 62
Registriert: Donnerstag 17. November 2005, 16:25

Hier ist ein Auschnitt meines Programms:

Python-Code:

Code: Alles auswählen

# Anmelden
class Anmelden:
  def login():
    print "Geben sie ihren Benutzernamen ein!"
    print
    userscan="Testnutzer"
    user=raw_input()
    print
    if user == userscan:
        print "Geben sie nun ihr Passwort ein!"
        passwortscan="Test"
        print
        passwort=raw_input()
        print
        if passwort== passwortscan:
            print "Herzlich Wilkommen!"
        else:
            print "Passwort falsch!"
    else:
        print "Unbekannter Benutzer! Sie sind nicht berechtigt dieses"
        print "Programm zu benutzen!"
        import sys
        sys.Exit(1)
                
l = Anmelden()
Nach dieser Änderung überspringt er diesen Teil ganz!

Meine Pythonversion ist 2.4.2!

Edit (Leonidas): Code in Python-Tags gesetzt.
Anfänger1911
User
Beiträge: 62
Registriert: Donnerstag 17. November 2005, 16:25

Hab das Programm nochmal ein bisschen geändert:

Code: Alles auswählen

# Anmelden
class Anmelden:
  def __init__(self):
    print "Geben sie ihren Benutzernamen ein!"
    print
    userscan="Testnutzer"
    user=raw_input()
    print
    if user == userscan:
        print "Geben sie nun ihr Passwort ein!"
        passwortscan="Test"
        print
        passwort=raw_input()
        print
        if passwort== passwortscan:
            print "Herzlich Wilkommen!"
        else:
            print "Passwort falsch!"
    else:
        print "Unbekannter Benutzer! Sie sind nicht berechtigt dieses"
        print "Programm zu benutzen!"
        import sys
        sys.Exit(1)
                
l = Anmelden()
Jetzt wird folgende Fehlermeldung angezeigt:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Mein Benutzername\Eigene Dateien\Python Programme\Programmname", line 47, in -toplevel-
    l = Anmelden()
  File "C:\Dokumente und Einstellungen\Mein Benutzername\Eigene Dateien\Python Programme\Programmname", line 45, in __init__
    sys.Exit(1)
AttributeError: 'module' object has no attribute 'Exit'
Edit (Leonidas): Code in Python-Tags gesetzt.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Dann musst du irgendwie den raise-Befehl falsch geschrieben haben...

Und dieser Teil wird übersprungen, weil du die Loginmethode ja gar nicht aufrufst.

Zuerst musst du aber entweder schreiben: "def login(self)" oder login in eine classmethod umwandeln, mach einfach ersteres ;)

und denn mit

Code: Alles auswählen

l.login()
aufrufen.
Anfänger1911
User
Beiträge: 62
Registriert: Donnerstag 17. November 2005, 16:25

Ich hab die Login Funktion einfach rausgenommen! Jetzt sieht mein Programm so aus:

Code: Alles auswählen

# Anmeldung
print "Geben sie ihren Benutzernamen ein!"
print
userscan="Testnutzer"
user=raw_input()
print
if user == userscan:
    print "Geben sie nun ihr Passwort ein!"
    passwortscan="Test"
    print
    passwort=raw_input()
    print
    if passwort== passwortscan:
        print "Herzlich Wilkommen!"
    else:
        print "Passwort falsch!"
else:
    print "Unbekannter Benutzer! Sie sind nicht berechtigt dieses"
    print "Programm zu benutzen!"
    import sys
    sys.Exit(1)
Aber jetzt wird dieser Fehler angezeigt:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Mein Benutzername\Eigene Dateien\Python Programme\Programmname", line 43, in -toplevel-
    sys.Exit(1)
AttributeError: 'module' object has no attribute 'Exit'
Edit (Leonidas): Code in Python-Tags gesetzt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anfänger1911 hat geschrieben:Aber jetzt wird dieser Fehler angezeigt: [...]
Was spricht denn dagegen, die Funktion exit() richtig, das heißt klein zu schreiben?

Hier eine etwas korrigierte Version deines Programms:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: latin-1 -*-

import sys

# Anmeldung
print "Geben sie ihren Benutzernamen ein!"
print
userscan = "Testnutzer"
user = raw_input()
print
if user == userscan:
    print "Geben sie nun ihr Passwort ein!"
    passwortscan = "Test"
    print
    passwort = raw_input()
    print
    if passwort== passwortscan:
        print "Herzlich Wilkommen!"
    else:
        print "Passwort falsch!"
else:
    print "Unbekannter Benutzer! Sie sind nicht berechtigt dieses"
    print "Programm zu benutzen!"
    sys.exit(1)
Änderungen: sys.exit() richtig geschrieben, Shebang eingefüht, Encoding gesetzt, dem Python Styleguide angepasst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Noch eine technische Amerkung zu Logins: Üblicherweise liefert man bei einem Fehlschlag nicht die Information ob es an einem nicht existierenden Benutzernamen oder am Passwort lag. So macht man es Angreifern leichter die erstmal verschiedene Benutzernamen ausprobieren. Wenn sie einen Benutzer gefunden haben, dann wissen sie das sie für den jetzt Passworte ausprobieren können.
Anfänger1911
User
Beiträge: 62
Registriert: Donnerstag 17. November 2005, 16:25

Ich habe die Änderungen durchgführt trotzdem erscheint noch folgender Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Dokumente und Einstellungen\Mein Benutzername\Eigene Dateien\Python Programme\Programmname", line 46, in -toplevel-
    sys.exit(1)
SystemExit: 1
Mein Programm sieht mittlerweile so aus:

Code: Alles auswählen

# -*- coding: latin-1 -*-

import sys

# Anmelden
print "Geben sie ihren Benutzernamen ein!"
print
userscan = "Testnutzer"
user = raw_input()
print
if user == userscan:
    print "Geben sie nun ihr Passwort ein!"
    passwortscan = "Test"
    print
    passwort = raw_input()
    print
    if passwort == passwortscan:
        print "Herzlich Wilkommen!"
    else:
        print "Passwort falsch!"
else:
    print "Unbekannter Benutzer! Sie sind nicht berechtigt dieses"
    print "Programm zu benutzen!"
    sys.exit(1)
Edit (Leonidas): Code in Python-Tags gesetzt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also bei mir klappt das wunderbar... Beim "falschen login" kommt kein Traceback...

Wie startest du das Programm denn?

Versuch doch mal sys.exit(0)...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Anfänger1911
User
Beiträge: 62
Registriert: Donnerstag 17. November 2005, 16:25

Bei sys.exit(0) tritt der gleiche Fehler auf!

Ich starte das Programm über Python IDLE, Run->Run Module!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja ja, die dolle IDLE Daran wird es wohl liegen :roll: Es ist wohl kein richtiger Fehler, sondern wohl ehr ein Hinweis... Aber ich hab keine Erfahrung mit der IDLE...

Schau mal in die FAQ: Welche Editoren werden für Python empfohlen?

EDIT: Ach das hatten wir doch letztens erst :evil:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Anfänger1911 hat geschrieben:Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Mein Benutzername\Eigene Dateien\Python Programme\Programmname", line 46, in -toplevel-
sys.exit(1)
SystemExit: 1
Dann hatte das raise SystemExit auch funktioniert.

Dein Programm kann ja schlecht auch gleich mit IDLE beenden (welches ja schließlich auch unter demselben Python-Interpreter läuft). Starte das Programm doch einfach direkt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hat er doch geschrieben :roll:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

jens hat geschrieben:Hat er doch geschrieben :roll:
Habs ja auch schon gesehen und die Antwort entsprechend angepasst.

(Für die anderen: ich hatte zuerst gefragt, worunter er die Programme startet)
Antworten