HOME | ドキュメント |  ブログ  |  BBS  |  瓦版  | 将棋プロジェクト |  物置小屋   

Python から C++ クラスを呼び出す Python パイソン SpamBayes 日本語化
 道標
象歩
象歩ブログ
ドキュメント
自転車整備ノート
C/C++
Linux 備忘録
パソコン整備ノート
不健康日記
不健康日記(2)
不健康日記(3)
Python パイソン
PythonからCプログラ~
Python から C++ クラ~
PythonからC++クラス~
SpamBayes 日本語化
UDP通信のサンプルコ~
XMLRPC サンプルコー~
セキュリティ
Vine ヴァイン
Zope2 (ゾープ 2.x 系)
象歩BBS
Web瓦版
将棋プロジェクト
物置小屋
 リンク
python.org
document
SourceForge.net: Python
wiki.python.org
wiki.python.org/moin/TkInter
PIL/Tkinter
Mark Hammond's Free Stuff
Tcl/Tk Manual Pages
Python development with Eclipse and Ant
Dive Into Python
Python HOWTOs
Richard Gruet's Home page
日本Pythonユーザ会
Python チュートリアル
Python 標準ドキュメント
Python 2.4 Quick Reference
正規表現 HOWTO
PythonSpeed 日本語訳
Python おもちゃばこ (仮称)
ASPN Python Cookbook
PEP 8 -- Style Guide for Python Code
Pythonイントロスペクション入門
Pythonでの永続性管理
numarray日本語訳
複雑なモデルをシンプルにするSimPy
python での行列・ベクトル数値計算
Gembook.jp
NoboNoboRTD
岩田さん
松本さん
増田さん
py2exeモジュールについて
Django オンラインドキュメント和訳(へのリンク)
Tcl/Tk と Tkinter
SQLObject 日本語訳
The Python IAQ: Infrequently Answered Questions 日本語訳
Python 調査報告
Django オンラインドキュメント和訳
紫藤のページ
M.Hiroi's Home Page
Tcl/Tk 屋根裏が入口

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" となります。