popen 諸々

プロンプトから実行したコマンドの出力を受け取る popen という仕組みがある。
動作的にはコマンドをパイプした結果を受け取っていると考えればよい。

参考
http://www.python.jp/doc/2.4/lib/module-popen2.html

何故か popen2 モジュールと os モジュールの2箇所に分かれており、
微妙に引数・戻り値の順序が違ったりする。

  • popen2 モジュール
    • popen2
    • popen3
    • popen4
    • (class) Popen3
    • (class) Popen4
  • os モジュール
    • popen2
    • popen3
    • popen4

popen2, popen3, popen4

popen2/3/4 はそれぞれ取得できる実行結果によって異なる。

popen2
標準出力、標準入力
popen3
標準出力、標準入力、標準エラー出力
poepn4
(標準出力+標準エラー出力)、標準入力

以下に記述例を示す。

popen2 モジュール版

import popen2;

stdout, stdin = popen2.popen2( cmd [, bufsize [, mode ] ] );

stdout, stdin, stderr = popen2.popen3( cmd [, bufsize [, mode ] ] );

stdout_err, stdin = popen2.popen4( cmd [, bufsize [, mode ] ] );

os モジュール版

import os;

stdin, stdout = popen2.popen2( cmd [, mode [, bufsize ] ] );

stdin, stdout, stderr = popen2.popen3( cmd [, mode [, bufsize ] ] );

stdin, stdout_err = popen2.popen4( cmd [, mode [, bufsize ] ] );

引数

italic;">cmd:実行するコマンド。文字列で指定。
italic;">mode:データタイプ(バイナリ or テキスト)の指定。'b'、もしくは't'で指定。主に Windows で使用する場合に気にすること。
italic;">bufsize:子プロセスに対する入出力のバッファサイズ

戻り値

stdout
標準出力
stdin
標準入力
stderr
標準エラー出力
stdout_err
標準出力 + 標準エラー出力
popen2 モジュールと os モジュールでの違い

引数は「バッファサイズ」と「モード」の指定順序、戻り値は「標準入力」の指定位置が異なる。

  • popen2 モジュール
    • 引数の順序 : コマンド - バッファサイズ - モード
    • 戻り値の順序 : 標準出力 - 標準入力 - 標準エラー出力
  • os モジュール
    • 引数の順序 : コマンド - モード - バッファサイズ
    • 戻り値の順序 : 標準入力 - 標準入力 - 標準エラー出力

Popen クラス

popen2 モジュールには Popen3, Popen4 の2つのクラスがある。
通常の関数(popen2/3/4)との違いはコマンドの戻り値(実行結果)を受け取れるコマンドがあることにある。
通常の関数ではコマンド実行の成否判定は難しい為、
コマンド実行結果の成否をスクリプトの判定に使う場合は、Popen クラスを使った方が記述がシンプルになる。

コンストラク

Popen3

import popen2;

instance = popen2.Popen3( cmd [, capturestderr [, bufsize ] ] );

italic;">cmd:実行するコマンド。文字列で指定。
italic;">capturestderr:生成した子プロセスのエラー出力を受け取るかどうかの真偽値。デフォルト値は False 。
italic;">bufsize:子プロセスに対する入出力のバッファサイズ


Popen4

import popen2;

instance = popen2.Popen4( cmd [, bufsize ] );

引数については Popen3と同様。

メソッド

poll

ret = popen_inst.poll()

引数
(なし)
戻り値
子プロセスが実行中であれば -1 を終了していれば 0 を返す。


wait

ret = popen_inst.wait()

引数
(なし)
戻り値
コマンド実行結果*1を返す。値については os モジュールに記述されている。
属性
fromchild
子プロセスからの出力。ファイルオブジェクト。
tochild
子プロセスに対する入力。ファイルオブジェクト。
childerr
Popen3の引数 capturestderr が True ならばエラー出力が記録される。Popen4 ならば常に None。ファイルオブジェクト
pid
子プロセスのプロセスID

*1:正常終了、もしくは exit で終了やシグナルで終了