def
を使って定義されたCythonメソッドのPythonオブジェクト引数をC++型に変換するにはどうすればよいですか?私は、CythonのドキュメントのUsing C++ in Cythonセクションに記述されているように、C++ライブラリ用のCythonラッパークラスを提供しようとしています。PythonオブジェクトをCythonのC++型に変換する方法
ここに私の問題を示す例があります。
ファイルfoo.h
:
namespace ns {
class Foo:
public:
Foo();
dosomething(std::shared_ptr<Bar>);
}
ファイルbar.h
:
namespace ns {
class Bar:
public:
Bar();
}
ファイルfoo.pyx
:
from libcpp.memory cimport shared_ptr
cdef extern from 'bar.h' namespace 'ns':
cdef cppclass Bar:
Bar() except +
cdef extern from 'foo.h' namespace 'ns':
cdef cppclass Foo:
Foo() except +
void dosomething(shared_ptr[Bar])
cdef class PyBar:
cdef Bar* thisptr
def __cinit__(self):
self.thisptr = new Bar()
def __dealloc__(self):
del self.thisptr
cdef class PyFoo:
cdef Foo* thisptr
def __cinit__(self):
self.thisptr = new Foo()
def __dealloc__(self):
del self.thisptr
def dosomething(self, bar):
self.thisptr.dosomething(bar)
ファイルsetup.py
:
from setuptools import Extension
from setuptools import setup
from Cython.Build import cythonize
extensions = [
Extension(
'foo',
sources=[
'foo.pyx',
'foo.cpp',
'bar.cpp',
],
language='c++',
include_dirs=['.'],
extra_compile_args=['-std=c++11'],
),
]
setup(
ext_modules=cythonize(extensions),
)
私はこのコンパイルしようとしたときに発生するエラー:
$ python setup.py build_ext
Compiling foo.pyx because it changed.
[1/1] Cythonizing foo.pyx
Error compiling Cython file:
------------------------------------------------------------
...
def __dealloc__(self):
del self.thisptr
def dosomething(self, bar):
self.thisptr.dosomething(bar)
^
------------------------------------------------------------
foo.pyx:38:33: Cannot convert Python object to 'shared_ptr[Bar]'
私はこのようにしてはいけないと思います:1)owned_bar事業は不要です。それはdosomethingで使用されている間削除されません。 2)dosomethingを呼び出した後、PyBar.thisptrが2倍になりました。一度__dealoc__によってshared_ptrを一回実行しました。 – ead
cpp-interfaceのshared_ptrに問題があります。多分Bar.thisptrはshared_ptr型でなければなりません。[Bar] – ead
@head良い点!私は本能的にバギーだと感じています。編集してください。 – oz1