Saya meluncurkan sejumlah subproses dengan subprocess.Popen di Python. Saya ingin memeriksa apakah salah satu proses tersebut telah selesai. Saya telah menemukan dua cara untuk memeriksa status subproses, tetapi keduanya tampaknya memaksa proses untuk menyelesaikannya. Salah satunya adalah menggunakan process.communicate() dan mencetak returncode, seperti yang dijelaskan di sini. Cara lainnya adalah dengan memanggil process.wait() dan memeriksa bahwa hasilnya 0.
Apakah ada cara untuk memeriksa apakah sebuah proses masih berjalan tanpa menunggu proses tersebut selesai jika memang selesai?
Pertanyaan: ... cara untuk memeriksa apakah suatu proses masih berjalan ...
Anda dapat melakukannya misalnya:
p = subprocess.Popen(...
"""
A None value indicates that the process hasn't terminated yet.
"""
poll = p.poll()
if poll == None:
# p.subprocess is alive
Python » 3.6.1 Documentation popen-objects
Diuji dengan Python:3.4.2
Melakukan
myProcessIsRunning = poll() is None
Seperti yang disarankan oleh jawaban utama, adalah cara yang disarankan dan cara paling sederhana untuk memeriksa apakah suatu proses berjalan. (dan ini juga berfungsi di jython)
Jika Anda tidak memiliki instance proses untuk memeriksanya. Kemudian gunakan proses TaskList / Ps sistem operasi.
Di windows, perintah saya akan terlihat sebagai berikut:
filterByPid = "PID eq %s" % pid
pidStr = str(pid)
commandArguments = ['cmd', '/c', "tasklist", "/FI", filterByPid, "|", "findstr", pidStr ]
Ini pada dasarnya melakukan hal yang sama seperti baris perintah berikut:
cmd /c "tasklist /FI "PID eq 55588" | findstr 55588"
Dan pada linux, saya melakukan hal yang persis sama menggunakan perintah:
pidStr = str(pid)
commandArguments = ['ps', '-p', pidStr ]
Perintah ps sudah akan mengembalikan kode error 0 / 1 tergantung apakah prosesnya ditemukan. Sedangkan pada windows anda membutuhkan perintah find string.
Ini adalah pendekatan yang sama yang dibahas pada thread stack overflow berikut:
https://stackoverflow.com/questions/21460775/verify-if-a-process-is-running-using-its-pid-in-java
CATATAN: Jika Anda menggunakan pendekatan ini, ingatlah untuk membungkus panggilan perintah Anda dalam coba: foundRunningProcess = subproses.check_output(argumentsArray, **kwargs) kembali Benar kecuali Exception sebagai err: return False
Catatan, berhati-hatilah jika Anda mengembangkan dengan VS Code dan menggunakan Python dan Jython murni. Di lingkungan saya, saya berada di bawah ilusi bahwa metode poll() tidak berfungsi karena proses yang saya duga pasti sudah berakhir memang berjalan. Proses ini telah meluncurkan Wildfly. Dan setelah saya meminta wildfly untuk berhenti, shell masih menunggu pengguna untuk "Press any key to continue . . ".
Untuk menyelesaikan proses ini, dalam python murni, kode berikut ini bekerja:
process.stdin.write(os.linesep)
Pada jython, saya harus memperbaiki kode ini agar terlihat sebagai berikut:
print >>process.stdin, os.linesep
Dan dengan perbedaan ini prosesnya memang selesai. Dan jython.poll() mulai memberitahu saya bahwa prosesnya memang sudah selesai.