Comment passer des noms de fichiers avec des espaces comme arguments?

11

J'ai un script Python qui accepte les arguments de chaîne.

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

Cela fonctionne comme prévu.

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


Si je dois transmettre des noms de fichiers, je le ferais,

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

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

Si vous utilisez la commande -Qof ls, je peux encapsuler les résultats entre guillemets doubles. Cependant, les citations restent échappées dans le script Python, c'est-à-dire.

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

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


Comment dois-je développer les lsnoms de fichiers en chaînes appropriées à utiliser comme arguments? (comme dans mon tout premier exemple)

autorun
la source
Vous devez citer l'extension du shell: "$(ls -Q '/some/dir/*.jpg')". Cependant, il existe de meilleures alternatives comme indiqué dans les réponses.
Bakuriu

Réponses:

23

Ne pas analyser ls. Utilisez simplement:

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

Cela effectue un globbing shell qui remplace /path/to/*.jpgpar la liste appropriée.

DopeGhoti
la source
5

Je pense que la réponse est au- dessus de glob mieux, mais xargset findest aussi une solution qui peut être utilisé parfois.

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

Cela fonctionne car -print0on findséparera la sortie avec des octets nuls plutôt qu'avec des espaces, et la -0ligne de commande xargs supposera que l'entrée est séparée par des octets nuls.

davidsheldon
la source