Python subprocessサブプロセス管理(二)
2618 ワード
subprocessモジュールのPopenクラスについて引き続き紹介します.Popenクラスは強力で、サブプロセスを管理するための多くのパラメータと方法を提供しています.その中の多くの数のパラメータは私が自分で使ったことがありません.だから、この部分は公式ドキュメントの運搬業者になるだけです.
class
args,stdin,stdout,stderr,shellは,以前の3つの関数の用法と同様である.前編ではstderr=PIPEの場合にPopenを推奨する.communicate()メソッドは、wait()メソッドを紹介する際に原因を説明しますが、他のここでは繰り返しません.
bufsize:キャッシュサイズ、0はキャッシュなし、正数はキャッシュサイズ、負数はシステムのデフォルトサイズを使用します.
executable:shell=Falseの場合、argsのコマンドに代わりますが、argsの値はexecutableで指定されたプログラムに渡されます.shell=Trueの場合、argsはシステムのデフォルトの代わりにexecutableで指定されたshellを起動します.(windowsでPopenを実行してみました(「print a」,shell=True,executable='c:\Python 27\python.exe'は成功しませんでした.c:windowssystem 32cmd.exe:can not open file'/c'No such file or directory.を投げ出しても原因が分かりません.上級者がいたらご指導ください.linuxで試験してから更新します)
preexec_fn:サブプロセスの開始前に実行される関数などの呼び出し可能なオブジェクトを指定します(unix only)
close_fd:Unixでは、サブプロセスが実行される前に0,1,2以外のファイル記述をすべて閉じます.Windowsでは、0,1,2を含む親プロセスのファイル記述は継承されません.
Env:none以外の場合、親プロセスを継承せずにenvで指定した環境変数が使用されます.
startupinfo:STARTUPINFOクラス、CreateProcessメソッドに渡されます.このクラスはsubprocessモジュールにもあり、Windowsでのパラメータ制御サブプロセスの実行を定義するために使用されます.具体的な使い方がよくわかりません.Windows only.
creationflage:CREATENEW_CONSOLEまたはCREATE_NEW_PROCESS_GROUP. CREATE_NEW_COSOLEは、親プロセスから継承するのではなく、サブプロセスが新しいconsoleで実行されることを示します.CREATE_NEW_PROCESS_GROUPは、新しいプロセスグループを生成します.Windows Only.
次はPopenオブジェクトのいくつかの方法です.
Popen.Poll():サブプロセスが停止しているかどうかを確認します.0を返すと停止、noneを返すとない.ここでは、poll()を使用してサブプロセスが停止したかどうかを判断し、親プロセスで印刷出力を停止した場合に問題が発生したという投稿を見ました.http://bbs.chinaunix.net/thread-3775926-1-1.html.とても参考になります.
Popen.wait():サブプロセスが終了するのを待ってreturncodeを返します.ここで、stdout=PIPE or stderr=PIPEを使用する場合は、この関数は使用しないでください.なぜなら、出力がPIPEのsizeを超えると、サブプロセスはPIPEへの出力を停止するからである.しかし、親プロセスはサブプロセスが完了するまで待たなければならないため、デッドロックが発生します.公式にはPopenを使用することをお勧めします.communicate().なぜならcommunicateはstdout,stderrのデータをメモリに格納し,この問題を解決したからである.この文章はこの問題をよく示している.https://blog.csdn.net/carolzhang8406/article/details/22286913
Popen.communicate(input=None):inputをサブプロセスに入力し、stdoutおよびstderrからEOFまでデータを読み出します.メタグループ(stdoutdata,stderrdata)を返します.ここでも、comunicate関数はメモリにデータを格納するため、大量または無制限のデータを出力する場合はこの関数を使用するべきではないという問題に注意してください.
Popen.send_signal(signal):signalをサブプロセスに渡すのは、Windowsではほとんど役に立たない.
Popen.terminate():サブプロセスを停止します.Posix OSsでは,この方法はサブプロセスにSIGTERMを送信する.WindowsでTerminateProcess()を呼び出す
Popen.kill():サブプロセスを殺します.Posix OSsで、SIGKILLをサブプロセスに送信します.WindowsでPopen.terminate()同じ
class
subprocess.
Popen
(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) args,stdin,stdout,stderr,shellは,以前の3つの関数の用法と同様である.前編ではstderr=PIPEの場合にPopenを推奨する.communicate()メソッドは、wait()メソッドを紹介する際に原因を説明しますが、他のここでは繰り返しません.
bufsize:キャッシュサイズ、0はキャッシュなし、正数はキャッシュサイズ、負数はシステムのデフォルトサイズを使用します.
executable:shell=Falseの場合、argsのコマンドに代わりますが、argsの値はexecutableで指定されたプログラムに渡されます.shell=Trueの場合、argsはシステムのデフォルトの代わりにexecutableで指定されたshellを起動します.(windowsでPopenを実行してみました(「print a」,shell=True,executable='c:\Python 27\python.exe'は成功しませんでした.c:windowssystem 32cmd.exe:can not open file'/c'No such file or directory.を投げ出しても原因が分かりません.上級者がいたらご指導ください.linuxで試験してから更新します)
preexec_fn:サブプロセスの開始前に実行される関数などの呼び出し可能なオブジェクトを指定します(unix only)
close_fd:Unixでは、サブプロセスが実行される前に0,1,2以外のファイル記述をすべて閉じます.Windowsでは、0,1,2を含む親プロセスのファイル記述は継承されません.
Env:none以外の場合、親プロセスを継承せずにenvで指定した環境変数が使用されます.
startupinfo:STARTUPINFOクラス、CreateProcessメソッドに渡されます.このクラスはsubprocessモジュールにもあり、Windowsでのパラメータ制御サブプロセスの実行を定義するために使用されます.具体的な使い方がよくわかりません.Windows only.
creationflage:CREATENEW_CONSOLEまたはCREATE_NEW_PROCESS_GROUP. CREATE_NEW_COSOLEは、親プロセスから継承するのではなく、サブプロセスが新しいconsoleで実行されることを示します.CREATE_NEW_PROCESS_GROUPは、新しいプロセスグループを生成します.Windows Only.
次はPopenオブジェクトのいくつかの方法です.
Popen.Poll():サブプロセスが停止しているかどうかを確認します.0を返すと停止、noneを返すとない.ここでは、poll()を使用してサブプロセスが停止したかどうかを判断し、親プロセスで印刷出力を停止した場合に問題が発生したという投稿を見ました.http://bbs.chinaunix.net/thread-3775926-1-1.html.とても参考になります.
Popen.wait():サブプロセスが終了するのを待ってreturncodeを返します.ここで、stdout=PIPE or stderr=PIPEを使用する場合は、この関数は使用しないでください.なぜなら、出力がPIPEのsizeを超えると、サブプロセスはPIPEへの出力を停止するからである.しかし、親プロセスはサブプロセスが完了するまで待たなければならないため、デッドロックが発生します.公式にはPopenを使用することをお勧めします.communicate().なぜならcommunicateはstdout,stderrのデータをメモリに格納し,この問題を解決したからである.この文章はこの問題をよく示している.https://blog.csdn.net/carolzhang8406/article/details/22286913
Popen.communicate(input=None):inputをサブプロセスに入力し、stdoutおよびstderrからEOFまでデータを読み出します.メタグループ(stdoutdata,stderrdata)を返します.ここでも、comunicate関数はメモリにデータを格納するため、大量または無制限のデータを出力する場合はこの関数を使用するべきではないという問題に注意してください.
Popen.send_signal(signal):signalをサブプロセスに渡すのは、Windowsではほとんど役に立たない.
Popen.terminate():サブプロセスを停止します.Posix OSsでは,この方法はサブプロセスにSIGTERMを送信する.WindowsでTerminateProcess()を呼び出す
Popen.kill():サブプロセスを殺します.Posix OSsで、SIGKILLをサブプロセスに送信します.WindowsでPopen.terminate()同じ