Unix pathname expansion (Globbing) mit optparse nutzen

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
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo!

Ich verwende Python 2.6.5 und damit noch optparse (depr. ich weiß).Nun habe ich einen Parameter "-i" für Inputfiles definiert. Da ich möchte, dass man mehrere Dateien angeben kann, ist als Aktion "append" gesetzt.

So weit so gut: Ich kann mehrere Eingabe Dateien übergeben:

Code: Alles auswählen

./script.py -i datei.dat -i datei2.dat
Nun wollte ich in Ergänzung dazu gerne UPE nutzen und habe mir dafür das glob-Modul ausgesucht. Aber Pustekuchen: Die Shell expandiert Angaben wie

Code: Alles auswählen

./script.py -i *.dat -i data.raw
automatisch zu

Code: Alles auswählen

./script.py -i data.dat data1.dat -i data.raw
. Hätte man ja mit rechnen können. Dummerweise kann OptParse derartige Angaben nicht verarbeiten: Das obige Beispiel mit dem Wildcard würde bei mir zu folgender Liste führen:
["data.dat", "data.raw"]
: Weil die Shell die Pfadangabe expandiert, liest OptParse nur die erste Angabe und hält die zweite Angabe für einen Parameter (und keine Option).

Nun wird die ganze Sache noch etwas komplizierter: Bei Langangaben (--input=*.dat statt -i *.dat), wird mir die Angabe unexpandiert übergeben! Ich habe mal in der Manpage des Globbings (unter Misc) nachgesehen: Da steht von diesem Verhalten nichts :shock:

Kurzum: Weiß jemand Rat? Ich kannte natürlich sagen: Eingabedateien mit UPE müssen in Anführungsstrichen stehen - dann lässt die Shell die Finger davon und ich kann das Ganze mit glob auswerten. Aber die Lösung ist ja nun nicht sonderlich kanonisch. Und lange Optionen finde ich jetzt auch nicht so toll.

Vielleicht kann mich ja jemand auf meinen Denkfehler bzw. eine schöne Lösung aufmerksam machen.

Danke schonmal!

brb
lunar

"argparse" kann Optionen mit mehreren Argumenten verarbeiten, wenn Du "nargs='*'" oder "nargs='+'" verwendest. Dann kannst Du die Erweiterung der Shell überlassen und erhältst nach dem Parsen eine Liste mit allen übergebenen Argumenten für die Option.

Allerdings würde ich davon Abstand nehmen, denn es ist ja offensichtlich, dass das zu Mehrdeutigkeiten führt, die für den Nutzer verwirrend und überraschend sein können. Wieso übergibst Du die Eingabedateien nicht einfach ohne Option als "positional arguments" (in optparse also quasi über die args Liste in "opts, args = parser.parse_args()"?
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Stimmt eigentlich - ich glaube, ich habe das vorschnell ausgeschlossen, weil ich Positions-Parameter selbst immer sehr irritierend finde, wenn man mehrere davon hat. Aber das ist natürlich totaler Unfug, wenn alle Positions-Parameter für die Eingabe reserviert sind.

Wald? Bäume?

Herzlichen Dank auf alle Fälle ;). Argparse wäre wg. meiner Version ohnehin ausgeschieden - und ich wollte jetzt auch nicht für mein Popelskript extra noch irgendwelche Module mit-ausliefern müssen.
Antworten