subprocess
モジュールを使用する小さなアプリを書こうとしています。
私のプログラムは、処理に時間がかかる外部Bashコマンドを呼び出します。この間、ユーザーに次のような一連のメッセージを表示したいと思います。
処理。お待ちください...
出力はfoo()です
Popen.wait()
またはPopen.poll()
を使用してこれを行うにはどうすればよいですか。私はPopen.returncode
を使用する必要があることを読みましたが、どのようにしてアクティブに状態をチェックすることができるのか、わかりません。
wait()
(timeout
が指定されている場合)と poll()
の両方がNone
を返しますプロセスがまだ終了しておらず、プロセスが何か別の場合hasが終了した場合(整数、終了コード、できれば0だと思います)。
編集:
wait
(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が詰め込まれないようにする必要があることに注意してください。
@extraneonの答えは少し逆です。 wait()
とpoll()
はどちらも、プロセスが終了した場合、プロセスの終了コードを返します。プロセスがまだ実行中の場合、poll()
メソッドはNone
を返し、wait()
メソッドはプロセスが終了するまでブロックします。
次のページをご覧ください。 https://docs.python.org/3.4/library/subprocess.html#popen-objects
Popen.poll()
子プロセスが終了したかどうかを確認します。 returncode属性を設定して返します。
Popen.wait()
子プロセスが終了するのを待ちます。 returncode属性を設定して返します。