組み込みPython/パッケージ名つきでimportする
SWIGで単純にC/C++のラッパーを作ると、1階層のモジュールしかできない。
これをパッケージ名つきでimportするには、xxxx_wrap.cxx を以下のように修正する。
例)helloモジュールをaaa.bbb.hello としたい場合
hello_wrap.cxx<pre>#define SWIG_name “_hello”</pre>→<pre>#define SWIG_name “aaa.bbb._hello”</pre>
m = Py_InitModule((char *) SWIG_name, SwigMethods);
#endif
d = PyModule_GetDict(m);
→<pre>
PyObject* m_aaa = Py_InitModule(“aaa”, NULL); // aaa を作る
PyObject* m_bbb = Py_InitModule(“aaa.bbb”, NULL); // aaa.bbb を作る
m = Py_InitModule((char ) SWIG_name, SwigMethods); // aaa.bbb.hello を作る
#endif
PyObject d_aaa = PyModule_GetDict(m_aaa);
PyObject* d_bbb = PyModule_GetDict(m_bbb);
d = PyModule_GetDict(m);
PyDict_SetItemString(d_aaa, “bbb”, m_bbb); // aaa.bbb(変数) に bbb(モジュール) を登録
PyDict_SetItemString(d_bbb, “_hello”, m); // aaa.bbb.hello(変数) に _hello(モジュール) を登録
</pre>
上位のモジュールがすでに存在する場合は、Py_InitModuleの代わりにPyImport_AddModuleを使う。