Come posso passare nomi di file con spazi come argomenti?


11

Ho uno script Python che accetta argomenti di stringa.

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

Funziona come previsto.

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


Se avessi bisogno di passare nomi di file, lo farei,

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

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

Se uso il comando -Qof ls, posso racchiudere i risultati tra virgolette doppie. Tuttavia, le virgolette rimangono evase nello script Python, ad es.

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

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


Come devo espandere i lsnomi dei file in stringhe appropriate da usare come argomenti? (come nel mio primo esempio)


Si dovrebbe citare l'espansione shell: "$(ls -Q '/some/dir/*.jpg')". Tuttavia ci sono alternative migliori come indicato dalle risposte.
Bakuriu,

Risposte:


23

Non analizzare ls. Usa solo:

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

Questo esegue il globbing della shell che viene sostituito /path/to/*.jpgdall'elenco corretto.


5

Penso che la risposta glob di cui sopra è migliore, ma xargse findè anche una soluzione che può essere utilizzato a volte.

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

Questo funziona perché -print0on findseparerà l'output con byte null anziché con spazi e la -0riga di comando on xargs supporrà che l'input sia separato da byte null.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.