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

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
mdatab
User
Beiträge: 8
Registriert: Dienstag 8. Juni 2004, 18:31

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!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
mdatab
User
Beiträge: 8
Registriert: Dienstag 8. Juni 2004, 18:31

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.
BlackJack

@mdatab: Das was Du eigentlich haben möchtest ist aber falsch.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
mdatab
User
Beiträge: 8
Registriert: Dienstag 8. Juni 2004, 18:31

Hmm, in Ordnung. Ich habe es nun auf diese Weise mal umgesetzt. Vielen Dank nochmals.
Antworten