ความแตกต่างระหว่าง subprocess.Popen และ os.system


คำตอบ:


100

หากคุณตรวจสอบส่วนกระบวนการย่อยของเอกสาร 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()


คุณยังสามารถใช้sts = p.wait()แทนบรรทัดสุดท้ายได้
Sven Marnach

1
@JacobMarble สมมติว่าฉันกำลังเรียกสคริปต์การขูดซีลีเนียมจากสคริปต์ python อื่นสิ่งใดที่จะอนุญาตให้ฉันทำสคริปต์การขูดให้เสร็จสมบูรณ์จากนั้นจึงเรียกใช้โค้ดบรรทัดถัดไปเท่านั้น เช่นเดียวกับการขูดของฉันควรเสร็จสิ้นก่อนที่จะดำเนินการต่อได้
Prakhar Mohan Srivastava

อาจจะพูดถึงstackoverflow.com/questions/3172470/…เพื่อชี้ให้เห็นว่าคุณควรหลีกเลี่ยงshell=Trueถ้าทำได้ การมีตัวเลือกนี้เป็นประโยชน์อย่างหนึ่งของsubprocess.Popen()และฟังก์ชันตัวช่วย
tripleee

@PrakharMohanSrivastava หากคุณต้องการบล็อกโฟลว์และรอให้คำสั่งทำงานให้เสร็จสิ้นให้ตรวจสอบ: stackoverflow.com/a/2837319/5252192
AmirHossein

@PrakharMohanSrivastava โดยทั่วไปทั้งสองos.systemและsubprocess.call/popen/runบล็อก / รอให้คำสั่งเสร็จสิ้น: stackoverflow.com/a/14059648/4752883
alpha_989


23

os.systemเทียบเท่ากับsystemคำสั่งUnix ในขณะที่subprocessเป็นโมดูลตัวช่วยที่สร้างขึ้นเพื่อให้มีสิ่งอำนวยความสะดวกมากมายที่จัดเตรียมโดยPopenคำสั่งด้วยอินเทอร์เฟซที่ควบคุมได้ง่ายขึ้น สิ่งเหล่านี้ได้รับการออกแบบคล้ายกับคำสั่งUnix Popen

system()เรียกใช้คำสั่งที่ระบุในคำสั่งโดยการเรียก/bin/sh -c commandและส่งกลับหลังจากคำสั่งเสร็จสมบูรณ์

ในขณะที่:

popen()ฟังก์ชั่นเปิดกระบวนการโดยการสร้างท่อฟอร์กและอัญเชิญเปลือก

หากคุณกำลังคิดว่าจะใช้อันsubprocessไหนให้ใช้อย่างแน่นอนเพราะคุณมีสิ่งอำนวยความสะดวกทั้งหมดสำหรับการดำเนินการรวมถึงการควบคุมกระบวนการเพิ่มเติม


โอเค .. แล้วมีวิธีใดบ้างที่ฉันสามารถเรียกใช้ทั้ง os.system และ popen ใน windows env ฉันเป็นมือใหม่และต้องเจาะลึก ..
Arovit

ได้คุณสามารถใช้ได้ทั้ง os.system และ subprocess ใน Windows Environment ดูบทช่วยสอนพื้นฐานจาก effbot.org (หนังสือออนไลน์ Python Standard Library)
Senthil Kumaran

ข้อควรระวัง - หากคุณใช้งานระบบรุ่นเก่าโมดูลกระบวนการย่อยจะไม่พร้อมใช้งาน
Steve Hanov

21

กระบวนการย่อยขึ้นอยู่กับ popen2 และด้วยเหตุนี้จึงมีข้อดีหลายประการ - มีรายการทั้งหมดในPEP ที่นี่แต่บางส่วน ได้แก่ :

  • ใช้ท่อในเปลือก
  • การสนับสนุน newline ที่ดีขึ้น
  • จัดการข้อยกเว้นได้ดีขึ้น

2

เมื่อใช้หลาม (CPython) บนหน้าต่าง<built-in function system> os.systemจะดำเนินการภายใต้ม่าน_wsystemขณะที่ถ้าคุณกำลังใช้ระบบปฏิบัติการที่ไม่ใช่หน้าต่างก็จะใช้ระบบ

ในทางตรงกันข้าม Popen ควรใช้CreateProcessบน windows และ_posixsubprocess.fork_execในระบบปฏิบัติการที่ใช้ posix

ที่กล่าวว่าคำแนะนำที่สำคัญมาจากos.system docs ซึ่งระบุว่า:

โมดูลกระบวนการย่อยให้สิ่งอำนวยความสะดวกที่มีประสิทธิภาพมากขึ้นสำหรับการวางไข่กระบวนการใหม่และการดึงผลลัพธ์ออกมา การใช้โมดูลนั้นควรใช้ฟังก์ชันนี้ ดูส่วนการเปลี่ยนฟังก์ชันที่เก่ากว่าด้วยโมดูลกระบวนการย่อยในเอกสารขั้นตอนย่อยสำหรับสูตรอาหารที่เป็นประโยชน์

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