Python调用c/c++函数(1)

Python开发效率高,运行效率低。而c/c++恰恰相反。因此在python脚本中调用c/c++的库,对python进行扩展,是很有必要的。使用python api,http://www.python.org/doc/ ,需要安装python-dev。
test.cpp文件如下

 

#include <python2.6/Python.h> //包含python的头文件
// 1 c/cpp中的函数
int my_c_function(const char *arg) {
  int n = system(arg);
  return n;
}
// 2 python 包装
static PyObject * wrap_my_c_fun(PyObject *self, PyObject *args) {
  const char * command;
  int n;
  if (!PyArg_ParseTuple(args, "s", &command))//这句是把python的变量args转换成c的变量command
    return NULL;
  n = my_c_function(command);//调用c的函数
  return Py_BuildValue("i", n);//把c的返回值n转换成python的对象
}
// 3 方法列表
static PyMethodDef MyCppMethods[] = {
    //MyCppFun1是python中注册的函数名,wrap_my_c_fun是函数指针
    { "MyCppFun1", wrap_my_c_fun, METH_VARARGS, "Execute a shell command." },
    { NULL, NULL, 0, NULL }
};
// 4 模块初始化方法
PyMODINIT_FUNC initMyCppModule(void) {
  //初始模块,把MyCppMethods初始到MyCppModule中
  PyObject *m = Py_InitModule("MyCppModule", MyCppMethods);
  if (m == NULL)
    return;
}

 

make:

g++ -shared -fpic test.cpp -o MyCppModule.so

编译完毕后,目录下会有一个MyCppModule.so文件

 

test.py文件如下

 

[python]  view plain copy
 
  1. # -*- coding: utf-8 -*-  
  2. import MyCppModule  
  3. #导入python的模块(也就是c的模块,注意so文件名是MyCppModule    
  4. r = MyCppModule.MyCppFun1("ls -l")  
  5. print r   
  6. print "OK"    

 

 

执行

lhb@localhost:~/maplib/clib/pyc/invokec$ python test.py 
总计 20
-rwxr-xr-x 1 lhb lhb   45 2010-08-11 17:45 make
-rwxr-xr-x 1 lhb lhb 7361 2010-08-12 10:14 MyCppModule.so
-rw-r--r-- 1 lhb lhb  979 2010-08-11 17:45 test.cpp
-rw-r--r-- 1 lhb lhb  181 2010-08-11 17:45 test.py
0
OK

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值