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)
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.
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.