C++クラスにCythonクラスを埋め込みしようとしています。このC++クラス用のCythonラッパーを作成することは、プロジェクトの制約を受けては不可能です。また、Cythonクラスのメソッドの数やCythonクラスの長い継承のため、クラスからメソッドを完全に削除することは魅力的なソリューションではありません。 Cythonクラスのインスタンスを作成し、そのメソッドをC++から呼び出す必要があります。しかし、私はsegfaultではないように思えます。ここでは、問題の例である:C++でのCythonクラスメソッドの埋め込み
< < <ファイル:fooClass.pyx >>>
from math import sin
cdef public class Foo[object Foo, type fooType]:
cdef double a,b
def __cinit__(self, double a, double b):
self.a = a
self.b = b
cdef double bar(self, double c):
return sin(self.a*c)
cdef api double foobar(Foo foo, double d):
return foo.bar(d)
< < <ファイル:Foo.cpp >>>
#include "fooClass_api.h"
#include <iostream>
int main(){
Py_Initialize();
import_fooClass();
Foo foo;
foo.a = 1.0;
foo.b = 10.0;
std::cout << foobar(&foo,5.0) << "\n";
Py_Finalize();
}
< < <ファイル:setup.py >>>
from distutils.core import setup
from Cython.Build import cythonize
setup (ext_modules = cythonize ("cyClass.pyx"))
python setup.py build_ext --inplace
でビルドし、g ++でコンパイルします。テストを通して私はPy_Initialize()
とimport_fooClass
が成功していることを知っています。そして、私はfoo.a
とfoo.b
の値をfoobar()
の中に印刷していますが、の中にFoo
オブジェクトを使って電話をすると、プログラムはsegfaultsになります。 foo.__dict__
またはfoo.callable()
への呼び出しでさえ、foobar()
の中にセグメンテーションが発生します。 public
またはapi
キーワードを変更しても、__init__
と__cinit__
の間で切り替わることはありませんでした。誰かがこれを修正する方法を知っていれば、私は非常に感謝するだろう。私はそれがポインターやPythonのC APIを悪用する何かを持っていると思われる。本当にありがとう!
あなたは 'Foo'を初期化されていないため、一部ではそれはだ - それは' vtab と呼ばれるポインタを持っています'は決して設定されません(例えば、" FooClass.h "参照)。 'Foo'を返すcapi関数が必要だと思います。しかし、それはまだ私のセグメンテーション違反を取り除くことはできません。私はすぐにそれを修正するために必要なものを見ることができません... –
DavidW