Anda juga dapat memanggil mereka melalui subprocessmodul, 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.callmemberi kami sedikit perlindungan tambahan.
- Penanganan kesalahan: Sebenarnya tidak memberi kami deteksi kesalahan lagi, kami masih bergantung pada
retcodedalam 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 subprocesslebih 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 startperintah Windows mengharuskan Anda untuk lulus shell=Trueyang meniadakan sebagian besar manfaat menggunakan subprocess.