Python調用c/c++函數

Python調用c/c++函數(1)

標籤: pythoncommandnullfunctionfun2010python

2008-08-28 20:15 28876人閱讀 評論(5) 收藏 舉報c++

 分類:shell

3.Linux/C/Python(48) api

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。app

    Python開發效率高,運行效率低。而c/c++偏偏相反。所以在python腳本中調用c/c++的庫,對python進行擴展,是頗有必要的。使用python api,http://www.python.org/doc/ ,須要安裝python-dev。
test.cpp文件以下函數

 

[cpp] view plain copyui

  1. #include <python2.6/Python.h> //包含python的頭文件  
  2. // 1 c/cpp中的函數  
  3. int my_c_function(const char *arg) {  
  4.   int n = system(arg);  
  5.   return n;  
  6. }  
  7. // 2 python 包裝  
  8. static PyObject * wrap_my_c_fun(PyObject *self, PyObject *args) {  
  9.   const char * command;  
  10.   int n;  
  11.   if (!PyArg_ParseTuple(args, "s", &command))//這句是把python的變量args轉換成c的變量command  
  12.     return NULL;  
  13.   n = my_c_function(command);//調用c的函數  
  14.   return Py_BuildValue("i", n);//把c的返回值n轉換成python的對象  
  15. }  
  16. // 3 方法列表  
  17. static PyMethodDef MyCppMethods[] = {  
  18.     //MyCppFun1是python中註冊的函數名,wrap_my_c_fun是函數指針  
  19.     { "MyCppFun1", wrap_my_c_fun, METH_VARARGS, "Execute a shell command." },  
  20.     { NULL, NULL, 0, NULL }  
  21. };  
  22. // 4 模塊初始化方法  
  23. PyMODINIT_FUNC initMyCppModule(void) {  
  24.   //初始模塊,把MyCppMethods初始到MyCppModule中  
  25.   PyObject *m = Py_InitModule("MyCppModule", MyCppMethods);  
  26.   if (m == NULL)  
  27.     return;  
  28. }  

 

make:spa

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

編譯完畢後,目錄下會有一個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

相關文章
相關標籤/搜索