"cannot begin a template-argument list"対策
ubuntu上のswig-1.3.40でpythonモジュールをコンパイルしようとして遭遇。
どういうエラーかというとswigで自動生成したc++ソースで
std::vector<::meshio::la::Vector3,std::allocator< meshio::la::Vector3 > >
こういうソースが生成されていて、"
distutilsに介入して 文字列置換する
swigの呼び出しは、setup.pyから自動化されている。その中に"
import re pattern=re.compile("<:") def edit(f): """ 引数のファイルの"<:"を"< :"に置換して、 新ファイルに書き込む。新ファイル名を返す。 """ new_file=f+".cpp" io=open(new_file, 'wb') for line in open(f): if sys.version_info[0]<3: io.write(pattern.sub("< :", line)) else: io.write(pattern.sub("< :", line).encode('utf-8')) io.close() return new_file # class build_extのswig_sourcesメソッドを改造 org=distutils.command.build_ext.build_ext.swig_sources def custom(self, sources, extension): # オリジナルの呼び出し後に結果のファイルを置換したファイルを作成。置換したファイル名を返す return [edit(f) for f in org(self, sources, extension)] distutils.command.build_ext.build_ext.swig_sources=custom
要するに既存のメソッドをオレオレメソッドで置き換えている。