PythonからC++クラスを呼び出す
SIP を使い C++ クラスを Python から呼び出してみました。 他にも boost や SWIG などあるらしいけど、こいつは軽快。良いかも。
たとえばこんな C++ クラス word.h があったとして、
class Word { private: char* _word; public: Word(const char*); const char* str() const { return _word; } void set(const char*); char* reverse() const; };
sip を使いゴニョゴニョした後、
$ python >>> from word import Word >>> w=Word('abc') >>> w.str() 'abc' >>> w.reverse() 'cba' >>> w.set('xyz') >>> w.str() 'xyz'
こんなふうに Python からクラスとして扱えます。 "operator=" などサポートして無いものもあるらしいけど、スゴイ^^
作るものは C++ のヘッダに似てるけど word.sip
%Module word 0 class Word { %TypeHeaderCode #include %End public: Word(const char*); const char* str() const; void set(const char*); char* reverse() const; };そして configure.py を適当に修正。
import os import sipconfig # The name of the SIP build file generated by SIP and used by the build # system. build_file = "word.sbf" # Get the SIP configuration information. config = sipconfig.Configuration() # Run SIP to generate the code. os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "word.sip"])) # Create the Makefile. makefile = sipconfig.SIPModuleMakefile(config, build_file) # Add the library we are wrapping. The name doesn't include any platform # specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the # ".dll" extension on Windows). makefile.extra_libs = ["word"] # Generate the Makefile itself. makefile.generate()
あとはビルドすればできあがり。
$ g++ -fPIC -o word.o -c word.cpp $ ar cr libword.a word.o $ sip -c . word.sip $ python configure.py $ make