2016-04-05 5 views
0

Ich verwende Python argparse, um Befehlszeilenbindungen für beliebte Funktionen von meiner Software zu erstellen. Genauer gesagt spreche ich über this function.Bestanden Bash Dateiliste zu Python-CLI-Funktion

Normalerweise, wenn ich eine CLI-Funktion eine Liste der Eingänge in bash nehmen will, kann ich so etwas wie:

whateverfunction DSC_4{322..399}* 

, das die Funktion alle Werte von DSC_4322 zu DSC_4399 mit dem, was Suffixe passiert. Nun obvioulsy, wird dies nicht funktionieren, wenn ich gerade einen Stich mit argparse Bedeutung vorbei den Weg in Python zu kriechen:

parser.add_argument("destination", help="Path to store files into (excluding alphanumeric storage directories)", type=str) 

Gibt es eine elegante Art und Weise eines argparse Positions Argument zu ermöglichen, bietet einen Weg und eine zu handhaben Liste der Dateien?

Das einzige, was mir einfällt, ist das Erkennen der Auszeichnungen in der Zeichenfolge und das Schreiben eines Python-Skripts, das eine Liste für eine solche Eingabe generiert - und einen Baum-Crawl für jede andere Art von Eingabe durchführt ... Aber ich hatte gehofft es könnte einen schöneren Weg geben.

+1

Suchen Sie 'nargs = '+''? – zondo

+0

'nargs = '+' ist der richtige Weg, wenn die Shell die Dateinamen für Sie erweitern soll. Wenn Sie möchten, dass Python die Erweiterung ausführt, müssen Sie die Spezifikation in Anführungszeichen setzen ('whatefunction' DCS_4 {322..399} *'), damit die Shell die Spezifikation übergibt. – tdelaney

+0

'argparse' behandelt, was Sie ihm geben Die "sys.argv" -Liste. – hpaulj

Antwort

2

So mit einem einfachen Skript, das Echos der sys.argv

1959:~/mypy$ python echoargv.py stack{342..344}* 
['echoargv.py', 'stack34234965.py', 'stack34279750.py', 'stack34308904.py', 'stack34432056.py'] 

ich eine Liste von Dateinamen erhalten

parser.add_argument("filenames", nargs='*') 

wird ein args Namespace wie produzieren:

Namepace(filenames=['echoargv.py', 'stack34234965.py', 'stack34279750.py', 'stack34308904.py', 'stack34432056.py']) 

Wo nicht da ist finde ich eine Liste wie

Wenn Sie eine Liste von Dateien aus dem Python-Skript erstellen möchten, sollten Sie die Verwendung von glob.glob in Erwägung ziehen.

In [137]: glob.glob('stack342*') 
Out[137]: ['stack34234965.py', 'stack34279750.py'] 

(obwohl es nicht, es scheint, die {..} Syntax implementieren.)

+0

Ok, das hört sich gut an - würde es als letztes Positionsargument funktionieren oder würde es auch die Schlüsselwortargumente fangen, die ihm folgen? Würde es das Positionsargument fangen, das davor liegt? – TheChymera

+0

Diese 'nargs 'ist gierig und verhindert, dass alle Argumente erfasst werden, NACHDEM es ein Problem ist. Eine feste Position vorher sollte kein Problem sein. – hpaulj

Verwandte Themen