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

PythonからCプログラムを呼び出す Python パイソン PythonからC++クラスを使う
 道標
象歩
象歩ブログ
ドキュメント
自転車整備ノート
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月04日 ]

SIP を使い C++ クラスを Python から呼び出してみました。 (リファレンス, ダウンロード)。

以下のような C++ クラス word.h があったとすれば。

// word.h
class Word {
private:
    char* _word;
public:
    Word(const char*);
    ~Word();
    const char* str() const { return _word; }
    void set(const char*);
    char* reverse() const;
};
次のような word.sip ファイルを作るだけでビルドできます。
// word.sip
%Module word 0

class Word {
%TypeHeaderCode
#include 
%End
public:
	Word(const char*);
	~Word();
	const char* str() const;
	void set(const char*);
	char* reverse() const;
};

0. 始めに C++ ライブラリを作成する

あらかじめ gcc でコンパイルし libword.a ファイルを作って置きます。

$ g++ -fPIC -o word.o -c word.cpp
$ ar cr libword.a word.o

1. sip を実行する

まず sip でラッパを作ります。

$ /usr/bin/sip -c . word.sip
を実行すると、 sipAPIword.h, sipwordWord.cpp, sipwordcmodule.cpp が生成されます。

2. configure.py から Makefile を作成する

次に configure.py を自分で作ります。

import os
import sipconfig
build_file = "word.sbf"
config = sipconfig.Configuration()
os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "word.sip"]))
makefile = sipconfig.SIPModuleMakefile(config, build_file)
makefile.extra_libs = ["word"]
makefile.generate()
そして下記を実行すると、
$ python configure.py
word.sbf Makefile が新たに生成されます。

3. make を実行する

$ make

こちらの環境ではエラーが出たので修正して通りました。

- LIBS = -lword
+ LIBS = -L./ -lword
自分のライブラリの場所に合わせて修正します。 configure.py をうまく作れば良いだけかもしれません。

4. Python から呼び出す

$ python
>>> from word import Word
>>> w=Word('abc')
>>> w.str()
'abc'
>>> w.reverse()
'cba'
>>> w.set('xyz')
>>> w.str()
'xyz'

5. word.cpp クラスの実装

今回の C++ クラス実装 word.cpp は、 以下のようなコードで試してみました。
// word.cpp
#include "word.h"
#include 

Word::Word(const char* p)
	: _word(0)
{
	set(p);
}

Word::~Word()
{
	delete [] _word;
}

void Word::set(const char* p)
{
	delete [] _word;
	_word = 0;
	if (p) {
		_word = new char [strlen(p) + 1];
		strcpy(_word, p);
	}
}

char* Word::reverse() const
{
	char* p = 0;
	if (_word) {
		int len = strlen(_word);
		p = new char [len + 1];
		for (int i = 0; i < len; i++)
			p[i] = _word[len - i - 1];
		p[len] = 0;
	}
	return p;
}