標籤: 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
- #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:spa
g++ -shared -fpic test.cpp -o MyCppModule.so.net
編譯完畢後,目錄下會有一個MyCppModule.so文件指針
test.py文件以下
[python] view plain copy
- # -*- coding: utf-8 -*-
- import MyCppModule
- #導入python的模塊(也就是c的模塊,注意so文件名是MyCppModule
- r = MyCppModule.MyCppFun1("ls -l")
- print r
- 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