Ich versuche, C++ - Klassen zu Python mit Cython zu offenbaren. Ich schrieb ihre Definitionen in * .pxd-Datei und implementierte einen Wrapper in * .pyx-Dateien. Aber ich blieb stecken und versuchte, einen Funktionszeiger an den Erweiterungstyp zu übergeben. Hier ist ein vereinfachtes Beispiel.Python-Objekt in Cython-Zeiger konvertieren
foo.pyx
from c_foo cimport cFoo
cdef class Foo:
cdef cFoo* _impl
c_foo_holder.pxd
cdef extern from "FooHolder.h":
cdef cppclass cFooHolder:
cFooHolder(cFoo* foo)
foo_holder.pyx
from c_foo_holder cimport cFooHolder
from c_foo cimport cFoo
cdef class FooHolder:
cdef cFooHolder* _impl
def __init__(self, foo):
self._impl = new cFooHolder(<cFoo*>(foo._impl)) # error here
Aber auf der l ast line Ich bekomme den Fehler "Python-Objekte können nicht in Zeiger primitiver Typen umgewandelt werden". Ich habe versucht, auch einige andere Ansätze, aber nichts funktionierte:
# error: 'Foo' is not a type identifier
from foo import Foo
def __init__(self, Foo foo):
self._impl = new cFooHolder(foo._impl)
# error: 'Foo' is not a type identifier
def __init__(self, foo):
self._impl = new cFooHolder(<Foo>(foo)._impl)
scheint, dass ich nicht tun kann, dass entweder während foo ein Python-Objekt ist. Fehle ich etwas? Ich kann 'Python-Objekt-Argument nicht in Typ' cFoo * 'konvertieren, wenn ich Funktion mit' def 'definiere, und ich kann es nicht von Python aus aufrufen, wenn ich es mit' cdef 'definiere. – DikobrAz
@DikobrAz Hmm scheint, dass Sie cdef Methoden nicht außerhalb einer Klasse aufrufen können, versuchen Sie, Klassenmitglieder über eine globale Funktion anstelle einer 'Init()' Methode zu setzen, siehe dieses Beispiel: http://stackoverflow.com/a/ 12205374/623622 –
Kein Glück.Soweit ich weiß, kann ich cdef-Member nicht von Python aus aufrufen, sie sind nur im Cython-Modul zugänglich. Und ich kann nicht (weiß nicht wie) Python-Objekt in Cython-Zeiger konvertieren, so dass das eigentlich das Problem ist. – DikobrAz