私はPythonとCythonでC++で書かれたlibの機能を拡張しようとしています。私は自分のライブラリに必須のC++でクラスMyClassを持っています。そして私はPythonのラッパークラスPyMyClassをたくさん使っています。だから私は関数を(PyMyClassを引数として)C++から使いたいと思っています。どのように私はこれを達成することができますか?組み込み型ではなくC++からCythonを呼び出す
私はそれをこのようなものを想像:
cdef public my_func(MyClass class):
*cast MyClass to PyMyClass*
other_py_func(PyMyClass)
myclass.h
namespace classes {
class MyClass
{
public:
explicit MyClass(int x, int y);
int sum();
private:
int a;
int b;
};
}
myclass.cpp
MyClass::MyClass(int x, int y)
{
a = x;
b = y;
}
MyClass::sum()
{
return a + b
}
pymyclass.pyx
cdef extern from "myclass.h" namespace "classes":
cdef cppclass MyClass:
MyClass(int x, int y) except +
int sum()
cdef public my_func(MyClass var):
print "It is python"
を
CDEFクラスPyMyClass(オブジェクト): CDEFのMyClassの* c_class
def __cinit__(self, int x, int y):
self.c_class = new MyClass(x,y)
def __dealoc__(self):
del self.c_class.sum()
def sum(self):
return self.c_class.sum()
私は私がMyClassのにget_x()、get_y()とset_x(int型)、set_y(int)を追加し、ちょうどすべてコピーすることができますことを理解MyClassからPyMyClassまでのフィールド。しかし、PyMyClassは既にMyClassへのポインタを持っています。 MyClassインスタンスのアドレスをPyMyClassフィールドに割り当てることは可能ですか?私はこのような何か意味:Cython拡張を作成するには pyclass = PyMyClass(クラス) other_py_func(pyclass)
あなたがしようとしていることは明確ではありません。 _それを入れるだけですか?_何を入れていますか?どこ?あなたはPythonからPyMyClassを呼び出そうとしていますか?それはどのように呼び出されますか?代わりにC++からCythonでPyMyClassをビルドすることを呼びかけていますか? – danny
@danny、編集した質問があります。今より具体的になってほしい – Zhu
これは参考になるかもしれません:https://stackoverflow.com/questions/33677231/how-to-expose-a-function-returning-ac-object-to-python-without-copying-the-ob/33679481#33679481 – DavidW