rawtypes 作ってみる

cython から pybind11 に乗り換えを試みたのだが、 一歩目で躓いた。

不完全型のポインタをそのまま返す方法がわからん。

ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL);

ImGuiContext は前方宣言なのです。

自分でやろうと思った。 ctypes と併用することを前提にした省機能のバインダー、名付けて rawtypes を作ってみよう。 c++ の関数呼び出しのちょっとしたコード生成をする。 基本的に ctypes.c_void_p で済ます。 型の宣言が必要なところは、 ctypes.Structure により python 側で宣言。 c++ から返す時には、キャストする。

return ctypes.cast(p, ctypes.POINTER(CTYPES_TYPE))[0]

object の所有権 はまじめに探求しない。

  • python で作って、python で開放する(cypte.Struct object)
  • c++ で作ったのを cast して python に渡すが参照のみ(cast された ctypes.Struct)。無効なものにアクセスしないようにプログラマがー注意する
  • それ以外は値渡し

これで十分。 主要な狙いは、

  • static library のリンク
  • c++ 関数の呼び出し
  • 構造体の値渡しを c++ でラップする

で、 ctypes の苦手なところだけをやる。 luajit ffi に倣ったスタイルでまいる。

動いた

GitHub - ousttrue/pydear
Contribute to ousttrue/pydear development by creating an account on GitHub.
GitHub - ousttrue/pydear favicon https://github.com/ousttrue/pydear
GitHub - ousttrue/pydear

ImGui ひととおりできた。 もうちっとパッケージング(sdist, wheel)を整理したら形が整う。 github actionwheel をビルドする技もできた(windows-64bit + python-3.10 のみ実験)。

strbytes の切りわけも C-API で書けたし、慣れれば直接 C-API を使った方が便利そう。 Py_INCREF Py_DECREF による参照管理と、PyErr_Clear 等のエラーハンドリングなど を抑えればよさそう。

pypi

pydear
Dear imgui binding
pydear favicon https://pypi.org/project/pydear/
pydear

github actions で wheel をビルドして、 pypi にアップロードするところまでできた。 あと、 sdist も作る。

pip install pydear して使えるようになった。 使いながら整備していこう。

pyi が含まれているので、ある程度のインテリセンスが効くところがよい。

  • rawtypes をライブラリとして分離する
  • clang.cindex でコード生成した結果を sdist に含める