Python調用C/C++方式

Python調用C++方式

方式一(基礎篇)

這種方法叫作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)

SWIG : Simplified Wrapper and Interface Generator

調用c

不只能夠用於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);
  1. 定義module名稱一般和文件名保持一致。
  2. %{%}包裹的部分是c語言代碼,這段代碼會原封不動的複製到mymodule_wrap.c
  3. 欲導出的函數簽名列表。直接從頭文件中複製過來便可
$ swig -c++ -python great_module.i

會生成對應的great_module_wrap.cgreat_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

調用c++

定義一個頭文件,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

參考

相關文章
相關標籤/搜索