18

FooというC++クラスがあります。Cython C ++チュートリアルに従う場合は、Pythonクラスを別の方法で呼び出す必要があります(たとえば、PyFoo)。ただし、PythonクラスFooも呼び出す必要があります。それを効率的に行う方法は?

編集:以前にBoostPythonとインターフェースされていた既存のC++ライブラリとインターフェースしようとしています。さまざまな理由で、代わりにCythonをテストしたいと思います。Boost:PythonではPythonクラスはC ++と同じ名前で呼び出されたので、この命名規則を続けたいと思います。クラスを別の方法で呼び出すことはPython(CPython)の要件ではありませんが、少なくともチュートリアルではCythonによって課されているようです。

もちろん、純粋なPythonモジュールを使用して、PyFooを呼び出すFooクラスを定義することもできますが、これは退屈で非効率的なようです。

4

2 に答える 2

24

これを処理する方法は2つあります。

  1. 別の名前でC++クラスを宣言します。元の名前は二重引用符で囲む必要があります。

    cdef extern from "defs.h" namespace "myns":
        cdef cppclass CMyClass "myns::MyClass":
            ...
    

    次にMyClass、Pythonクラスに使用して、C++宣言をとして参照できますCMyClass

    元の名前には名前空間を明示的に含める必要があることに注意してください(名前空間が指定されている場合)。Cythonテンプレート引数(存在する場合)は、別名宣言の後に配置する必要があります。

  2. C ++クラスを、.pxdファイルとは異なる名前の別のファイルで宣言してから、を.pyx使用してインポートしますcimport

    cpp_defs.pxdの場合:

    cdef extern from "defs.h" namespace "myns":
        cdef cppclass MyClass:
            ...
    

    py_wrapper.pyxの場合:

    cimport cpp_defs as cpp
    
    cdef class MyClass:
        cpp.MyClass *_obj
    
于 2012-04-12T09:50:12.773 に答える
3

これは、ニキータのアプローチを示す完全な例です。

cdef extern from "floorplan_geometry.h" namespace "flyby::localize":
    cdef cppclass CFloorplan "flyby::localize::Floorplan":
        int xmin()

cdef class Floorplan:
    cdef CFloorplan* obj_
    def __cinit__(self):
        self.obj_ = new CFloorplan()
    def __dealloc__(self):
        del self.obj_
    def xmin(self):
        return self.obj_.xmin()
于 2014-06-18T19:48:52.397 に答える