存储临时 Python 引用 Cython 的不安全 C 导数
Storing unsafe C derivative of temporary Python reference Cython
虽然我已经问了几个类似的问题,但我无法解决如何解决。
基本上我有这个功能:
模块 one.pyx:
cdef char *isInData(data, dataLength):
cdef char *ret = <char *>malloc(200)
memset(ret, 0x00, 200)
if (b"Hello" in data and b"World" in data):
strcat(ret, b"Hello World!")
return ret
模块 two.pyx:
import one
from libc.stdlib cimport malloc,realloc, free
cdef char *tempo():
cdef char *str
str = one.isInData(b"Hello what is up World", 23)
# do some stuff
free(str)
问题发生在行 str = one.isInData("Hello what is up World", 23)
上,我假设一旦 isInData->ret
被分配给 str
。 isInData->ret
被删除导致此问题。但是有人帮我解决这个问题吗?
import one
此行执行 Python 导入 one
。它不知道 one
中定义的任何 cdef
函数(甚至 one
是一个 Cython 模块...)。因此,它假定 isInData
是一个可以查找的 Python 对象,并且它将是一个可调用对象,返回另一个 Python 对象。
cdf char* str = some_python_function()
是不安全的,因为 str
指向 Python 对象。但是 Python 对象只是一个临时对象,很可能几乎立即被释放。
你的意思是:
cimport one
它告诉 Cython 它是您要导入的 Cython 模块,它应该期望在 compile-time 处找到声明。您可能需要写 a pxd file 来给出声明。
我没有详细查看您的其余代码,所以不知道您是否正确处理了 C 字符串。但总的来说,您可能会发现使用 Python 字符串比乱用 C 字符串处理更容易。
虽然我已经问了几个类似的问题,但我无法解决如何解决。
基本上我有这个功能:
模块 one.pyx:
cdef char *isInData(data, dataLength):
cdef char *ret = <char *>malloc(200)
memset(ret, 0x00, 200)
if (b"Hello" in data and b"World" in data):
strcat(ret, b"Hello World!")
return ret
模块 two.pyx:
import one
from libc.stdlib cimport malloc,realloc, free
cdef char *tempo():
cdef char *str
str = one.isInData(b"Hello what is up World", 23)
# do some stuff
free(str)
问题发生在行 str = one.isInData("Hello what is up World", 23)
上,我假设一旦 isInData->ret
被分配给 str
。 isInData->ret
被删除导致此问题。但是有人帮我解决这个问题吗?
import one
此行执行 Python 导入 one
。它不知道 one
中定义的任何 cdef
函数(甚至 one
是一个 Cython 模块...)。因此,它假定 isInData
是一个可以查找的 Python 对象,并且它将是一个可调用对象,返回另一个 Python 对象。
cdf char* str = some_python_function()
是不安全的,因为 str
指向 Python 对象。但是 Python 对象只是一个临时对象,很可能几乎立即被释放。
你的意思是:
cimport one
它告诉 Cython 它是您要导入的 Cython 模块,它应该期望在 compile-time 处找到声明。您可能需要写 a pxd file 来给出声明。
我没有详细查看您的其余代码,所以不知道您是否正确处理了 C 字符串。但总的来说,您可能会发现使用 Python 字符串比乱用 C 字符串处理更容易。