Linux使用Python調用C/C++接口(一)

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()
相關文章
相關標籤/搜索