我正在尝试使用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(&name, &count);fo...
sessionID = dll.QTTSSessionBegin(session_begin_params, byref(ret))
byref(n)返回的相当于C的指针右值&n,本身没有被分配空间:>>> from
ctypes
import *
>>> n = c_int(0)
>>> p = byref(n)
>>&...
微信朋友圈自动点赞及解决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 <module>
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
的执行速度,特别是在处理大量数据时。