Seite 1 von 1

argparse: Optionales argument (so wie --help)?

Verfasst: Montag 16. September 2013, 12:44
von mdatab
Hallo,

ich versuche mich gerade an einem Python3-Skript. Wenn ich mit argparse einige nicht-optionale Argumente hinzufüge, kann ich ja dennoch (natürlich) die Hilfe mit -h/--help aufrufen, ohne dass die (eigentlich) notwendigen Argumente angemahnt werden. Nun würde ich gerne ein weiteres (optionales) Argument hinzufügen, bei dem ich ebenfalls keine Fehlermeldung bekomme bzgl. der eigentlich notwendigen Argumente.

Um konkreter zu werden: Das Script verlangt eigentlich immer, dass man einen Namen (Radiostation) und eine Dauer angibt. Das Skript zeichnet dann entsprechend die Radiostream der Station für die entsprechende Dauer auf. Nun möchte ich aber eine Option haben, dass man sich einfach die Liste der dem Skript bekannten Radiostationen ausgeben lassen kann. Wenn ich dies so angebe:

Code: Alles auswählen

parser.add_argument('-l', '--list', action='store_true', help='Shows a list of all known radio stations')
Erhalte ich beim Aufruf des Skriptes mit myskript --list folgende Fehlermeldung:
error: the following arguments are required: station, duration
Wie kann ich also das von mir gewünschte Verhalten erreichen?

Vielen Dank!

Re: argparse: Optionales argument (so wie --help)?

Verfasst: Montag 16. September 2013, 13:09
von EyDu
Ich würde in dem Fall Sub-commands verwenden, damit hast du dann eine saubere Schnitstelle und must dich nicht mit möglichen Mehrdeutigkeiten rumärgern.

Re: argparse: Optionales argument (so wie --help)?

Verfasst: Montag 16. September 2013, 13:39
von mdatab
Danke für den Tipp. Das habe ich mir auch schon angesehen. Allerdings macht das aus meiner command line etwas, das ich nicht haben will:

Code: Alles auswählen

myskript.py [-h] station duration [name] {l} ...
Was ich eigentlich haben möchte, ist das:

Code: Alles auswählen

myskript.py [-h] [-l] station duration [name]
D.h., eigentlich habe ich das ja schon. Allerdings sollte das Skript eben "station" und "duration" ignorieren, wenn ich es mit --list aufrufe.

Re: argparse: Optionales argument (so wie --help)?

Verfasst: Montag 16. September 2013, 13:47
von BlackJack
@mdatab: Das was Du eigentlich haben möchtest ist aber falsch.

Re: argparse: Optionales argument (so wie --help)?

Verfasst: Montag 16. September 2013, 13:54
von EyDu
Wenn du mehrere "Programme" in einer Anwendung lieferst, dann solltest du diese auch so behandeln, dann bist du auch alle möglichen Mehrdeutigkeiten und Überschneidunen los:

Code: Alles auswählen

parser = argparse.ArgumentParser(prog='RADIO')
subparsers = parser.add_subparsers(help='sub-command help')

parser_listen = subparsers.add_parser('listen', help='listen to a station')
parser_listen.add_argument('station', type=str, help='a station')
    
parser_record = subparsers.add_parser('record', help='record a station')
parser_record.add_argument('station', type=str, help='a station')
parser_record.add_argument('duration', type=float, help='duration')
    
parser_list = subparsers.add_parser('list', help='list all available stations')
Du versuchst mit deiner "--list"-Idee eine Schnittstelle zu implementieren, welche für den Benutzer wenig intuitiv ist.

Re: argparse: Optionales argument (so wie --help)?

Verfasst: Montag 16. September 2013, 14:40
von mdatab
Hmm, in Ordnung. Ich habe es nun auf diese Weise mal umgesetzt. Vielen Dank nochmals.