Perbedaan antara subprocess.Popen dan os.system

117

Apa perbedaan antara subprocess.Popen()dan os.system()?

Arovit
sumber

Jawaban:

99

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().

Jacob Marble
sumber
Anda juga dapat menggunakan sts = p.wait()sebagai pengganti baris terakhir.
Sven Marnach
1
@ JacobMarble jadi misalkan saya memanggil skrip scraping selenium dari skrip python lain, yang mana di antara ini akan memungkinkan saya untuk menyelesaikan skrip scraping dan kemudian dan baru kemudian mengeksekusi baris kode berikutnya? Seperti, penggosokan saya harus selesai sebelum eksekusi dapat dilanjutkan.
Prakhar Mohan Srivastava
Mungkin juga menyebutkan stackoverflow.com/questions/3172470/… untuk menunjukkan bahwa Anda harus menghindari shell=Truejika Anda bisa. Memiliki opsi ini adalah salah satu manfaat subprocess.Popen()dan fungsi penolongnya.
tripleee
@PrakharMohanSrivastava Jika Anda ingin memblokir aliran dan menunggu perintah untuk menyelesaikan pekerjaannya, periksa: stackoverflow.com/a/2837319/5252192
AmirHossein
@PrakharMohanSrivastava, secara umum baik os.systemdan subprocess.call/popen/runmemblokir / menunggu perintah selesai: stackoverflow.com/a/14059648/4752883
alpha_989
47

subprocess.Popen()adalah kumpulan super ketat os.system().

Jan Hudec
sumber
10
Ini adalah jawaban elegan yang lengkap.
Farsheed
23

os.systemsetara dengan systemperintah Unix , sedangkan subprocessmodul pembantu dibuat untuk menyediakan banyak fasilitas yang disediakan oleh Popenperintah 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 subprocesspasti karena Anda memiliki semua fasilitas untuk eksekusi, ditambah kontrol tambahan atas prosesnya.

Senthil Kumaran
sumber
oke..lalu adakah cara saya dapat mengeksekusi kedua os.system dan popen di windows env? saya seorang pemula dan perlu menggali lebih dalam ..
Arovit
Ya, Anda dapat menggunakan os.system dan subprocess di Lingkungan Windows. Lihat tutorial dasar dari effbot.org (buku online Python Standard Library)
Senthil Kumaran
Hati-hati - jika Anda menjalankan pada sistem yang lebih lama, modul subproses tidak tersedia.
Steve Hanov
21

Subproses didasarkan pada popen2, dan dengan demikian memiliki sejumlah keunggulan - ada daftar lengkap di PEP di sini , tetapi beberapa di antaranya:

  • menggunakan pipa di cangkang
  • dukungan baris baru yang lebih baik
  • penanganan pengecualian yang lebih baik
Andy Mikula
sumber
2

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.

BPL
sumber