getopt Problem ...

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
drnicolas
User
Beiträge: 122
Registriert: Sonntag 24. Juli 2016, 10:32

Ich versuche meine Kommandozeile mit getopt zu analysieren. Das ist gar nicht das Problem, sondern mehr die Reihenfolge.

Ich habe mehrere Optionen, u.a. die Option "--profile=<xxx>.
In diesem Fall soll aus einer Config-Datei der ABschnitt xxx geladen werden. Tut es auch.

Nun könnten aber Angaben aus xxx durch weitere Argumente der Kommandozeile überschrieben werden.
Also etwa so: --profiel=xxx -i xyz -d abc-
Dann würde zuerst der Abschnitt geladen und dessen Angaben durch -i und -d überschrieben. Die Einzelparameter hätten also Priorität. DUrchaus gewünscht.

-i abc -d xyz --profile=xxx würde aber die Einzelparameter mit Standards aus xxx überschreiben; was ich vermeiden will.

Ich dachte nun, zunächst die Kommandozeile NUR auf das Profil hin auszuwerten; die EInzelangaben müssten dann aber ignoriert werden.
In einer zweiten Funktion würde ich dann Einzelparameter auswerten und das Profil ignorieren.

Wie ghet das? Momentan bekomme ich Fehlermeldungen wenn ich nur das Profil auswerte, da DIESE Funtkion die anderen nicht kennt.
Oder gibt es noch was eleganteres?
Benutzeravatar
__blackjack__
User
Beiträge: 14218
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@drnicolas: Zuerst mal die Frage warum `getopt`? Das gibt es seit Python 1.0 weil das vor 30 Jahren in C und in Shell-Scripten so gemacht wurde. Seit Python 2.3, also seit 20 Jahren gibt es `optparse`, was auch eine ziemlich lange Zeit als „veraltet“ in der Dokumentation geführt wurde. Quasi seit vor 15 Jahren `argparse` in die Standardbibliothek aufgenommen wurde.

Dieser Status von `optparse` wurde kürzlich wieder aus der Dokumentation gestrichen, ich vermute hauptsächlich weil das externe `click`-Modul darauf aufbaut.

Lesenswert in dem Zusammenhang Choosing an argument parsing library in der Python-Dokumentation.

Normalerweise wertet man die Optionen ohne grosse Aktionen aus. Also man merkt sich einfach nur was da gesetzt wurde und *danach* werden darauf hin Aktionen ausgeführt. Bei `--profile` also nicht das Profil laden, sondern erst einmal nur `profile_filename` was vor dem Auswerten auf `None` gesetzt wurde, durch den Namen ersetzen. Das laden kommt dann nach dem alle anderen Optionen abgearbeitet wurden. Damit ist dann auch die Reihenfolge der Optionen egal — es passiert immer das gleiche.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Antworten