我有一个C ++应用程序,我转向Python 2.7。我目前正在尝试使用Python / C API和SWIG将我的代码从Python 2.7移植到Python 3.4。
我有一个包含多个模块的包。问题是我找不到将模块 ModuleABC 初始化为包 PackageXYZ 的子模块的方法。它适用于Python 2.7但不适用于Python 3.4(我认为它不适用于任何Python 3.x版本)。
这是我的代码。
extern "C"
{
#if PY_MAJOR_VERSION >= 3
PyObject* PyInit__ModuleABC(void);
#else
void init_ModuleABC(void);
#endif
}
void InitModule()
{
// Defined in the SWIG generated cpp file
#if PY_MAJOR_VERSION >= 3
PyImport_AppendInittab("PackageXYZ.ModuleABC", PyInit__ModuleABC);
#else
init_ModuleABC();
#endif
}
void initPythonInterpreter()
{
Py_SetPythonHome("C:\Python34");
Py_SetProgramName("MyApp.exe");
#if PY_MAJOR_VERSION < 3
// For Python 2.7
Py_Initialize();
#endif
// Init module
ModuleABC.InitModule();
#if PY_MAJOR_VERSION >= 3
// For Python 3.4
Py_Initialize();
#endif
int nResult = 0;
// Import package
nResult += PyRun_SimpleString("import PackageXYZ");
// Import module
// ERROR: Works with Python 2.7, but not with Python 3.4
nResult += PyRun_SimpleString("import PackageXYZ.ModuleABC");
}
如果我改变了行:
PyRun_SimpleString("import PackageXYZ.ModuleABC");
为:
PyRun_SimpleString("import ModuleABC");
然后它运行时没有错误,但我的模块没有在包中导入。
有什么想法吗?
答案 0 :(得分:1)
我终于找到了问题所在。在嵌入模式下使用带有SWIG和Python 3的PyImport_AppendInittab
时,需要使用&#34;下划线&#34;在模块名称之前,没有包名称。
PyImport_AppendInittab("_myModule", PyInit__myModule);
请确保您的文件结构格式为:
myPackage\
__init__.py
myModule.py
然后一切都按预期工作。