Hatena::Grouppython

nelnal@python

2007-11-29

[] popenモジュール 10:34  popenモジュール - nelnal@python を含むブックマーク はてなブックマーク -  popenモジュール - nelnal@python

プロンプトから実行したコマンドの出力を受け取る popen という仕組みがある。

動作的にはコマンドをパイプした結果を受け取っていると考えればよい。

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

何故か popen2 モジュールos モジュールの2箇所に分かれており、

微妙に引数戻り値の順序が違ったりする。


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 ] ] );

引数

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

戻り値

stdout
標準出力
stdin
標準入力
stderr
標準エラー出力
stdout_err
標準出力 + 標準エラー出力

popen2 モジュールos モジュールでの違い

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


Popen クラス

popen2 モジュールには Popen3, Popen4 の2つのクラスがある。

通常の関数(popen2/3/4)との違いはコマンドの戻り値(実行結果)を受け取れるコマンドがあることにある。

通常の関数ではコマンド実行の成否判定は難しい為、

コマンド実行結果の成否をスクリプトの判定に使う場合は、Popen クラスを使った方が記述がシンプルになる。


コンストラクタ

Popen3

import popen2;

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

cmd
実行するコマンド。文字列で指定。
capturestderr
生成した子プロセスのエラー出力を受け取るかどうかの真偽値。デフォルト値は False 。
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 で終了やシグナルで終了

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20071129

2007-11-13

[] コマンドラインオプションの処理をする : getopt 23:37  コマンドラインオプションの処理をする : getopt - nelnal@python を含むブックマーク はてなブックマーク -  コマンドラインオプションの処理をする : getopt - nelnal@python

getopt はコマンドラインオプションのパーザのモジュールである。

参照
http://www.python.jp/doc/2.4/lib/module-getopt.html

記述の方法

o, a = getopt( args, options [, long_options ] )


引数

引数説明
argsコマンドライン引数。通常 sys.arg[ 1: ] を渡す。
optionsコマンドライン(ショート)オプションを示す文字列。
long_options(オプション項目) コマンドラインロングオプションの識別用のリスト。

オプションの書き方
optionsに入れる引数データの処理
"abc"オプション -a, -b, -c を取得する。
"mn:"オプション -m, -n を取得する。オプション -n は引数を取る。

戻り値

2値のタプルが戻ります。

1つ目の要素は 「「「オプションオプション引数」のタプル」のリスト」

2つ目の要素は オプション、及びオプション引数を取り去った後の引数のリスト」


例外

オプションの解析に失敗した場合は GetoptError の例外が発生します。

属性として msg と opt を持ちます。


例外パターン

サンプルコード

getopt_sample.py

#!/usr/bin/env python
# coding : utf-8

import sys, getopt;

try:
    options, args = getopt.getopt( sys.argv[ 1: ], "abc:" );

    opt_dict = dict( options );

    for key in opt_dict.keys():
        if key == "-a":
            print "Hello, world!";
        elif key == "-b":
            print "Good bye!!";
        if key == "-c" :
            print opt_dict[ "-c" ];

    print "< end of program >";
except getopt.GetoptError, ge:
    print ge.msg, ge.opt;

動作テスト

$ python getoptsample.py

$ python getoptsample.py -a

$ python getoptsample.py -ab

$ python getoptsample.py -a -c

$ python getoptsample.py -b -c 11

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20071113