Jawaban:
Jika Anda memeriksa bagian subproses dari dokumen Python , Anda akan melihat ada contoh cara mengganti os.system()
dengan subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... melakukan hal yang sama seperti ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
Kode yang "ditingkatkan" terlihat lebih rumit, tetapi lebih baik karena setelah Anda mengetahuinya subprocess.Popen()
, Anda tidak memerlukan yang lain. subprocess.Popen()
menggantikan beberapa alat lain ( os.system()
hanya salah satunya) yang tersebar di tiga modul Python lainnya.
Jika membantu, anggap subprocess.Popen()
sebagai sangat fleksibel os.system()
.
shell=True
jika Anda bisa. Memiliki opsi ini adalah salah satu manfaat subprocess.Popen()
dan fungsi penolongnya.
os.system
dan subprocess.call/popen/run
memblokir / menunggu perintah selesai: stackoverflow.com/a/14059648/4752883
os.system
setara dengan system
perintah Unix , sedangkan subprocess
modul pembantu dibuat untuk menyediakan banyak fasilitas yang disediakan oleh Popen
perintah dengan antarmuka yang lebih mudah dan dapat dikontrol. Itu dirancang mirip dengan perintah Unix Popen .
system()
mengeksekusi perintah yang ditentukan dalam perintah dengan memanggil/bin/sh -c command
, dan kembali setelah perintah selesai
Sedangkan:
The
popen()
fungsi membuka proses dengan menciptakan sebuah pipa, forking, dan memohon shell.
Jika Anda berpikir mana yang akan digunakan, gunakan subprocess
pasti karena Anda memiliki semua fasilitas untuk eksekusi, ditambah kontrol tambahan atas prosesnya.
Subproses didasarkan pada popen2, dan dengan demikian memiliki sejumlah keunggulan - ada daftar lengkap di PEP di sini , tetapi beberapa di antaranya:
Saat menjalankan python (cpython) di windows, <built-in function system>
os.system akan dijalankan di bawah tirai _wsystem sementara jika Anda menggunakan os non-windows, itu akan menggunakan sistem .
Sebaliknya, Popen harus menggunakan CreateProcess di windows dan _posixsubprocess.fork_exec dalam sistem operasi berbasis posix .
Yang mengatakan, saran penting berasal dari dokumen os.system , yang mengatakan:
Modul subproses menyediakan fasilitas yang lebih kuat untuk menghasilkan proses baru dan mengambil hasilnya; menggunakan modul itu lebih baik daripada menggunakan fungsi ini. Lihat bagian Mengganti Fungsi Lama dengan Modul subproses di dokumentasi subproses untuk beberapa resep yang berguna.
sts = p.wait()
sebagai pengganti baris terakhir.