* to Python object"-6ren"> * to Python object"-当我对以下 Cython 模块进行 cython 化处理时 %%cython cdef double *ptr=[1,2,3] print(ptr) 我收到以下错误消息: Cannot convert-6ren">
gpt4 book ai didi

python - Cython 中的错误消息 "Cannot convert * to Python object"

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:09 24 4
gpt4 key购买 nike

当我对以下 Cython 模块进行 cython 化处理时

%%cython
cdef double *ptr=[1,2,3]
print(ptr)

我收到以下错误消息:

Cannot convert 'double *' to Python object

但是,下面的 Cython 模块:

%%cython
cdef double val=0.0
print(val)

cythonized 没有问题。

对于任何其他指针类型(即 int *float * 等)也会出现此问题。

最佳答案

print 是一个纯 Python 函数,为了能够调用它,参数必须是 Python 对象。

显然,第一个 Cython 模块中的 ptr 和第二个模块中的 val 都不是 python 对象。然而,有一个区别:double 类型的 cdef 变量可以由 Cython 通过 PyFloat_FromDouble 自动转换为 Python-Float。 - 这正是幕后发生的事情:Cython 从 val 创建一个临时的 Python-Float,将其传递给 print 并随后销毁它。

还有其他类型可以自动转换为 Python 对象:doublefloatint 以及类似的类型,还有 std::vector and other c++-containers .

但是,对于原始 C 指针(char *Py_UNICODE* 和它们的不同转世是一个异常(exception),没有这样的自动转换 - 请参阅稍后的示例) - 因为一开始就不可能这样做,因为 Cython 不知道指针指向的数组的长度(它根本就是一个数组吗?)。

在这种情况下唯一的解决方案:必须手动将内存的内容转换为 python 列表(或它对应的任何 python 类型),这里以函数 convert_to_python 为例:

%%cython 
cdef convert_to_python(double *ptr, int n):
cdef int i
lst=[]
for i in range(n):
lst.append(ptr[i])
return lst

cdef double *ptr=[1,2,3]
print(convert_to_python(ptr,3))

最值得注意的是,convert_to_python 获取元素的数量作为参数——缺少 Cython 的信息。

顺便说一句:Cython 会自动将已知长度的 C 数组转换为 Python 对象,例如:

%%cython 
cdef double arr[3] # length (=3) known to Cython
arr[:]=[1,2,3]
print(arr)

编译没有问题。


char *signed char *unsigned char *Py_UNICODE * 及其常量-变体是“特殊的”,因为它们可以 be automatically convertedbytes-object (char *) 或 unicode-object (Py_UNICODE *),假设它是一个以 null 结尾的 C 字符串(即字符 \0 标记结束)。因此,可以编写类似于

cdef char a[3] 
a = [90,0,90] # ord('Z') = 90
print(a) # char[3] decays to char *
# b"Z"

如您所见,结果不是 b"Z\x00Z",因为字符串在第一个 `\0' 处被自动截断。为确保将整个字符串转换为字节对象,必须指定长度:

print(a[:3]) 
# b"Z\x00Z"

但是,如果字符数组中没有 \0,就会出现问题,这可能会导致段错误(读取越界)。

关于python - Cython 中的错误消息 "Cannot convert <type_name>* to Python object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53763480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com