python 怎么调用c语言接口

Python012

python 怎么调用c语言接口,第1张

ctypes:  可直接调用c语言动态链接库。

使用步骤:

1>编译好自己的动态连接库

2>利用ctypes载入动态连接库

3>用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图:

4>Python若想获取ctypes调用的C函数返回值,需要先指定返回值类型。我们将在接下来的完整Sample中看到如何使用。

#Step 1:  test.c#include <stdio.h>

int add(int a, int b)

{

    return a + b

}#Step 2: 编译动态链接库 ( 如何编译动态链接库在本文不详解,网上资料一大堆。)gcc -fPIC -shared test.c -o libtest.so  

#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)

可以的。

C中内嵌Python

新建立一个工程,首先需要将工作目录设置到Python-3.1.1PCbuild中,以获取到动态库,至于静态库的包含,Include目录的指定,那自然也是少不了的。文件中需要包含Python.h文件,这也是必须的。

接口中

Py_Initialize()

Py_Finalize()

其他的根据需求,再引入相应的python builder 即可

这个事情做过好多遍,摸索的过程基本这样的:

1. 通过stdout通信...土到爆,但上手极快,简单粗暴;

2. 调用原始的python.h 接口,编写可以被python import 的so,支持python调用c++接口,c++接口调用python同样的方式;

3. 使用boost-python 完成2中的功能,接口简单很多,本质上没有不同;

这里遇到的主要几个问题在于:

1. 数据的序列化反序列化,因为有时c++和python之间通信的不是基本类型,可能是用户自定义类型;

2. 多线程的问题,c++多线程调python接口时,需要注意GIL的使用,貌似因为python解释器不是线程安全的;

3.

对象传递,大多数情况下,如果只是静态接口调用,都比较简单,考虑一种情况:c++中的对象的一个函数调用python一个接口,这个python接口中

又需要反过来调用这个对象中的另一个接口,这里就需要考虑怎么把对象相互传递,我这里是把对象指针地址传递到python中,在python中调用一个

c++的静态接口,带上地址和其他需要的参数,在这个c++的静态接口中,把地址转换成指针在调用..