อะไรคือความแตกต่างระหว่าง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()แทนบรรทัดสุดท้ายได้