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)


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.


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.