我正在尝试调用一个C函数,该函数接受一个指向指针的指针,并将其重定向到内部分配的一维数组,沿该行:
typedef myStruct {
const char* name;
int status;
} myStruct;
int foo(const myStruct** array, size_t* size);
我试图用Python和NumPy包装它,并获得一个包装该内部内存的NumPy数组(只读)。
我有以下几点:
arr = np.ctypeslib.ndpointer(dtype=np.dtype([('name', np.intp),
('status', np.int)]))()
size = ct.c_size_t()
_call('foo', ct.byref(arr), ct.byref(size))
arr = np.ctypeslib.as_array(arr, shape=(size.value,))
arr.flags.writeable = False # not our memory!
其中_call()
是用于检查返回值的包装器。
我得到以下内容:
ValueError: '<P' is not a valid PEP 3118 buffer format string
通过对as_array()
的调用。我究竟做错了什么?
编辑:我的目标是将数据读取为NumPy结构化数组,因为我认为这是在python中描述C结构数组的最佳方法。
参考方案
也许可以将其视为ndpointer
中的错误-问题是as_array
检查其参数是否为指针,但是该测试对ndpointer失败,并且numpy尝试创建包含单个指针的数组(失败,因为numpy没有指针类型)。
您完全不需要使用numpy就可以了:
class myStruct(ctypes.Structure):
_fields_ = [
('name', ctypes.c_char_p),
('status', ctypes.c_int),
]
arr = ctypes.POINTER(myStruct)()
size = ct.c_size_t()
_call('foo', ct.byref(arr), ct.byref(size))
# convert from `myStruct*` to `myStruct[size]`
arr = ctypes.cast(arr, ctypes.POINTER(myStruct * size.value)).contents
arr
现在是一个ctypes数组。
NumPy中是否有一种简单的方法来展平类型对象数组?我知道.flatten()方法将由相同大小的数组构造的非对象类型数组展平:I1 a = np.array([[1],[2],[3]]) I2 a.flatten() O2 array([1, 2, 3]) 但是,我无法将dtype = object数组展平:I4 b O4 array([[1], [2, 3…
在Numpy数组中替换子数组 - python我正在尝试将Numpy数组中的子数组替换为形状相同的数组,以使所有更改都在两个数组中得到镜像。我在IDLE中运行了以下代码。import numpy a=numpy.zeros((2,1)) a array([[0.], [0.]]) b=numpy.zeros((1)) b array([0.]) a[0]=b b[0]=1 b array([1.]) 现…
Python sqlite3数据库已锁定 - python我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…
Python:传递记录器是个好主意吗? - python我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…
Python-Excel导出 - python我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…