python

Last-modified: 2010-09-21 (火) 13:47:23

python-fuseの使い方in Vine Linux

パッケージが提供されていないので、手動ビルド

必要なもの

  • python
  • python-devel ないと Makefileがみつからないというエラーが出る。IRAF Tips
  • fuse-pythonのsource
    SourceForge.net fuseからリンクをたどって拾ってくる

手順

  1. tarを解凍
  2. python setup.py build
  3. (念のため)正常に動くかどうかテスト。
    example内にあるxmp.pyをためしてみる。-hオプションでヘルプ表示
    sudo python xmp.py testdirectory
    とかしてマウントされてればOK
  4. sudo python setup.py installでインストール

文字列のあつかい

そうとうややこしいことになっているようだ。3.0以降ではunicodeのみに統一されていて、2.xではバイト列としてのstr-typeとunicodeとしてのunicode-typeが混在している。
以下では、pythonのソースコードとおなじように、u''の形式をunicodeとする。
通常は、

b = '<適当な文字列・任意のコーディング(A)>'
bu = b.decode('コーディングAの名前') [= unicode(b,'coding A')]
bb = bu.encode('任意のコーディング(B)')

というふうに任意のコーディングの間を行ったり来たりでき、処理にはすべてuを使えばいいのだが、これでは要求が満たされない時がたまにある。

unicodeじゃないものがunicodeとして返されるとき

Unix系OS(私の場合はOS X)上のpythonでは、標準でshift-jisをunicode文字列とみなしてエンコード・デコードすることはできない(Windows上ではできる)。しかし、外部モジュールがshift-jisであるはずの文字列を読み込み、それをshift-jisとしてのバイトデータのままでunicode形式で返してきたときどうすればいいだろうか。

1.むりやり変形する

pythonのunicodeをエンコードするcodecのなかに、unicode_internalというものがある。これをつかうことであたえられたunicodeを、それをそのままバイト列に変換した(でもなんか冗長性のある)文字列に直し、さらにunicodeに正しいエンコーディング(この場合shift-jis)を指定してなおすことができる。こうして間違ったunicodeから正しいunicodeを生成する。

>>>a=u'\x96\xf1\x91\xa9\x82\xcc\x82\xa4\x82\xbd'
(shift-jisで「約束のうた」のはず。uを外したうえで、print a.decode('shift-jis')とすればわかる)

>>>aint=a.encode('unicode_internal')
aint='\x96\x00\xf1\x00\x91\x00\xa9\x00\x82\x00\xcc\x00\x82\x00\xa4\x00\x82\x00\xbd\x00'(長いバイト列。\x00が混じっているのでこれを取り除く)

>>>asjis = aint[0::2](スライスをつかい、0から最後まで、2つ飛ばしと指定)
asjis='\x96\xf1\x91\xa9\x82\xcc\x82\xa4\x82\xbd'(やっとこさu記号がはずれた)

>>>au = asjis.decode('shift-jis')
au = u'\u7d04\u675f\u306e\u3046\u305f'。printすると「約束のうた」

2.mbcsを使う

さきほどwindows上ではできる、と書いたが、それはおそらくUnicodeをshift-jisとして認識して変換するcodecであるmbcsが存在するからであろう。そこで、mbcsをソースパッケージから抜いて使えばよいのではないかと考えた。しかし、あるメーリングリストログには、そんなことは馬鹿げてますよ、とかいてある。mbcsはwindowsでいま使われてるエンコーディングで処理しろ、という意味だから。
不安になってwindowsでテストしてみると期待通りの動作はしなかった。私がつかいたい拡張がmakeする形式で配布されているので、これをwinにもっていってテストするのはめんどうくさいからひとまず置いておく。