著者:Vamei
出典:のhttp://www.cnblogs.com/vamei
サブプロセスパッケージ主な機能は、外部コマンドや手順を実行することです。シェルに似たサブプロセスの機能。
パッケージで定義されたサブプロセスは、これらの機能は、必要に応じて、我々が使用する1つを選択することができますので、別の方法で子プロセスを作成するには、いくつかの関数は、子プロセスを作成します。
またサブプロセスも、プロセス間のテキスト通信を使用するパイプのためのいくつかの管理標準的なフロー(標準ストリーム)とツール(パイプ)を提供します。
機能サブプロセスパッケージを使用して子プロセスを作成し、ときに注意払うために:
子プロセスを作成した後1)、親プロセスが一時停止され、そして子供のための待ち時間は、実行するために
どのような2)関数が返すの
リターンコードが0でない場合3)、どのように親プロセスプロセス
subprocess.Popen()
popenのは、子と親プロセスが並列に実行される作成するために使用される、デフォルトの親は、新しいプロセスの終了を待ちません。
私たちは、オブジェクトの待機()メソッドを呼び出す必要があり、親プロセスは、(ブロックをブロックしている)待機します。
インポートサブプロセス 子 = subprocess.Popen([ " ピング"、" -c "、" 5 "、" www.google.com " ]) printf(" 親プロセス")
営業成績、親プロセスから見たオープン子プロセス後の子供の完了を待たないが、直接印刷を実行します。
待機の比較:
インポートサブプロセス 子 = subprocess.Popen([ " ピング"、" -c "、" 5 "、" www.google.com " ]) child.wait() 印刷(「親プロセス」)
上記の例では、このような子オブジェクトとして他の操作を実行するために子プロセス親プロセス:
- child.poll():子のステータスを確認
- child.kill():ターミネータプロセス
- child.send_signal():子プロセスにシグナルを送ります
- child.terminate():ターミネータプロセス
- child.pid:子プロセスのPID
テキストフロー制御サブプロセスの
標準入力、標準出力と子プロセスの標準誤差は、次の特性によって表すことができます。
- child.stdin
- child.stdout
- child.stderr
子プロセスpopenの標準入力、標準出力および標準誤差の変化を確立し、そしてsubprocess.PIPE入出力複数のサブプロセスを使用して互いに接続することができる場合、我々は()、パイプ(管)を構成することができます。
インポートサブプロセス child1の = subprocess.Popen([ " LS "、" -l " ]、STDOUT = subprocess.PIPE) child2の = subprocess.Popen([ " WC " ]、STDIN = child1.stdout、STDOUT = subprocess.PIPE) アウト = child2.communicate() プリント(アウト)
subprocess.PIPEは、実際にはテキストストリームのためのバッファゾーンを提供しています。
バッファにテキスト出力のchild1の標準出力、そして標準入力は離れPIPEのテキストから読み込むCHILD2。
child2の出力テキストはまた、からPIPEパイプのテキストを読み出すと通信()メソッドまでパイプ内に格納されています。
オペレーティングstdinとstdoutを
インポートサブプロセス child1の = subprocess.Popen([ " ピング"、" -n "、" 5 "、" sina.com.cn " ]、STDOUT = subprocess.PIPE、標準エラー= subprocess.STDOUT) アウト = child1.stdout.read()。デコード(' CP936 ' ) プリント(アウト) #child1.stdout.readlinesの行のための(): #1 出力= line.decode( 'CP936') #の 印刷( "%sの\ n" %出力)
Pingのsina.com.cn [123.126.55.41] 32の持っているデータのバイトは:バイト= 32時間= 40msのTTL = 49:123.126.55.41の応答 からバイト= 32時間= 40msのTTL = 49:123.126.55.41の応答 から 123.126.55.41の返信:バイト= 32時間= 44ms TTL = 49 から 123.126.55.41の返信:バイト= 32時間= 41ms TTL = 49 から 123.126.55.41返信:バイト= 32時間= 40msのTTL = 49 123.126.55.41 ping統計の: パケット:送信済み = 5、5 =、受信欠落= 0(0%の損失)、 (ミリ秒単位)の推定往復時間: 最小 = 40ミリ秒、最大= 44ms、平均= 41ms
通信()
popenのは、子プロセスが完了するまで親プロセスを詰まらせることができますメソッドオブジェクトであり、新しいプロセスと対話することができます通信しますが、時にパイプのリダイレクトのpopenに構築されなければなりません。
デフ)(TestCommunicate: 輸入サブプロセス CMD = " DIR " のp = subprocess.Popen(CMD、シェル= Trueの場合、STDOUT = subprocess.PIPE、標準エラー出力= subprocess.STDOUT) (stdoutdata、stderrdata) = p.communicate() もし p.returncode =!0: プリント(CMD + " エラー!" ) #はdefaultly戻りstdoutdataはあるバイト、STRとCP936に必要の変換 のための R で STR(stdoutdata、エンコード= ' CP936 ').split(" \ nは" ): プリント(R) 印刷(p.returncode) デフ)(TestCommunicate2: 輸入サブプロセス CMD = " DIR " #1 universal_newlines = Trueの場合、それはオープンstdoutとstderrへのテキストによって意味 のp = subprocess.Popen(CMD、シェル= Trueの場合、universal_newlines = Trueの場合、STDOUT = subprocess.PIPE、標準エラー出力= subprocess.STDOUT) curline = p.stdout.readline() しばらく(!curline = "" ): プリント(curline) curline = p.stdout.readline() p.wait() 印刷(p.returncode)
subprocess.call()、subprocess.check_call()、subprocess.check_output()
subprocess.call()
親プロセスは完全に子プロセスを待ち
終了リターン情報(終了コードと同等のリターンコード、Linuxプロセスの基礎を参照してください)
subprocess.check_call()
親プロセスは完全に子プロセスを待ち
戻り値0
リターンコードが0でない場合、それはエラーsubprocess.CalledProcessErrorを含み、退出情報を確認し、オブジェクトがリターンコードプロパティが含まれている、してみてください...除いて...チェック(Pythonのエラー処理を参照)に使用することができます。
subprocess.check_output()
親プロセスは完全に子プロセスを待ち
子プロセスの標準出力に出力を返します。
退出情報を確認し、リターンコードが0でない場合は、エラーsubprocess.CalledProcessErrorが含まれ、オブジェクトがリターンコードの属性と出力属性、出力特性の出力を標準出力が含まれて、試すことができます...除いて...チェックします。
これらの三つの機能が類似している使用し、我々は説明するために()subprocess.call:
インポートサブプロセス RC = subprocess.call([ "LS"、 " - L"])
我々は)名前(LS)および(-l)で、引数の表は、(subprocess.callに渡さまとめをプログラムします
あなたは、シェルの文字列全体を通して説明することができます。
importsubprocess アウト = subprocess.call(" LS -l "、シェル= 真) アウト = subprocess.call(" CD .. "、シェル=真)
私たちは、このシェル= Trueのパラメータを使用していました。今回は、テーブルを実行するために、文字列全体ではなく、子プロセスを使用します。Pythonは最初のシェルを実行し、この文字列全体を説明するためのシェルます。
いくつかのシェルコマンドは、組み込みのシェルを介して実行されなければならないコマンド、$ CDシェルであります。シェル= Trueの場合、私たちはこのようなコマンドを実行することができます。