機種依存文字
python のエラーコードでは
UnicodeError: Shift_JIS decoding error: invalid character 0x8755
となっている。
回避方法についてあーだらこーだら考えたり検索してみたのだが、結局指定文字コードを変えれば良い模様。
というわけで対応文字コードを「Shift JIS (sjis)」から「Microsoft コードページ 932 (cp932)」に変更。
これで上手く動くようになった。
つーか、ファイル文字コード Shift JIS で機種依存文字使うなよ。
諸般の事情により変更は出来ないので、しょうがないが・・・。
- 参考ページ
- http://d.hatena.ne.jp/itasuke/20061228#p1
- Microsoft コードページ 932 (Wikipedia)
- http://ja.wikipedia.org/wiki/Windows-31J
*1:具体的には「ローマ数字の2」
popen 諸々
プロンプトから実行したコマンドの出力を受け取る popen という仕組みがある。
動作的にはコマンドをパイプした結果を受け取っていると考えればよい。
何故か popen2 モジュールと os モジュールの2箇所に分かれており、
微妙に引数・戻り値の順序が違ったりする。
- popen2 モジュール
- popen2
- popen3
- popen4
- (class) Popen3
- (class) Popen4
- os モジュール
- popen2
- popen3
- popen4
popen2, popen3, popen4
popen2/3/4 はそれぞれ取得できる実行結果によって異なる。
以下に記述例を示す。
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:子プロセスに対する入出力のバッファサイズ
戻り値
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 で終了やシグナルで終了
Template
Python の version 2.4 から Template という仕組みが追加されている(stringモジュール内)。
Template とは以前からある %*1 による置き換えではなく、
辞書型(dict)のキー、もしくは辞書に類似した仕組みを要素として使った置き換えをする仕組みである。
substitute と safe_substitute
Template クラスでは substitute と safe_substitute という2つのメソッドを持つ。
Template_Instance.substitute( dictionary )
Template_Instance.safe_substitute( dictionary )
2つのメソッドの違いはプレースホルダを置き換えられなかった場合の動作の違いです。
- substitute の場合、ValueError の例外を raise します。
- safe_substitute の場合、プレースホルダ名がそのまま使用します。
サンプルコード
#!/usr/bin/env python # coding: utf-8 import string; tmp = string.Template( "I'm ${name}. I'm from ${country}." ); print tmp.substitute( { 'name': 'NelNal', 'country': 'Tokyo' } ); print tmp.substitute( { 'name': 'Chan', 'country': 'China' } ); print tmp.substitute( name='Tom', country='America' );
文字列から文字を除去
rstrip
rstrip は文字列右から指定文字を除去するメソッド。
string.rstrip( [ chars ] )
- italic;">chars:除去したい文字の集合。文字列型で指定すること。
引数を指定しない場合は
が除去する文字として扱われる。
lstrip
lstrip は文字列左から指定文字を除去するメソッド。
string.lstrip( [ chars ] )
引数の使い方は rstrip と同様。
引数が省略された場合は空白文字が除去される。
strip
strip は文字列左右から指定文字を除去するメソッド。
string.strip( [ chars ] )
引数の使い方は rstrip, lstrip と同じ。
引数が省略された場合は空白文字が除去される。
dedent
dedent はインデントを除去するメソッド。
textwrap モジュールに含まれる。
import textwrap
ret = textwrap.dedent( string )
- italic;">string:インデントを除去したい文字列
- italic;">(return):インデントを除去した文字列
サンプルコード
三重引用符のインデントを除去
#!/usr/bin/env python # coding: utf-8 import textwrap def test(): str = """\ Hello, world!"""; print str; print "-" * 8; print textwrap.dedent( str ); if __name__ == '__main__': test();
簡単にモジュールの有無をチェック
- c オプションを使って簡単なプログラムを走らせることができる。
それの転用
モジュールが存在する時
$ python -c "import sys"
$
何もメッセージが出なければ問題なし。
逆にメッセージが出るようだとモジュールはインストールされてません。
さっさと Cheese Shop 等に行ってインストールしましょう。
モジュールが存在しない時
$ python -c "import tekito"
Traceback (most recent call last):
File "", line 1, in ?
ImportError: No module named tekito
$