Pythonのsubprocess.Popenを使っていくつかのサブプロセスを起動しています。 そのようなプロセスが完了したかどうかをチェックしたいのです。サブプロセスのステータスをチェックする方法を2つ見つけましたが、どちらもプロセスを強制的に完了させるようです。 1つはprocess.communication()を使い、ここで説明されているようにreturncodeを表示する方法です。 もうひとつは、process.wait()を単純に呼び出し、それが0を返すことを確認する方法である。
プロセスがまだ実行中かどうかを、プロセスが完了するのを待たずにチェックする方法はありますか?
質問です:... プロセスがまだ実行中かどうかを確認する方法 ...
例えばこんなことができます:
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 ドキュメント popen-objects を参照してください。
Python:3.4.2 でテストされています。
を行う。
myProcessIsRunning = poll() is None
メインアンサーで提案されているように、プロセスが実行中かどうかをチェックするための推奨される方法であり、最も簡単な方法です。(jythonでも同様に動作します)
プロセスのインスタンスが手元にない場合は、OSのTaskListを使います。 オペレーティングシステムのTaskList / Ps processesを使います。
ウィンドウズの場合、私のコマンドは以下のようになる:
filterByPid = "PID eq %s" % pid
pidStr = str(pid)
commandArguments = ['cmd', '/c', "tasklist", "/FI", filterByPid, "|", "findstr", pidStr ]
これは基本的に以下のコマンドラインと同じことを行っている:
cmd /c "tasklist /FI "PID eq 55588" | findstr 55588"
また、Linuxでは、次のコマンドラインを使ってまったく同じことをする:
pidStr = str(pid)
commandArguments = ['ps', '-p', pidStr ]
psコマンドは、プロセスが見つかったかどうかによって、すでにエラーコード0/1を返している。ウィンドウズでは、find stringコマンドが必要です。
これは、以下のスタック・オーバーフローのスレッドで議論されているのと同じアプローチです:
https://stackoverflow.com/questions/21460775/verify-if-a-process-is-running-using-its-pid-in-java
注意: この方法を使う場合は、コマンドの呼び出しを を試す: foundRunningProcess = subprocess.check_output(argumentsArray, **kwargs) return True except Exception as err: return False
なお、VS Codeで開発していて、純粋なPythonやJythonを使っている場合は注意が必要だ。 私の環境では、poll()メソッドが動作していないように錯覚していたのだが、これは終了したはずのプロセスが確かに動作していたからだ。 このプロセスはWildflyを起動していた。そして、私がwildflyに停止を要求した後も、シェルはユーザーの"Press any key to continue .."。
このプロセスを終了させるために、純粋なpythonでは以下のコードが動作していた:
process.stdin.write(os.linesep)
jythonでは、このコードを以下のように修正しなければならなかった:
print >>process.stdin, os.linesep
そしてこの違いで、プロセスは確かに終了した。 そして、jython.poll()はプロセスが確かに終了したことを教えてくれるようになった。