ドキュメント、メーリングリスト、およびこの質問 ここの間に部分的な回答を見つけましたが、私の詳細に対処するより直接的な回答を得たいと思いました...
現在boost::pythonにラップされている、すでに使用しているライブラリの小さな部分を少しずつラップしようとすることで、cythonを学んでいます。私はこのブースト ラッパーに少し貢献し、C++ リファレンスとして使用しています。同時に、 ZeroMQ Python バインディングを cython リファレンスとして使用しています。
私の質問は、プロジェクトの構造についてです。この lib の現在のブースト バージョンは、単一のにコンパイルされ.so
ます。それが私の目標です。.pyx
複数のモジュールを単一の .xml に直接コンパイルできないことがすぐにわかりました.so
。次に、ファイル内cppclass
のを定義するルートをたどり始め、対応する python が に実装クラスをエクスポートし、コンパイルのためにそれらを単一に含めようとしました。最初はうまくいきましたが、もう少し書くと、さまざまな場所にインクルードがあるため、複数の定義が競合するという問題が発生しました。pxd
.pxi
pyx
pxi
次の質問と目標に対処する適切な組織的アプローチを聞きたいです。
- パブリック クラスに同じ名前を付けます (cppclass に別の名前を付け、インポートされた名前空間を使用して同様の名前を処理する
cppclass
ことで、今これを行っています。ala を使用して cimport を使用して名前の競合を解決します)pyd
.so
コンパイルされた出力として単一(許容可能なアプローチ? )pyx
そのためだけにマルチインクルードアプローチをメインに使用しますpyx
か、それともメインにインクルードpyx
を保持する以外に何かを含める必要がありますか?- Pythonでエクスポートされる定数を一元的に定義する場所は?
- 望ましいフォルダ構造はありますか? 今、私はすべての
src
下の大きなディレクトリにいsetup.py
ます. たくさんのpxi, pxd, pyx
ファイルを見ると混乱します。 - 今は
pxi
完全に不要ですか?そうでない場合、異なるモジュール間の複数の包含を処理するために、cython スタイルの ifndef ガードを使用する必要がありますか? - ZeroMQ python バインディングが複数のモジュールを構築し、
__init__.py
. それは本当にcythonの適切なアプローチですか?
参考までに、私が再ラップするために練習しているプロジェクトはPyOpenNI (openni) です。このブースト プロジェクトのパターンは、共通オブジェクトを 1 か所に集めてから、ソースを使用して 1 対 1 のヘッダー定義を定義し、すべての定義を 1 つの場所に集める巨大なラッパーがあるというものです。また、カスタムの例外処理とユーティリティも追加されました。