我是 cython 的新手,也許我缺少一些基本資訊,所以請耐心等待。我想要做的是在 python 中創建一個 c 物件,修改它并將物件的指標回傳到 c 函式。基本上我有:
// headers.h
class A {
A();
void modifyA()
}
class B {
B();
void useA(A *a);
}
# headers.pxd
cdef extern from "headers.h":
cdef cppclass A:
void modifyA()
cdef cppclass B:
void useA(A *a)
# PyA.pyx
cdef class PyA:
cdef A *pa
def __cinit__(self):
self.pa = new A()
def modifyA(self):
self.pa.modifyA()
現在,據我所知,當我從 python 代碼實體化 PyA 時,在 C 中創建了一個 A 物件,并且一個指標存盤在新的 PyA 物件中。我想要做的是使用該指標,如:
# PyB.pyx
cdef class PyB:
cdef B *b
def __cinit__(self):
self.b = new B()
def useA(self, pyA: PyA):
self.b.useA(pyA.pa)
但它給了我“無法將 Python 物件轉換為 'A *'”,我不明白為什么......我錯過了什么嗎?
uj5u.com熱心網友回復:
Cython 中的“Cannot convert Python object to 'Something'”錯誤通常意味著 Cython 沒有檢測物件/屬性的型別,因此認為它將是一個 Python 物件,僅在運行時可用。
話雖如此,您必須確保 Cython 理解型別。在您的特定情況下,您可以選擇:
- 有一個
.pyx(合并兩個.pyx檔案),讓 cython 能夠直接確定它pyA.pa的型別是A*. - 宣告“cython 頭檔案”或
.pxd檔案,.h通過宣告物件、函式和類的型別,它的作業方式與C 中的檔案非常相似。
第二種情況如下所示:
# PyA.pxd
cdef class PyA:
cdef A *pa
# PyB.pyx
from PyA cimport PyA # import the PyA class from PyA.pxd definition
cdef class PyB:
# [...]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/342872.html
