python利用ctypes的指针传入int型列表和string类型列表到c语言中

下面这个方法是将c语言的函数编译为动态链接库,然后python调用得到结果。这个c语言中没有main函数,是因为python只需要调用它的方法。

将它和c++结合,用c++操作这个python的list,就需要用到extern “C”了。。。后续会出~~

如果有大神可以不用extern”C”直接调用c++的,请留言,感谢分享

#include <stdio.h>

void get_str_list(int n, char *b[2])
{
    printf("in c start");
    for(int i=0;i<n;i++)
    {
        printf("%s", *(b+i));
        printf("\n");
    }
    printf("in c end");
}

void get_point_int(int n, int *b)
{
    printf("in c start\n");
    for(int i=0;i<n;i++)
    {
        printf("%d", *(b+i));
        printf("\n");
    }
    printf("in c end\n");
}

void get_point_str(int n, char *b[])
{
    printf("in c start\n");
    for(int i=0;i<n;i++)
    {
        printf("%s", *(b+i));
        printf("\n");
    }
    printf("in c end");
}

将上面的c语言编译为动态链接库

gcc -o hello2.so -shared -fPIC c_p.c

对应的python代码(这里注意ll后面是动态链接库的路径)

from ctypes import *
ll = cdll.LoadLibrary
lib = ll("./12_23_ctype_list/hello2.so")
n = 3
str1 = c_char_p(bytes("nihao", 'utf-8'))
str2 = c_char_p(bytes("shijie", 'utf-8'))
lists = [str1, str2]
print(enumerate(lists))
a = (c_char_p*2)(str1, str2)
lib.get_str_list(2, a)

b = [1,23,345]
b_arr = (c_int*3)(*b)
lib.get_point_int(3, b_arr)

c = ["hello", "world", "ni", "hao"]
str_c1 = c_char_p(bytes("hello", "utf-8"))
str_c2 = c_char_p(bytes("world", "utf-8"))
str_c3 = c_char_p(bytes("ni", "utf-8"))
str_c4 = c_char_p(bytes("hao", "utf-8"))
c = [str_c1, str_c2, str_c3, str_c4]
c_arr = (c_char_p*4)(*c)  # 传入一个python的list的指针
lib.get_point_str(4, c_arr)

结果:

<enumerate object at 0x7f78598fe3a8>
in c startnihao
shijie
in c endin c start
1
23
345
in c end
in c start
hello
world
ni
hao
in c end

附上一幅python类型转ctypes类型再转c++类型的汇总图:

ctypes类型说明

Python是一种解释语言,通常情况下执行速度比编译语言要慢。然而,Python提供了许多工具和库来提高其执行速度。其一个重要的工具是ctypes(C types)库,它允许PythonC语言进行交互,从而能够利用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()`:调用库的函数。 ## 示例 下面是一个示例,演示如何使用ctypesPython调用C语言编写的函数。假设我们有一个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 $ python3 test.py 3 ``` 这里我们成功地使用ctypesPython调用了C语言函数。 ## 总结 在本教程,我们介绍了如何使用ctypes库在Python调用C语言函数。我们了解了ctypes的数据类型指针和动态链接库,并提供了一个示例来演示如何使用它们。使用ctypes可以大大提高Python的执行速度,特别是在处理大量数据时。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值