Wie kann ich Dateinamen mit Leerzeichen als Argumente übergeben?

11

Ich habe ein Python-Skript, das Zeichenfolgenargumente akzeptiert.

$ python script.py "one image.jpg" "another image.jpg"

Dies funktioniert wie erwartet.

Python argparse: ["one image.jpg", "another image.jpg"]


Wenn ich Dateinamen übergeben müsste, würde ich tun,

$ python script.py $(ls "/some/dir/*.jpg")

Python argparse: ["one", "image.jpg", "another", "image.jpg"]

Wenn Sie den Befehl -Qof verwenden ls, kann ich Ergebnisse zwischen doppelte Anführungszeichen setzen. Anführungszeichen bleiben jedoch im Python-Skript maskiert, d. H.

$ python script.py $(ls -Q "/some/dir/*.jpg")

Python argparse: ['"one image.jpg"', '"another image.jpg"']


Wie soll ich lsDateinamen in geeignete Zeichenfolgen erweitern, um sie als Argumente zu verwenden? (wie in meinem allerersten Beispiel)

Autorun
quelle
Sie sollten die Shell-Erweiterung angeben : "$(ls -Q '/some/dir/*.jpg')". Es gibt jedoch bessere Alternativen, wie in den Antworten angegeben.
Bakuriu

Antworten:

23

Nicht analysieren ls. Benutz einfach:

python script.py /path/to/*.jpg

Dies führt ein Shell-Globbing durch, das /path/to/*.jpgdurch die richtige Liste ersetzt wird.

DopeGhoti
quelle
5

Ich denke , die glob Antwort oben ist am besten, aber xargsund findist auch eine Lösung , die manchmal verwendet werden kann.

find /some/dir/ -name '*.jpg' -print0 | xargs -0 python script.py

Dies funktioniert, weil -print0on finddie Ausgabe mit Null-Bytes anstelle von Leerzeichen trennt und die -0on-xargs-Befehlszeile davon ausgeht, dass die Eingabe durch Null-Bytes getrennt ist.

Davidsheldon
quelle