Print wird ignoriert?

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.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Print wird ignoriert?

Beitragvon murph » Dienstag 2. Mai 2006, 21:48

Code: Alles auswählen

#!/usr/bin/env python
usage = '''
So kann man dieses Programm einbinden!
os.system("python pwd.py %i %j" % (laenge, typ))
So wird es aus der Shell genutzt: ./pwd.py %i %j
%i = laenge des Passwortes
%j = typ des Passwortes
\t letters
\t digits
\t letters+digits / digits+letters
\t all / everything
'''
import sys
try:
    if sys.argv[1] == '-help':
        print usage
except:
    try:
        laenge = int(sys.argv[1])
    except:
        print """\n-------------------------------------------------------------------------\n
Das erste Argument ist keine gueltige Zahl. fuer gebrauchsanleitung ./pwd.py -help  aufrufen\n-------------------------------------------------------------------------\n"""
    try:
        from string import *
        from random import randrange
        if sys.argv[2] == 'letters':
            items = ascii_letters
        if sys.argv[2] == 'digits':
            items = digits
        if sys.argv[2] == 'letters+digits' or sys.argv[2] == 'digits+letters':
            items = ascii_letters + digits
        if sys.argv[2] == 'all' or sys.argv[2] == 'everything':
            items = ascii_letters + digits + punctuation
        itemslen, pwdlen = len(items), laenge
        pwd = "".join(items[randrange(itemslen)] for i in range(pwdlen))
        print pwd
        del pwd
    except:
        print "\n-------------------------------------------------------------------------\n Das zweite Argument ist keines der gegebenden Werten. fuer gebrauchsanleitung ./pwd.py -help  aufrufen\n-------------------------------------------------------------------------\

Der hat herrlich funktioniert, bid ich die excepts eingebaut habe.
Danach kann ich die excepts aufrufen (mir wird die usage ausgedruckt und die Fehlermaldung) sobald ich aber korekte werte einsetze, bekomme ich keine antwort, er tut so, als ob das Programm beendet worden wäre, ich kann aber keine except ohne einem "print" finden, also muss er mir irgendeine fehlermekdung geben...oder nicht?
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 3. Mai 2006, 06:41

Ist doch klar... Was überleg mal was passiert, wenn im ersten try die IF Abfrage nicht erfüllt ist, aber es nicht zu einer Exception kommt ;) Dann passiert nämlich nix...

Mit try-except sollte man immer möglichst wenig code einschliessen. Also eigentlich nur den Teil wo wirklich der Fehler vorkommen kann.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

Beitragvon BlackJack » Mittwoch 3. Mai 2006, 06:44

Nein, das läuft schon so wie Du's geschrieben hast. Der Grossteil des Quelltextes steht in dem Block, der ausgeführt wird, wenn in Zeile 14 oder 15 eine Ausnahme auftritt. Wenn da keine auftritt, dann wird auch nichts ausgeführt. Du hast da also ein strukturelles Problem.

Und bitte benutze keine ``except`` ohne eine oder mehrere konkrete Ausnahmen anzugeben, die behandelt werden sollen. So wird nämlich *jede* Ausnahme von dem ``except`` Blöcken behandelt, auch solche die Du vielleicht doch lieber als Fehler sehen möchtest. Zum Beispiel wenn Du Dich bei einem Namen vertippt hast, kommt ein `NameError`, der dann als falsches Argument auf der Kommandozeile gemeldet werden kann. Das ist irreführend und falsch.

Der Hinweis mit `os.system()` zum einbinden in eigene Pythonprogramme ist ja nett gemeint, aber Da solltest Du lieber die Funktionalität als Funktion schreiben, so dass man das Programm auch als Modul importieren kann. Dann muss man nicht extra einen weiteren Python-Interpreter starten um es von anderen Python-Programmen nutzen zu können.

Der Hauptcode könnte mit einer konkreten Ausnahmebehandlung zum Beispiel so aussehen:

Code: Alles auswählen

        character_ranges = {
            'letters': ascii_letters,
            'digits': digits,
            'letters+digits': ascii_letters + digits,
            'digits+letters': ascii_letters + digits,
            'all': ascii_letters + digits,
            'everything': ascii_letters + digits
        }
        try:
            characters = character_ranges[sys.argv[2]]
            password = ''.join(random.choice(characters)
                               for dummy in xrange(laenge))
            print password
        except KeyError:
            print 'Unknown character range %r' % sys.argv
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Donnerstag 4. Mai 2006, 20:27

Jetzt sehe ich auch, wo ich mich verdacht habe!
THX!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder