内容简介: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 的同学,看到这里应该再熟悉不过了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Unix高级编程学习笔记--系统调用简介
- lua编程之lua与C相互调用-和例子代码
- Go 语言函数式编程系列教程(十八) —— 函数篇:函数的基本定义和调用
- 直观讲解-RPC调用和HTTP调用的区别
- 调用链系列一:解读UAVStack中的调用链技术
- 调用链系列二:解读UAVStack中的调用链技术
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!