web-dev-qa-db-ja.com

サブプロセスのwait()およびpoll()の使用

subprocessモジュールを使用する小さなアプリを書こうとしています。

私のプログラムは、処理に時間がかかる外部Bashコマンドを呼び出します。この間、ユーザーに次のような一連のメッセージを表示したいと思います。

処理。お待ちください...
出力はfoo()です

Popen.wait()またはPopen.poll()を使用してこれを行うにはどうすればよいですか。私はPopen.returncodeを使用する必要があることを読みましたが、どのようにしてアクティブに状態をチェックすることができるのか、わかりません。

21
user225312

wait()timeoutが指定されている場合)と poll() の両方がNoneを返しますプロセスがまだ終了しておらず、プロセスが何か別の場合hasが終了した場合(整数、終了コード、できれば0だと思います)。

編集

wait()poll() は異なる動作をします:

  • wait(timeout引数なし)はブロックし、プロセスが完了するまで待機します。
  • timeout引数を指定したwaitは、プロセスが完了するまでtimeout秒待機します。完了しない場合は、TimeoutExpired例外がスローされます。例外をキャッチした場合は、続行するか、再度waitを使用できます。
  • pollは常にすぐに戻ります。実質的にタイムアウト0で待機し、例外をキャッチして、プロセスが完了していない場合はNoneを返します。
  • waitまたはpollのいずれかを使用して、プロセスが完了した場合、popenオブジェクトの returncode が設定されます(それ以外の場合は、Noneです。 waitまたはpoll)を呼び出すのと同じくらい簡単で、関数からの戻り値もプロセスの戻りコードになります。

</ Edit>

だから私はあなたが次のようなことをするべきだと思います:

_while myprocess.poll() is None:
    print("Still working...")
    # sleep a while
_

Bashスクリプトが大量の出力を作成する場合、communicate()または同様の何かを使用してstdoutまたはstderrが詰め込まれないようにする必要があることに注意してください。

29
extraneon

@extraneonの答えは少し逆です。 wait()poll()はどちらも、プロセスが終了した場合、プロセスの終了コードを返します。プロセスがまだ実行中の場合、poll()メソッドはNoneを返し、wait()メソッドはプロセスが終了するまでブロックします。

次のページをご覧ください。 https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

子プロセスが終了したかどうかを確認します。 returncode属性を設定して返します。

Popen.wait()

子プロセスが終了するのを待ちます。 returncode属性を設定して返します。

28
onlynone