【发布时间】:2018-04-12 18:18:51
【问题描述】:
我有一个接收 int 数组的 C++ 函数,我正在使用 ctypes 和 numpy 为它制作一个 python 包装器。这是一个最小的例子:
copy.cpp
#include <vector>
extern "C" std::vector<int>* copy_vec(int* array, int size){
std::vector<int>* vec = new std::vector<int>(size);
for (int i=0; i<size; i++){
vec->push_back(array[i]);
}
return vec;
}
copy.py
import ctypes as ct
import numpy as np
INT_POINTER = ct.POINTER(ct.c_int)
_lib = ct.cdll.LoadLibrary('./libcopy.dll')
_lib.copy_vec.argtypes = [INT_POINTER, ct.c_int]
def copy(nums):
size = len(nums)
nums_c = np.array(nums).ctypes.data_as(INT_POINTER)
vector = _lib.copy_vec(nums_c, size)
return vector
array =[12]*1000000
copy(array)
这会产生以下错误消息:
---------------------------------------------------------------------------
WindowsError Traceback (most recent call last)
<ipython-input-2-752101759a61> in <module>()
1 array =[12]*1000000
----> 2 copy(array)
<ipython-input-1-f18316d64ae3> in copy(nums)
10 size = len(nums)
11 nums_c = np.array(nums).ctypes.data_as(INT_POINTER)
---> 12 vector = _lib.copy_vec(nums_c, size)
13
14 return vector
WindowsError: exception: access violation reading 0x08724020
此代码适用于像 array =[12]*100 这样的小数组,但在使用大数组时会失败。
【问题讨论】:
标签: python arrays numpy ctypes