Anda juga dapat memanggil mereka melalui subprocess
modul, tetapi ...
Untuk Python 2.7 dan yang lebih baru, cukup gunakan
subprocess.check_call(['open', filename])
Dalam Python 3.5+ Anda dapat menggunakan cara yang sedikit lebih rumit tetapi juga agak lebih setara
subprocess.run(['open', filename], check=True)
Jika Anda harus kompatibel kembali ke Python 2.4, Anda dapat menggunakan subprocess.call()
dan mengimplementasikan pemeriksaan kesalahan Anda sendiri:
try:
retcode = subprocess.call("open " + filename, shell=True)
if retcode < 0:
print >>sys.stderr, "Child was terminated by signal", -retcode
else:
print >>sys.stderr, "Child returned", retcode
except OSError, e:
print >>sys.stderr, "Execution failed:", e
Sekarang, apa keuntungan menggunakan subprocess
?
- Keamanan: Secara teori, ini lebih aman, tetapi sebenarnya kita perlu mengeksekusi baris perintah dengan satu atau lain cara; di kedua lingkungan, kita membutuhkan lingkungan dan layanan untuk menafsirkan, mendapatkan jalur, dan sebagainya. Dalam kedua kasus kami mengeksekusi teks arbitrer, sehingga tidak memiliki masalah "tetapi Anda dapat mengetik
'filename ; rm -rf /'
" yang melekat , dan jika nama file dapat rusak, menggunakan subprocess.call
memberi kami sedikit perlindungan tambahan.
- Penanganan kesalahan: Sebenarnya tidak memberi kami deteksi kesalahan lagi, kami masih bergantung pada
retcode
dalam kedua kasus; tetapi perilaku untuk secara eksplisit meningkatkan pengecualian dalam kasus kesalahan pasti akan membantu Anda memperhatikan jika ada kegagalan (meskipun dalam beberapa skenario, traceback mungkin sama sekali tidak lebih membantu daripada mengabaikan kesalahan).
- Menumbuhkan subproses (non-blocking) : Kami tidak perlu menunggu proses anak, karena kami dengan pernyataan masalah memulai proses terpisah.
Untuk keberatan "Tetapi subprocess
lebih disukai." Namun, os.system()
tidak usang, dan dalam beberapa hal alat paling sederhana untuk pekerjaan khusus ini. Kesimpulan: menggunakan os.system()
karena itu juga merupakan jawaban yang benar.
Kerugian yang ditandai adalah bahwa start
perintah Windows mengharuskan Anda untuk lulus shell=True
yang meniadakan sebagian besar manfaat menggunakan subprocess
.