我正在尝试使用c库中的一个函数,其原型如下:

int glip_get_backends(const char ***name, size_t *count);

这里的name参数就是问题所在。它是一个通过引用传递的二维字符数组。在C中,函数使用如下:const char** name;

size_t count;

glip_get_backends(&name, &count);

for (size_t i = 0; i < count; i++) {

printf("- %s\n", name[i]);

现在我想从python使用ctypes来使用这个函数。

对我来说,最合乎逻辑的方法是使用python:lglip = CDLL("libglip.so")

count = c_int(0)

backends = POINTER(POINTER(c_char))

lglip.glip_get_backends(byref(backends), byref(count))

导致错误信息TypeError: byref() argument must be a ctypes instance, not '_ctypes.PyCPointerType'

下一种方法是使用POINTER()函数三次,并省略byref(),但这会导致以下错误:ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1

然后我从this question中获得灵感,并得出以下结论:lglip = CDLL("libglip.so")

count = c_int(0)

backends = POINTER(POINTER(c_char))()

lglip.glip_get_backends(byref(backends), byref(count))

for i in range(0, count.value):

print backends[i]

由于某些原因,在backends的定义之后添加()已修复了该调用,但得到的输出是:< ctypes.LP_c_char object at 0x7f4592af8710 >

< ctypes.LP_c_char object at 0x7f4592af8710 >

在python中,我似乎无法使用一个iterator覆盖二维c数组,因为它没有正确地取消对它的引用。

问题我正在尝试使用c库中的一个函数,其原型如下:int glip_get_backends(const char ***name, size_t *count);这里的name参数就是问题所在。它是一个通过引用传递的二维字符数组。在C中,函数使用如下:const char** name;size_t count;glip_get_backends(&amp;name, &amp;count);fo...
sessionID = dll.QTTSSessionBegin(session_begin_params, byref(ret)) byref(n)返回的相当于C的指针右值&amp;n,本身没有被分配空间:&gt;&gt;&gt; from ctypes import * &gt;&gt;&gt; n = c_int(0) &gt;&gt;&gt; p = byref(n) &gt;&gt;&...
微信朋友圈自动点赞及解决PyAutoGui的 ctypes .windll.user32.mouse_event(ev, ctypes .c_long(convertedX), ctypes .c_long(convertedY), dwData, 0) ctypes .ArgumentError: argument 4: <class 'TypeError'>: Don't know how to convert parameter 4
Traceback (most recent call last):   File "main_batch.py", line 175, in &lt;module&gt;     main(my_args)   File "main_batch.py", line 102, in main     seq2seq = seq2seq.cuda()    File "... 一. ctypes 使用介绍 ctypes Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。这篇文章主要是介绍如何使用 ctypes 模块对C语言编译的动态链接库要求的数据类型进行封装,主要包括以下几类: C语言中基础的数据类型(如char, int等) 结构体类型 嵌套结构体 结构体数组 结构体指针
Python ctypes 的使用整理 ctypes Python 的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数。 ctypes 的官方文档在这里。 1. ctypes 基本数据类型映射表 参数类型预先设定好,或者在调用函数时再把参数转成相应的c_***类型。 ctypes 的类型对应如下: 1 ctypes 简介 从 Python 2.5开始引入。 ctypes Python 的外部函数库。它提供了C兼容的数据类型,并且允许调用动态链接库/共享库中的函数。它可以将这些库包装起来给 Python 使用。 2 ctypes 入门 本入门中的代码使用doctest确保可用。不过一些代码在linux/windows/mac os x中的行为可能略有差异,这在其docte
Python 是一种解释型语言,通常情况下执行速度比编译型语言要慢。然而, Python 提供了许多工具和库来提高其执行速度。其中一个重要的工具是 ctypes (C types)库,它允许 Python 与C语言进行交互,从而能够利用C语言的执行速度。 在本教程中,我们将介绍如何使用 ctypes 来提高 Python 的执行速度。 ## 安装 ctypes 通常情况下, ctypes 已经包含在 Python 标准库中,因此你不需要安装它。如果你使用的是较早版本的 Python ,则需要单独安装 ctypes 库。 ## 使用 ctypes 要使用 ctypes ,我们需要了解以下几个关键概念: - 数据类型 - 动态链接库 ### 数据类型 C语言有许多不同的数据类型,如整数、浮点数、字符等。 Python 也有其自己的数据类型。为了在 Python 中使用C语言的数据类型,我们需要使用 ctypes 库中的数据类型。 以下是一些常用的 ctypes 数据类型: | C 数据类型 | ctypes 数据类型 | | --- | --- | | char | c_char | | int | c_int | | long | c_long | | unsigned int | c_uint | | unsigned long | c_ulong | | float | c_float | | double | c_double | ### 指针 C语言中有指针的概念,指针是一个变量,其值为另一个变量的地址。在 Python 中,我们可以使用 ctypes 中的指针类型来模拟C语言中的指针。 以下是一些常用的 ctypes 指针类型: | C 指针类型 | ctypes 指针类型 | | --- | --- | | int* | POINTER(c_int) | | float* | POINTER(c_float) | | char* | POINTER(c_char) | ### 动态链接库 动态链接库是一种可重定位的文件,其中包含函数和变量的代码和数据。当我们使用 ctypes 时,我们通常会加载一个动态链接库,并从中调用函数。 以下是一些常用的 ctypes 库函数: - `cdll.LoadLibrary()`:加载一个动态链接库。 - `dll.function()`:调用库中的函数。 ## 示例 下面是一个示例,演示如何使用 ctypes Python 中调用C语言编写的函数。假设我们有一个C语言函数,其定义如下: int add(int a, int b) { return a + b; 我们可以将此函数编译为动态链接库,然后在 Python 中使用 ctypes 调用它。 首先,我们需要编写一个 Python 脚本,用于加载并调用动态链接库中的函数: ``` python import ctypes # 加载动态链接库 lib = ctypes .cdll.LoadLibrary('./libadd.so') # 获取函数 add = lib.add # 设置参数和返回值类型 add.argtypes = ( ctypes .c_int, ctypes .c_int) add.restype = ctypes .c_int # 调用函数 print(add(1, 2)) 然后,我们可以使用以下命令将C语言代码编译为动态链接库: ```bash gcc -shared -o libadd.so add.c 其中,add.c是包含上面C语言代码的文件名。 最后,我们可以运行 Python 脚本,并从控制台输出结果: ```bash $ python 3 test.py 这里我们成功地使用 ctypes Python 中调用了C语言函数。 ## 总结 在本教程中,我们介绍了如何使用 ctypes 库在 Python 中调用C语言函数。我们了解了 ctypes 中的数据类型、指针和动态链接库,并提供了一个示例来演示如何使用它们。使用 ctypes 可以大大提高 Python 的执行速度,特别是在处理大量数据时。