這種方法叫作python的擴展php
int great_function(int a) { return a + 1; }
使用python這樣調用html
>>> from great_module import great_function >>> great_function(2) 3
// great_module.c // 引用python的頭文件 #include <Python.h> int great_function(int a) { return a + 1; } // 包裹函數,用來包裹須要轉化爲python的函數,在方法前面加下劃線。 static PyObject * _great_function(PyObject *self, PyObject *args) { int _a; int res; // 檢查參數類型是否正確,python參數轉化爲c if (!PyArg_ParseTuple(args, "i", &_a)) return NULL; res = great_function(_a); return PyLong_FromLong(res); } // 定義的方法表,用於在python中查找 static PyMethodDef GreateModuleMethods[] = { { "great_function", _great_function, METH_VARARGS, "" }, {NULL, NULL, 0, NULL} }; // 必須以module名前面加init定義該方法 PyMODINIT_FUNC initgreat_module(void) { (void) Py_InitModule("great_module", GreateModuleMethods); }
在Linux下面,則用gcc編譯:java
$ gcc -fPIC -shared great_module.c -o great_module.so -I/usr/include/python2.7/ -lpython2.7
gcc命令行參數:python
-sharedc++
-fPICruby
在當前目錄下獲得great_module.so,同理能夠在Python中直接使用。app
SWIG : Simplified Wrapper and Interface Generator
不只能夠用於python,也能夠用於其餘java/perl/ruby/php/JavaScript/Go。python2.7
/* great_module.i */ %module great_module %{ int great_function(int a) { return a + 1; } %} int great_function(int a);
$ swig -c++ -python great_module.i
會生成對應的great_module_wrap.c
和great_module.py
文件函數
再執行:命令行
$ g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so -I/usr/include/python2.7/ -lpython2.7
生成對應的_great_module.so
文件,這時,咱們就能夠再python中直接調用了
from great_module import great_function print great_function(9) >>> 10
定義一個頭文件,great_class.h
#ifndef GREAT_CLASS #define GREAT_CLASS class Great { private: int s; public: void setWall (int _s) {s = _s;}; int getWall() {return s;}; }; #endif
再定義一個great_class.i
的swig配置文件,這裏不用再寫一遍SWIG的定義了,直接使用SWIG的%include
指令;
在SWIG編譯時要加-c++
這個選項,生成的擴展名爲cxx
。
/* great_class.h */ %module great_class %{ #include "great_class.h" %} %include "great_class.h"
執行命令:
$ swig -c++ -python great_class.i
在Linux下,使用C++編譯器g++
g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so -I/usr/include/python2.7/ -lpython2.7
生成對應的_great_class.so
文件。如今能夠直接在python中輸入
import great_class c = great_class.Great() c.setWall(10) print c.getWall() >>> 10