Python呼び出しC/C++方式

3429 ワード

Python呼び出しC++方式
方式一(基礎編)
この方法をpythonの拡張と呼ぶ
int great_function(int a) {
    return a + 1;
}

pythonを使用して呼び出す
>>> from great_module import great_function 
>>> great_function(2)
3
// great_module.c

//   python    
#include 

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でコンパイルします.
$ gcc -fPIC -shared great_module.c -o great_module.so -I/usr/include/python2.7/ -lpython2.7

gccコマンドラインパラメータ:
  • -shared
  • は、実行可能ファイル
  • に他のオブジェクトと接続可能な共有オブジェクトを生成する.
  • -fPIC
  • はダイナミックリンクに適用され、グローバルオフセットテーブルサイズの制限を回避し、一部のマシンでのみ
  • を実行できます.

    現在のディレクトリの下でgreat_を取得module.so,同様にPythonで直接使用できる.
    メソッド2(SWIGを使用)
    SWIG : Simplified Wrapper and Interface Generator
    呼び出しc
    pythonだけでなく、他のjava/perl/ruby/php/JavaScript/Goにも使用できます.
    /* great_module.i */
    %module great_module
    %{
    int great_function(int a) {
        return a + 1;
    }
    %}
    int great_function(int a);
    
  • 定義module名は、通常、ファイル名と一致します.
  • %{%}小包の部分はc言語コードで、このコードはそのままmymodule_にコピーされます.wrap.c
  • でエクスポートする関数署名リスト.ファイルから直接コピーすれば
  • $ 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
    

    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
    

    リファレンス
  • 作者:Jerry Jhoリンク
  • SWIGの公式ドキュメントSWIG Users Manual
  • GCCコマンドラインオプション