ฉันจะส่งต่อชื่อไฟล์ด้วยช่องว่างเป็นอาร์กิวเมนต์ได้อย่างไร


11

ฉันมีสคริปต์ Python ที่ยอมรับข้อโต้แย้งสตริง

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

ทำงานได้ตามที่คาดไว้

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


ถ้าฉันต้องการส่งชื่อไฟล์ฉันจะทำ

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

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

หากใช้คำสั่ง-Qของlsฉันสามารถตัดผลลัพธ์ระหว่างเครื่องหมายคำพูดคู่ อย่างไรก็ตามเครื่องหมายคำพูดจะคงอยู่ในสคริปต์ Python เช่น

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

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


ฉันจะขยายlsชื่อไฟล์เป็นสตริงที่เหมาะสมเพื่อใช้เป็นอาร์กิวเมนต์ได้อย่างไร (เช่นในตัวอย่างแรกของฉัน)


"$(ls -Q '/some/dir/*.jpg')"คุณควรจะพูดขยายตัวเปลือก: อย่างไรก็ตามมีทางเลือกที่ดีกว่าตามที่ระบุไว้ในคำตอบ
บาคุริว

คำตอบ:


23

lsอย่าแยก เพียงใช้:

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

สิ่งนี้ทำเชลล์แบบกลมซึ่งแทนที่/path/to/*.jpgด้วยรายการที่เหมาะสม


5

ผมคิดว่า glob คำตอบดังกล่าวเป็นที่ดีที่สุด แต่xargsและfindยังเป็นวิธีการแก้ปัญหาที่สามารถใช้ในบางครั้ง

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

งานนี้เพราะ-print0ในfindจะแยกเอาท์พุทที่มีไบต์ null มากกว่าพื้นที่และ-0ในบรรทัด xargs คำสั่งจะถือว่าการป้อนข้อมูลจะถูกคั่นด้วยไบต์ null

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.