PythonからC++クラスを使う
[更新日:
2007年12月09日
]
Python から C++ クラスをリンクする方法を試しました。
C++ としてコンパイルするので、
extern 文でラッパ関数の名前解決をしています。
コンストラクタと初期化関数はモジュールを import
した時点で呼ばれるようです。
1.ソースコード
ヘッダ
//
// CHello.h
//
class CHello {
public:
CHello() {}
~CHello() {}
void add(int, int);
void out(const char*, const char*);
};
ソース
//
// CHello.cpp
//
#include "CHello.h"
int CHello::add(int x, int y)
{
return x + y;
}
void CHello::out(const char* adrs, const char* name)
{
printf("今日は、私は %s の %s です。\n", adrs, name);
}
2.wrapper コード
モジュール名は "CHello" とします。
//
// CHelloWrapper.cpp
//
#include "Python.h"
#include "CHello.h"
extern "C" {
PyObject* hello_add(PyObject*, PyObject*);
PyObject* hello_out(PyObject*, PyObject*, PyObject*);
void inithello();
}
static CHello hello;
PyObject* hello_add(PyObject* self, PyObject* args)
{
int x, y, g;
if (!PyArg_ParseTuple(args, "ii", &x, &y))
return NULL;
g = hello.add(x, y);
return Py_BuildValue("i", g);
}
PyObject* hello_out(PyObject* self, PyObject* args, PyObject* kw)
{
const char* adrs = NULL;
const char* name = NULL;
static char* argnames[] = {"adrs", "name", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kw, "|ss",
argnames, &adrs, &name))
return NULL;
hello.out(adrs, name);
return Py_BuildValue("");
}
static PyMethodDef hellomethods[] = {
{"add", hello_add, METH_VARARGS},
{"out", hello_out, METH_VARARGS | METH_KEYWORDS},
{NULL},
};
void inithello()
{
Py_InitModule("CHello", hellomethods);
}
初期化関数でモジュール名は "CHello" となります。
3.ビルド
コンパイルとリンクをおこない共有ライブラリを作成します。
$ g++ -fpic -o CHello.o -c CHello.cpp
$ g++ -fpic -I/usr/include/python -o CHelloWrapper.o -c CHelloWrapper.cpp
$ g++ -shared CHello.o CHelloWrapper.o -o CHellomodule.so
ライブラリ名は "CHellomodule" となります。
|