python编程(python和c相互调用)

栏目: Python · 发布时间: 6年前

内容简介:python编程(python和c相互调用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】   

通常为了扩展 python 的功能,我们需要将c库移植到python上面。python和c调用一般分成两种情况,一种是python调用c,这种情况最为普遍,也比较简单。另外一种就是c调用python,这种情况多出现在有回调函数的时候。

1、利用ctypes实现python调用c

用ctypes调用c是一种比较简单的方法,比如说,有这么一个c文件,

int add(int x, int y){
	return (x+y);  
}

我们首先将它编译成动态库的形式,

gcc -fPIC -shared -o libAdd.so  add.c

有了这个动态库,我们就可以用ctypes调用它了,比如说python文件是这样的,

import ctypes
l = ctypes.CDLL("./libAdd.so");
num = l.add(3,4)

有了一个动态库,再加上这个python文件,基本上就可以完成python对c的调用了。

2、c调用python

这种情况多出现在回调函数上,比如说事件响应,定时器等等。一般的操作是这样的,假设有一个python文件,

def show(name): 
        print "this is ",name

为了实现c对python的调用,还需要一个c文件,

#include <Python.h> 
int main() {   
        Py_Initialize();   
        if (!Py_IsInitialized())  return -1; 
        PyRun_SimpleString("import sys");
        PyRun_SimpleString("sys.path.append('./')");
 
        //import Module 
        PyObject* pModule = PyImport_ImportModule("hello");   
        if (!pModule) {   
                printf("Can't import Module!/n");   
                return -1;   
        }   
 
        PyObject* pDict = PyModule_GetDict(pModule);   
        if (!pDict) {   
                return -1;   
        }   
   
        //fetch Function 
        PyObject* pFunHi = PyDict_GetItemString(pDict, "show");   
        PyObject_CallFunction(pFunHi, "s", "tim");   
        Py_DECREF(pFunHi);   
  
        //Release 
        Py_DECREF(pModule);   
        Py_Finalize();   
        return 0;   
}
同样,在使用之前,需要好好编译一下,
gcc process.c -I/usr/include/python2.7 -ldl -lutil -lpthread -lpython2.7 -o process
如果这个时候,你可以正常执行process文件,那么说明c调用python成功了。c调用python一般需要先找到python的字符,再进行调用。熟悉 lua 的同学,看到这里应该再熟悉不过了。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Clean Code

Clean Code

Robert C. Martin / Prentice Hall / 2008-8-11 / USD 49.99

Even bad code can function. But if code isn’t clean, it can bring a development organization to its knees. Every year, countless hours and significant resources are lost because of poorly written code......一起来看看 《Clean Code》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具