Qtブログ(日本語)

Qt for Python: 舞台裏

作成者: 鈴木 佑|Sep 22, 2018 7:36:46 AM

この記事は The Qt BlogQt for Python: under the hood を翻訳したものです。
執筆: Cristián, 2018年05月24日

本日は、「Qt for Python バインディング」の生成プロセスについて紹介したいと思います。

以下の図は The Qt CompanyPySide2 モジュールを提供する際の一般的なプロセスを示しています。

PySide プロジェクトが 2009 年に立ち上がった際に当時のチームは Qt の C++ のヘッダファイルから Python のバインディングを生成するのに外部のツールを使用することを決断しました。

すべての Qt の C++ の機能に対応できるという条件は当然として、最終的なパッケージの大きさに強い感心がありました。

以前のものはテンプレートを多用していたため、別のものが必要になりました。

いくつかの選択肢を検討した結果、そのチームは自分たちで Shiboken と呼ばれるジェネレーターを書くことにしました。

Shiboken は(QtScriptGenerator という昔のプロジェクトを元に作られた)ApiExtractor というライブラリを使用し、Clang を用いて Qt のヘッダファイルをパースして Qt のクラスの情報を取得します。

このステップは Qt に依存はしていないため、他の C++ のプロジェクトでも利用可能です。

さらに、Shiboken が持っている(XML 形式の) Typesystem を利用して、取得した情報を適切な表現に修正し、C++ のクラスを Python の世界で扱えるようにします。

この Typesystem ではクラスへのメソッドの追加や削除が可能で、各関数の引数の変更もできます。これは C++ と Python で競合が起こった際にデータ構造や型を適切に扱うために必要となる機能です。

この処理のアウトプットは CPython で書かれたラッパーのセットになり、これは簡単にコンパイルが可能で、それが最終的にみなさんのもとに PySide2 と呼ばれる Python のモジュールとして提供されています。

ApiExtractor と Shiboken の公式のドキュメントは Qt for Python のドキュメントに含む予定で、それを参考にしていただくことにより、Qt for Python 自体の開発に参加することも可能です。Shiboken の動作の詳細については別途記事を書く予定ですのでお楽しみに!