使用SWIG和Python 3初始化包中的子模块

时间:2014-07-23 20:29:59

标签: python-3.x swig

我有一个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版本)。

这是我的代码。

ModuleABC.h

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
}

PythonManager.cpp

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");

然后它运行时没有错误,但我的模块没有在包中导入。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我终于找到了问题所在。在嵌入模式下使用带有SWIG和Python 3的PyImport_AppendInittab时,需要使用&#34;下划线&#34;在模块名称之前,没有包名称。

PyImport_AppendInittab("_myModule", PyInit__myModule);

请确保您的文件结构格式为:

myPackage\
   __init__.py
   myModule.py

然后一切都按预期工作。