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;
}
|