Ada empat kasus kuat untuk memilih metode Python yang lebih spesifik dalam os
modul daripada menggunakan os.system
atau subprocess
modul saat menjalankan perintah:
- Redundansi - menelurkan proses lain adalah redundan dan membuang-buang waktu dan sumber daya.
- Portabilitas - Banyak metode dalam
os
modul ini tersedia di berbagai platform sementara banyak perintah shell bersifat spesifik-os.
- Memahami hasil - Memunculkan proses untuk mengeksekusi perintah sewenang-wenang memaksa Anda untuk menguraikan hasil dari output dan memahami jika dan mengapa suatu perintah telah melakukan sesuatu yang salah.
- Keamanan - Suatu proses berpotensi mengeksekusi perintah apa pun yang diberikan. Ini adalah desain yang lemah dan dapat dihindari dengan menggunakan metode spesifik dalam
os
modul.
Anda sebenarnya mengeksekusi "perantara" yang berlebihan dalam perjalanan Anda ke panggilan sistem yang akhirnya ( chmod
dalam contoh Anda). Orang tengah ini adalah proses atau sub-shell baru.
Dari os.system
:
Jalankan perintah (string) dalam subkulit ...
Dan subprocess
hanya sebuah modul untuk menelurkan proses baru.
Anda dapat melakukan apa yang Anda butuhkan tanpa memunculkan proses ini.
Tujuan os
modul adalah untuk menyediakan layanan sistem operasi generik dan uraiannya dimulai dengan:
Modul ini menyediakan cara portabel menggunakan fungsionalitas yang tergantung pada sistem operasi.
Anda dapat menggunakan os.listdir
kedua windows dan unix. Mencoba menggunakan os.system
/ subprocess
untuk fungsi ini akan memaksa Anda untuk mempertahankan dua panggilan (untuk ls
/ dir
) dan memeriksa sistem operasi yang Anda gunakan . Ini tidak portabel dan akan menyebabkan frustrasi lebih banyak di kemudian hari (lihat Menangani Penanganan ).
Memahami hasil perintah:
Misalkan Anda ingin membuat daftar file dalam direktori.
Jika Anda menggunakan os.system("ls")
/ subprocess.call(['ls'])
, Anda hanya bisa mendapatkan kembali proses, yang pada dasarnya adalah string besar dengan nama file.
Bagaimana Anda bisa memberi tahu file dengan spasi di namanya dari dua file?
Bagaimana jika Anda tidak memiliki izin untuk mendaftarkan file?
Bagaimana seharusnya Anda memetakan data ke objek python?
Ini hanya di atas kepala saya, dan sementara ada solusi untuk masalah ini - mengapa memecahkan lagi masalah yang dipecahkan untuk Anda?
Ini adalah contoh mengikuti prinsip Don't Repeat Yourself (Sering disebut sebagai "KERING") dengan tidak mengulangi implementasi yang sudah ada dan tersedia secara bebas untuk Anda.
Keamanan:
os.system
dan subprocess
sangat kuat. Itu bagus ketika Anda membutuhkan kekuatan ini, tetapi itu berbahaya ketika Anda tidak. Ketika Anda menggunakan os.listdir
, Anda tahu itu tidak bisa melakukan hal lain selain daftar file atau meningkatkan kesalahan. Ketika Anda menggunakan os.system
atau subprocess
untuk mencapai perilaku yang sama, Anda berpotensi berakhir melakukan sesuatu yang tidak Anda inginkan.
Keselamatan Injeksi (lihat contoh injeksi shell ) :
Jika Anda menggunakan input dari pengguna sebagai perintah baru, pada dasarnya Anda memberinya shell. Ini seperti injeksi SQL yang menyediakan shell di DB untuk pengguna.
Contohnya adalah perintah dari formulir:
# ... read some user input
os.system(user_input + " some continutation")
Ini dapat dengan mudah dieksploitasi untuk menjalankan kode arbitrer apa pun menggunakan input: NASTY COMMAND;#
untuk membuat akhirnya:
os.system("NASTY COMMAND; # some continuation")
Ada banyak perintah yang dapat membahayakan sistem Anda.