Python subprocess作成子プロセス

4485 ワード

http://hi.baidu.com/1121698324/item/d0d28308d4fe44126c90480f
 
Pythonは複数のサブプロセスを作成するモジュールを提供しています。私はsubprocessモジュールを使用することに慣れています。Pythonマニュアルにはこのような話があります。
This module intens to replace several other、older modules and functions、such as:os.system、os.spawn*、os.popen*、popen 2.*、compands.*
subprocessはいくつかの古いモジュールと関数を置き換えるために使われています。例えば、os.system、os.spawn*、os.popen*、popen 2.*、communds.*。subprocessは推奨されているモジュールであることが分かります。
モジュール選択比較
1.os.system()短所:A.os.system()は新しいshellで働きます。システムのオーバーヘッドが大きいB.出力などの情報を得るのが面倒くさいので、外部コマンドやツールとの対話ができません。コントロールできません。(外部コマンドを呼び出したら、デッドまたは実行時間が長い)メインプロセスはOS.systemを制御できません。until os.system()自分が2.commandを脱退するメリット:A.外部コマンドの出力が得られやすく、もう退出しました。状態の欠点:同os.system()の中のA、C 3.os.popen()commandコマンド4.subprocessとの利点:A.サブプロセスとの相互作用B.同期/非同期方式によるサブプロセスの実行をサポートします。サブプロセス通信D.IOパイプEをカスタマイズできます。新しいshell作業を開始するかどうかを制御できます。
subprocess.Popen
subprocessモジュールには一つのクラスしか定義されていません。Popenを使用してプロセスを作成し、プロセスと複雑なインタラクションを行うことができます。その構造関数は以下の通りです。
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:プロセスの実行可能ファイルおよびパラメータを指定する文字列またはシーケンスタイプであってもよい。シーケンスタイプの場合、最初の要素は通常、実行可能ファイルのパスである。executeableパラメータを用いて実行可能ファイルのパスを明示的に指定することもできます。windowsオペレーティングシステムでは、PopenはCreateProcess()を呼び出してサブプロセスを作成し、CreateProcessは文字列パラメータを受信し、argsがシーケンスタイプであれば、システムはlist 2 cmdline()関数を通じてシーケンスタイプを文字列に変換します。
  • bufsize:バッファを指定します。今まで使ったことがありません。
  • executable:実行可能プログラムを指定します。通常、私たちはargsパラメータによって実行するプログラムを設定します。パラメータshellをTrueに設定すると、executableはプログラム使用のshellを指定します。windowsプラットフォームでは、デフォルトのshellはCOMSPEC環境変数によって指定されます。
  • stdin、stdout、stderはそれぞれプログラムの標準入力、出力、エラーハンドルを表します。彼らはPIPEであってもよく、ファイル記述子またはファイルオブジェクトであっても良いし、Noneに設定しても良いし、親プロセスからの継承を表しています。
  • preexec_fnはUnixプラットフォームの下でのみ有効であり、実行可能なオブジェクトを指定して、サブプロセスが実行される前に呼び出されます。
  • Close_sfs:windowsプラットフォームの下で、もしclose_fdsがTrueに設定されている場合、新規に作成されたサブプロセスは、親プロセスの入力、出力、エラーパイプを引き継ぎません。私たちはcloseを使うことができません。fdsはTrueに設定し、同時にサブプロセスの標準入力、出力とエラーをリダイレクトします。
  • shellはtrueとして設定され、プログラムはshellで実行されます。
  • cwdは、サブルーチンの現在のディレクトリを設定するために使用される。
  • envは、サブプロセスを指定するための辞書タイプの環境変数です。env=Noneの場合、子プロセスの環境変数は親プロセスから継承されます。
  • Universal_newlines:オペレーティングシステムによってテキストの改行が異なります。windowsの下で'/r/n'を使って変えますが、Linuxの下で'/n'を使います。このパラメータをTrueに設定すると、Pythonはこれらの改行を'/n'としてまとめて処理します。
  • startuplinfoとcreateion flagsはwindowsでのみ使用され、それらは下の層のCreateProcess関数に伝達され、サブプロセスのいくつかの属性を設定します。例えば、メインウィンドウの外観、プロセスの優先度などです。
  • subprocess.PIPE
    Popenオブジェクトを作成するとき、subprocess.PIPEはstdin、stdoutまたはstderパラメータを初期化することができる。サブプロセスと通信する標準的な流れを表します。
    subprocess.STDOUT
    Popenオブジェクトを作成する場合は、stderパラメータを初期化し、エラーを標準出力ストリームで出力することを示します。
    Popenの方法
    1.Popen.poll():サブプロセスが終了したかどうかを確認するために使用します。リセットコードの属性を設定して返します。
    2.Popen.wait():サブプロセスの終了を待つ。リセットコードの属性を設定して返します。
    3.Popen.co mmunicate(input=None):サブプロセスと対話する。stdinにデータを送るか、stdoutとstderからデータを読み出す。オプションのパラメータinputは、サブプロセスに送信するパラメータを指定します。Communicate()は元のグループに戻ります。なお、プロセスのstdinを介してデータを送信したい場合、Popenオブジェクトを作成する際には、パラメータstdinはPIPEに設定されなければならない。同様に、stdoutおよびstderからデータを取得するためには、stdoutおよびstderをPIPEに設定しなければならない。
    4.Popen.send_signal:サブプロセスに信号を送信します。
    5.Popen.terminate():サブプロセスを停止します。windowsプラットフォームの下で、この方法はWindows API Terminate Process()を呼び出してサブルーチンを終了します。
    6.Popen.kill():子プロセスを殺す。
    7.Popen.stdin:Popenオブジェクトを作成する場合、パラメータstdinはPIPEに設定され、Popen.stdinはサブプロセス送信命令のためのファイルオブジェクトに戻ります。さもなければNoneに戻ります
    8.Popen.stdout:Popenオブジェクトを作成する場合、パラメータstdoutはPIPEに設定され、Popen.stdoutはサブプロセス送信命令のためのファイルオブジェクトに戻ります。さもなければNoneに戻ります
    9.Popen.stder:Popenオブジェクトを作成する場合、パラメータstdoutはPIPEに設定され、Popen.stdoutはサブプロセス送信命令のためのファイルオブジェクトに戻ります。さもなければNoneに戻ります
    10.Popen.pid:サブプロセスのプロセスIDを取得します。
    11.Popen.returncode:プロセスの戻り値を取得します。プロセスがまだ終わっていないなら、Noneに戻ります。
    12 subprocess.call(*popenargs、****kwargs):コマンドを実行します。この関数は、サブプロセスの実行が終了するまで待機し、プロセスのreturncodeに戻ります。文章の最初の例では、call関数を実証しました。サブプロセスが相互作用を必要としないなら、この関数を使って作成できます。
    13.subprocess.check_call(*popenargs、****kwargs):subprocess.call機能と同じですが、子プロセスが戻ってくるreturncodeが0でないと、Called Process Error異常をトリガします。例外オブジェクトには、プロセスのreturncode情報が含まれます。