モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

Python+SWIGでがんばってみた for mypaint (備忘録的)

MyPaintに塗りつぶし拡大ルーチンを設置すべく、Python+SWIGで頑張ってみますた!(`・ω・´)

結果は… 何とか動くようになった!?!?

それで悩んだところを備忘録的に書いておこうと思います。

手こずったところ

まずPyDict_SetItem()。これがキツかった。

こいつのせいで何度セグフォを連発したことか… 原因は、既に存在するアイテムにはPy_INCREFしないという点です。(よくよく考えると当たり前か)

このせいでPy_DECREFを余計にしてしまい開放されてセグフォになってしまいました。

あとなんだろう…何か、手こずった所があったはずなのだけど…PyDictの扱いがインパクト強すぎてすっかり忘れてしまいましたな(^^;

あ、そうそう!PyDict_GetItem()でアイテムが辞書内に存在しない場合、これまた当然ですがCのNULLを返してくるわけですが、何故かPy_Noneを返してくるはずだと思い込んでいてそこでしばらく詰まってましたな〜

デバッグ

デバッグは、gdb pythongdbを起動して break hogefuncで前もって設置、そして run test.pyみたいにするとできます。 cgdbを使うとソースレベル感が増して実に心地よかったですね。まぁこんなんで十分でしょう、別に統合開発環境はいらない…

まとめ

  • ドキュメント少なし
  • でもなんとかなる
  • 慣れればどうということはない

しかしこれでC言語の中からPythonオブジェクトに(比較的)自由自在にアクセスできるようになってきました。 こうなるとPythonの弱点だった実行速度もあんまり関係ない感じになってきますね。

そのうち、ゲームを作りたいところ(´・ω・`) 昔作ってきたところでは作り方も悪かったのでしょう、遅すぎてビックリしました(特に配列周り) 測ってみたらnumpyでもなんでも遅くて、普通のリストが一番早かったという… Cの中に配列を置いて管理させれば良いんじゃないかと妄想中です。てか、javascriptでブラウザゲーのほうがいいか。