มีสี่กรณีที่คาดเดายากสำหรับการเลือกวิธีเฉพาะเจาะจงของ Python ในos
โมดูลมากกว่าการใช้os.system
หรือsubprocess
โมดูลเมื่อเรียกใช้คำสั่ง:
- ความซ้ำซ้อน - การวางไข่กระบวนการอื่นซ้ำซ้อนและเสียเวลาและทรัพยากร
- ความสามารถในการพกพา - วิธีการหลายอย่างใน
os
โมดูลนั้นมีอยู่ในหลายแพลตฟอร์มในขณะที่คำสั่งเชลล์จำนวนมากเป็นระบบปฏิบัติการเฉพาะ
- ทำความเข้าใจเกี่ยวกับผล - วางไข่กระบวนการในการดำเนินการโดยพลกองกำลังคำสั่งคุณจะแยกเป็นผลมาจากการส่งออกและเข้าใจถ้าและทำไมคำสั่งมีบางอย่างผิดปกติทำ
- ความปลอดภัย - กระบวนการสามารถประมวลผลคำสั่งใด ๆ นี่คือการออกแบบที่อ่อนแอและสามารถหลีกเลี่ยงได้โดยใช้วิธีการเฉพาะใน
os
โมดูล
คุณกำลังดำเนินการ "คนกลาง" ที่ซ้ำซ้อนระหว่างทางไปยังการเรียกระบบในที่สุด ( chmod
ในตัวอย่างของคุณ) ชายกลางคนนี้เป็นกระบวนการใหม่หรือ sub-shell
จากos.system
:
ดำเนินการคำสั่ง (สตริง) ใน subshell ...
และsubprocess
เป็นเพียงโมดูลสำหรับวางไข่กระบวนการใหม่
คุณสามารถทำสิ่งที่คุณต้องการโดยไม่ต้องวางไข่กระบวนการเหล่านี้
os
จุดมุ่งหมายของโมดูลคือการให้บริการระบบปฏิบัติการทั่วไปและมันเป็นคำอธิบายเริ่มต้นด้วย:
โมดูลนี้มีวิธีพกพาในการใช้ฟังก์ชั่นการทำงานของระบบ
คุณสามารถใช้งานได้os.listdir
ทั้งบน windows และ unix การพยายามใช้os.system
/ subprocess
สำหรับฟังก์ชันนี้จะบังคับให้คุณรักษาการโทรสองสาย (สำหรับls
/ dir
) และตรวจสอบว่าคุณใช้ระบบปฏิบัติการใดอยู่ สิ่งนี้ไม่ใช่แบบพกพาและจะทำให้เกิดความยุ่งยากมากขึ้นในภายหลัง (ดูการจัดการเอาต์พุต )
การทำความเข้าใจผลลัพธ์ของคำสั่ง:
สมมติว่าคุณต้องการแสดงรายการไฟล์ในไดเรกทอรี
หากคุณใช้os.system("ls")
/ subprocess.call(['ls'])
คุณจะได้ผลลัพธ์ของกระบวนการกลับคืนมาซึ่งโดยทั่วไปจะเป็นสตริงขนาดใหญ่ที่มีชื่อไฟล์
คุณจะบอกไฟล์ที่มีช่องว่างในชื่อนั้นจากสองไฟล์ได้อย่างไร?
จะทำอย่างไรถ้าคุณไม่ได้รับอนุญาตให้แสดงรายการไฟล์
คุณควรแมปข้อมูลกับวัตถุหลามอย่างไร
นี่เป็นเพียงส่วนหัวของฉันเท่านั้นและในขณะที่มีวิธีแก้ปัญหาเหล่านี้ - ทำไมต้องแก้ปัญหาอีกครั้งสำหรับคุณ
นี่คือตัวอย่างของการทำตามหลักการอย่าทำซ้ำตัวเอง (มักอ้างว่าเป็น "DRY") โดยไม่ทำซ้ำการใช้งานที่มีอยู่แล้วและพร้อมให้คุณใช้งานได้ฟรี
ความปลอดภัย:
os.system
และsubprocess
มีพลัง มันดีเมื่อคุณต้องการพลังนี้ แต่มันอันตรายเมื่อคุณไม่ต้องการ เมื่อคุณใช้งานos.listdir
คุณจะรู้ว่าไม่สามารถทำสิ่งอื่นใดแล้วแสดงรายการไฟล์หรือทำให้เกิดข้อผิดพลาด เมื่อคุณใช้os.system
หรือsubprocess
เพื่อให้บรรลุพฤติกรรมเดียวกันคุณสามารถลงเอยทำสิ่งที่คุณไม่ได้ตั้งใจทำ
ความปลอดภัยในการฉีด (ดูตัวอย่างการฉีดเปลือก ) :
หากคุณใช้อินพุตจากผู้ใช้เป็นคำสั่งใหม่คุณได้ให้เชลล์แก่เขา นี่เหมือนกับการฉีด SQL โดยให้เชลล์ในฐานข้อมูลสำหรับผู้ใช้
ตัวอย่างจะเป็นคำสั่งของแบบฟอร์ม:
# ... read some user input
os.system(user_input + " some continutation")
นี้สามารถใช้ประโยชน์ได้อย่างง่ายดายเพื่อให้ทำงานใด ๆรหัสที่กำหนดเองโดยใช้การป้อนข้อมูล: NASTY COMMAND;#
การสร้างที่สุด:
os.system("NASTY COMMAND; # some continuation")
มีคำสั่งมากมายที่สามารถทำให้ระบบของคุณมีความเสี่ยง