木曜日, 10月 14, 2010

仕事で書いたPythonコードがMacPortsでインストールしたバイナリで動くようにしてみた

仕事で書いたPythonコードをMacで動かす事を考えた理由は2つ。一つはコードのポータビリティを確保したい事。もう一つは、仕事のコード書きに使っているUbuntuをインストールした私物のノートPCを持ち歩かずに自宅でコード書きを続けたい、という欲求を満たすためです。

とりあえずそのまま起動してみましたが、残念ながら動きません。このコードはとあるフォーマットで作成されたバイナリファイルを読み込み、解析して表示するプログラムです。そのデータを読み込むのに一部scipy.io.numpyio.fread()を使用している(こちらを参考に)のですが、何故かMacPortsでインストールしたSciPyにはnumpyioがありません。インストールに失敗しているのかインストーラにバグがあるのか、暫く悩んでいたのですが、そもそもないように思われます。一瞬「これは困った」と考えましたが、考えてみますとscipy.io.numpyio.fread()はscipy.io.fromfile()で完全に代替可能です。何の問題もありません。

さらにプログラムが動かない理由を突き止めるべく、読み込んだデータの一部をそのまま覗いてみると、期待通りの数値になっていません。データを読み込む際にscipy.io.fromfile()のdtypeを指定する事で型指定しますが、符号付き整数を読み込む際に'l'を指定しておりました。よく考えますと、この整数型の精度はシステム依存です。32bit Linuxで正常に動いていても64bit Snow Leopardで正常に動く訳がありません。ここの整数型指定はnumpy.int32とすべきです。あと念のために'H'をnumpy.ushortに変更しておきます。これでデータを正常に読み込む事ができ、一つの問題を残して使用に問題ない形で正常な動作を得る事ができました。

一つの問題とは何かですが、先のエントリで示しましたPyQt4にmatplotlibのグラフを埋め込んで表示するコードをMacPortsバイナリで実行してみますと、確かにmatplotlibのグラフがPyQt4のウィンドウに埋め込まれた形で表示されますが、それと同時に全く同じグラフが独立したウィンドウで表示されてしまいます。Ubuntuで動かした場合は期待通りに動作し、複数のウィンドウが開かれる事はありません。恐らくは、mpl.show()がPyQt4バックエンドとしてのmatplotlib.pyplot.showIOと同義な動作をしているのではないかと推察します。残念ながらこの問題の解決方法は判りません。

0 件のコメント: