Python呼び出しC/C++方式
3429 ワード
Python呼び出しC++方式
方式一(基礎編)
この方法をpythonの拡張と呼ぶ
pythonを使用して呼び出す
Linuxの下では、gccでコンパイルします.
gccコマンドラインパラメータ: -shared は、実行可能ファイル に他のオブジェクトと接続可能な共有オブジェクトを生成する.
-fPIC はダイナミックリンクに適用され、グローバルオフセットテーブルサイズの制限を回避し、一部のマシンでのみ を実行できます.
現在のディレクトリの下でgreat_を取得module.so,同様にPythonで直接使用できる.
メソッド2(SWIGを使用)
SWIG : Simplified Wrapper and Interface Generator
呼び出しc
pythonだけでなく、他のjava/perl/ruby/php/JavaScript/Goにも使用できます.定義module名は、通常、ファイル名と一致します. %{%}小包の部分はc言語コードで、このコードはそのままmymodule_にコピーされます.wrap.c でエクスポートする関数署名リスト.ファイルから直接コピーすれば
対応する
再実行:
対応する
c++を呼び出す
ヘッダーファイルを定義します.
コマンドの実行:
LinuxでC++コンパイラg++を使用
対応する
リファレンス作者:Jerry Jhoリンク SWIGの公式ドキュメントSWIG Users Manual GCCコマンドラインオプション
方式一(基礎編)
この方法を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コマンドラインパラメータ:
現在のディレクトリの下で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);
$ 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
リファレンス