อะไรคือความแตกต่างระหว่างsubprocess.Popen()
และos.system()
?
อะไรคือความแตกต่างระหว่างsubprocess.Popen()
และos.system()
?
คำตอบ:
หากคุณตรวจสอบส่วนกระบวนการย่อยของเอกสาร Pythonคุณจะสังเกตเห็นว่ามีตัวอย่างวิธีการแทนที่os.system()
ด้วยsubprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... เหมือนกับ ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
โค้ดที่ "ปรับปรุงแล้ว" ดูซับซ้อนกว่า แต่จะดีกว่าเพราะเมื่อคุณรู้subprocess.Popen()
แล้วคุณไม่ต้องการสิ่งอื่นใด subprocess.Popen()
แทนที่เครื่องมืออื่น ๆ ( os.system()
เป็นเพียงหนึ่งในเครื่องมือเหล่านั้น) ที่กระจัดกระจายไปตามโมดูล Python อื่น ๆ อีกสามโมดูล
ถ้ามันจะช่วยให้คิดว่าเป็นความยืดหยุ่นมากsubprocess.Popen()
os.system()
shell=True
ถ้าทำได้ การมีตัวเลือกนี้เป็นประโยชน์อย่างหนึ่งของsubprocess.Popen()
และฟังก์ชันตัวช่วย
os.system
และsubprocess.call/popen/run
บล็อก / รอให้คำสั่งเสร็จสิ้น: stackoverflow.com/a/14059648/4752883
os.system
เทียบเท่ากับsystem
คำสั่งUnix ในขณะที่subprocess
เป็นโมดูลตัวช่วยที่สร้างขึ้นเพื่อให้มีสิ่งอำนวยความสะดวกมากมายที่จัดเตรียมโดยPopen
คำสั่งด้วยอินเทอร์เฟซที่ควบคุมได้ง่ายขึ้น สิ่งเหล่านี้ได้รับการออกแบบคล้ายกับคำสั่งUnix Popen
system()
เรียกใช้คำสั่งที่ระบุในคำสั่งโดยการเรียก/bin/sh -c command
และส่งกลับหลังจากคำสั่งเสร็จสมบูรณ์
ในขณะที่:
popen()
ฟังก์ชั่นเปิดกระบวนการโดยการสร้างท่อฟอร์กและอัญเชิญเปลือก
หากคุณกำลังคิดว่าจะใช้อันsubprocess
ไหนให้ใช้อย่างแน่นอนเพราะคุณมีสิ่งอำนวยความสะดวกทั้งหมดสำหรับการดำเนินการรวมถึงการควบคุมกระบวนการเพิ่มเติม
กระบวนการย่อยขึ้นอยู่กับ popen2 และด้วยเหตุนี้จึงมีข้อดีหลายประการ - มีรายการทั้งหมดในPEP ที่นี่แต่บางส่วน ได้แก่ :
เมื่อใช้หลาม (CPython) บนหน้าต่าง<built-in function system>
os.systemจะดำเนินการภายใต้ม่าน_wsystemขณะที่ถ้าคุณกำลังใช้ระบบปฏิบัติการที่ไม่ใช่หน้าต่างก็จะใช้ระบบ
ในทางตรงกันข้าม Popen ควรใช้CreateProcessบน windows และ_posixsubprocess.fork_execในระบบปฏิบัติการที่ใช้ posix
ที่กล่าวว่าคำแนะนำที่สำคัญมาจากos.system docs ซึ่งระบุว่า:
โมดูลกระบวนการย่อยให้สิ่งอำนวยความสะดวกที่มีประสิทธิภาพมากขึ้นสำหรับการวางไข่กระบวนการใหม่และการดึงผลลัพธ์ออกมา การใช้โมดูลนั้นควรใช้ฟังก์ชันนี้ ดูส่วนการเปลี่ยนฟังก์ชันที่เก่ากว่าด้วยโมดูลกระบวนการย่อยในเอกสารขั้นตอนย่อยสำหรับสูตรอาหารที่เป็นประโยชน์
sts = p.wait()
แทนบรรทัดสุดท้ายได้