web-dev-qa-db-fra.com

Comment puis-je passer des noms de fichiers avec des espaces comme arguments?

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.

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


Si je devais passer des noms de fichiers, je le ferais,

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

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

Si vous utilisez la commande -Q de ls, je peux encapsuler les résultats entre guillemets doubles. Cependant, les guillemets ne sont pas échappés dans le script Python, c'est-à-dire.

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

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


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

11
autorun

Ne pas analyser ls. Il suffit d'utiliser:

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

Ceci exécute un parcours du shell qui remplace /path/to/*.jpg par la liste appropriée.

23
DopeGhoti

Je pense que la réponse globale ci-dessus est la meilleure, mais xargs et find est également une solution qui peut parfois être utilisée.

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

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

5
davidsheldon