我遇到了一个Cython的错误,我发现很难解决。 我有一个struct ret_val,它有一个叫做last_visited的long [:]字段。 我想设置这个,但得到以下运行时错误:Cython memoryview错误 - 致命的Python错误:获取计数是
Fatal Python error: Acquisition count is -1753032536 (line 5052)
以下是负责任的C文件在上面一行的摘录:
/* "cymain.pyx":196
* last = np.array([1,1,1], dtype=np.int64)
* ret_val.last_visited = last # <<<<<<<<<<<<<<
*/
__pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_v_last);
if (unlikely(!__pyx_t_9.memview)) {
__pyx_filename = __pyx_f[0];
__pyx_lineno = 196;
__pyx_clineno = __LINE__;
goto __pyx_L1_error;
}
__PYX_XDEC_MEMVIEW(&__pyx_v_ret_val->last_visited, 0);
__pyx_v_ret_val->last_visited = __pyx_t_9;
__pyx_t_9.memview = NULL;
__pyx_t_9.data = NULL;
我试图使一个最小的例子来重现错误,但它没有发生。然后,我重写了使用最小示例绘制的函数,并再次失败。
这里有一个小例子,不产生错误,但是,据我了解,在功能上等同于错误导致代码:
cdef struct baz:
long[:] lv
othermodule.something* cd
cdef baz* initialise_baz(dict req):
cdef:
baz* ret_val = <baz *> malloc(sizeof(baz))
long nlevels = 3
ret_val.cd = NULL
lv = req["key"]
lv = np.array(lv, dtype=np.int64)
ret_val.lv = lv
return ret_val
def test_memview_error(req):
cdef baz* foo
foo = initialise_baz(req)
print "foo.lv[2]", foo.lv[2]
然后调用
import cymodule
cymodule.test_memview_error({"key":np.array([1,2,3])})
你能提供Python/Cython代码,而不是自动生成的输出吗?问题出在那里;总是假定编译器是正确的,而且你的代码是错误的,直到你排除了你自己代码中的所有错误(即使这样,它仍然通常是代码中的问题)。 – ShadowRanger
您提供的代码中没有足够的信息来诊断问题。如果你不能创造[mcve],可悲的现实是没有人能够帮助你。 – Kevin
如果我不得不猜测,我会说这是由于内存视图被初始化为随机的东西而引起的,所以当它被分配时,它会尝试释放“旧内存视图”(基于初始化的内存)并命中该错误。尝试将malloc更改为calloc ... – DavidW