C++頭文件 pyExt.h: python
#ifndef PYEXT_H #define PYEXT_H #include <Python.h> class pyExt { public: pyExt() {} ~pyExt() {} static void Foo(); }; #endif // PYEXT_H
main.cpp: ios
#include "pyExt.h" #include <iostream> using namespace std; void pyExt::Foo() { printf("printf, Python extensions!!\n"); cout << "cout, Python extensions!!" << endl; } static PyObject *func(void) { printf("printf, Python extensions!!\n"); cout << "cout, Python extensions!!" << endl; return Py_BuildValue("s", "Hello, Python extensions!!"); } static PyMethodDef My_methods[] = { { "func", (PyCFunction) func, METH_VARARGS, NULL }, { NULL, NULL, 0, NULL } }; PyMODINIT_FUNC initPyExt(void) { PyObject *m=Py_InitModule("PyExt", My_methods); if (m == NULL) return; }
c模塊中的函數簽名通常有下列三種形式: shell
PyObject* MyFunction(PyObject* self, PyObject* args); python2.7
PyObject* MyFunctionWithKeywords(PyObject* self, PyObject* args, PyObject* kw); 函數
PyObject* MyFunctionWithNoArgs(PyObject* self); 測試
繼續上面例子, 最方便最快捷擴展接口, 首先寫一個setup.py腳本: ui
from distutils.core import setup, Extension setup(name='PyExt', version='1.0', \ ext_modules=[Extension('PyExt', sources = ['main.cpp'])])
而後執行下述命令進行build: spa
python ./setup.py build這會在當前目錄下生成一個build子目錄,其中包含了中間生成的PyExt.o以及最後生成出來的PyExt.so.
進行安裝命令: code
python ./setup.py install
或者手動複製到如下目錄: 接口
sudo cp PyExt.so 到 /usr/local/lib/python2.7/dist-packages
能夠開始測試模塊了:
shell中命令運行python, import模塊名, dir查看被導出函數名:
>>import PyExt
>>dir(PyExt)
>>['__doc__','__file__','__name__','__package__','func']
得知調用函數爲func(), 測試函數:
import PyExt def main(): print PyExt.func() if __name__ == '__main__': main()