22

ドキュメント、メーリングリスト、およびこの質問 ここの間に部分的な回答を見つけましたが、私の詳細に対処するより直接的な回答を得たいと思いました...

現在boost::pythonにラップされている、すでに使用しているライブラリの小さな部分を少しずつラップしようとすることで、cythonを学んでいます。私はこのブースト ラッパーに少し貢献し、C++ リファレンスとして使用しています。同時に、 ZeroMQ Python バインディングを cython リファレンスとして使用しています。

私の質問は、プロジェクトの構造についてです。この lib の現在のブースト バージョンは、単一のにコンパイルされ.soます。それが私の目標です。.pyx複数のモジュールを単一の .xml に直接コンパイルできないことがすぐにわかりました.so。次に、ファイル内cppclassのを定義するルートをたどり始め、対応する python が に実装クラスをエクスポートし、コンパイルのためにそれらを単一に含めようとしました。最初はうまくいきましたが、もう少し書くと、さまざまな場所にインクルードがあるため、複数の定義が競合するという問題が発生しました。pxd.pxipyxpxi

次の質問と目標に対処する適切な組織的アプローチを聞きたいです。

  • パブリック クラスに同じ名前を付けます (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 つの場所に集める巨大なラッパーがあるというものです。また、カスタムの例外処理とユーティリティも追加されました。

4

2 に答える 2

22

決定的な答えを待っている間、私は自分のコードを整理して遊んでいました。コンパイルのためにpyxファイルを単一に含めることは、これまでのところ機能しています。pyx

setup.pyは次のように単純です:

ext_modules = [
    Extension(
        "openni", 
        ["src/openni.pyx"], 
        language="c++",
        include_dirs=['src/', '/usr/include/ni'],
        libraries=['OpenNI'],
    )
],

メインopenni.pyxは次のようになります。

include "constants.pyx"
include "exceptions.pyx"
include "context.pyx"
...

libopenni.pxd残りのモジュールに宣言のみの extern を提供する共通点があります。

名前の衝突を避けるために、cppclass宣言にクラス定義とは異なるpxd名前を付けます。pyx

xncontext.pxd

cdef extern from "XnCppWrapper.h" namespace "xn":
    cdef cppclass Context:
           ...

context.pyx:

from libopenni cimport *
from xncontext cimport Context as c_Context 

cdef class Context:
    cdef c_Context *handle   
        ...
于 2012-08-03T22:15:33.307 に答える
0

回答望ましいフォルダ構造はありますか?

はい、Cython.pyx.pxdファイルの好ましいフォルダー構造は、ファイルとまったく同じように扱うことです.py。よく整理されたパッケージ構造で、モジュールごとに 1 つです。ファイルは、キュレートされたシンボルのセットを組み立てて、cimport のためにサブモジュール/パッケージからキュレーションされたシンボルのセットを収集するファイルと__init__.pxd同じように提供できます。__init__.py

確かに、これにより.soモジュールごとに 1 つのファイルが生成されますが、これらのファイルはビルド ディレクトリに隠されています。同じことが Python の構築モジュールにも当てはまります。それらのそれぞれに対応する.soファイルがあります。これは問題ですか?

于 2016-08-24T17:06:18.350 に答える