知行编程网知行编程网  2022-12-21 06:00 知行编程网 隐藏边栏  4 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于c怎么与python交互的相关知识,包括python java c,以及chatgpt github这些编程知识,希望对大家有参考作用。

c如何与python交互

ctypes是Python的一个外部库,可以使用python语言调用编译好的C语言函数和数据类型,进行数据交换。 ctypes 的官方文档位于 https://docs.python.org/3/library/ctypes.html


1、ctypes基本数据类型映射表

c如何与python交互


2、python调用c语言的函数库

(1)生成c语言函数

#Step 1:  test.c
#include <stdio.h>
int add(int a, int b)
{
    return a + b;
}

(2)编译动态链接库生成 libtest.so文件(DLL)

gcc -fPIC -shared test.c -o libtest.so

(3)调用DLL文件

#Step 3:  test.py
from ctypes import *
mylib = CDLL("libtest.so")或者cdll.LoadLibrary("libtest.so")   
add = mylib.add
add.argtypes = [c_int, c_int]  # 参数类型,两个int(c_int是ctypes类型,见上表)
add.restype = c_int # 返回值类型,int (c_int 是ctypes类型,见上表)
sum = add(3, 6)


3、指针和引用

对指针实例的赋值只会改变它指向的内存地址,不会改变内存的内容。指针实例有一个 contents 属性,它返回指针指向的对象。

c如何与python交互

from ctype import *  
i = c_int(1)  
pi = POINTER(c_int)(i)  
pi2 = pointer(i)
print pi.contents  #返回指针指向对象的值
print pi2.contents

pointer 和 POINTER 的区别是,pointer 返回一个实例,POINTER 返回一个类型。


4、结构类型数据

Structures 和 Unions 必须继承 Structure 和 Union 的基本类,它们定义在 ctypes 模块中。每个子类都必须定义一个 fields 属性。 Fields 是一个二维元组列表,包括每个字段的名称和类型。类型必须是 ctypes 类型,例如 c_int,或任何其他继承 ctypes 的类型,例如 Structure、Union、Array、pointer 等。

from ctypes import *
import types
class Test(Structure):
    _fields_ = [('x', c_int),('y', c_char)]
test1 = Test(1, 2)

如果该结构体用于链表操作,即包含指向该结构体的指针时,需要定义如下:

from ctypes import *  
import types  
class Test(Structure):  
    pass  
Test._fields_ = [('x', c_int),('y', c_char),('next', POINTER(Test))]

python学习网,大量的免费
,欢迎在线学习!

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享