与SWIG和Python 3在封装内初始化子模块(Initialize a sub-module w

2019-10-20 12:30发布

我有我swigged到Python 2.7 C ++应用程序。 目前,我试图端口我的代码在Python 2.7到Python 3.4使用Python / C API和痛饮。

我有一个包含多个模块的封装。 问题是我无法找到一个方法来初始化我的模块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");

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

有任何想法吗?

Answer 1:

我终于发现了问题。 当使用PyImport_AppendInittab以嵌入模式与SWIG和Python 3,您需要把“下划线”模块的名称前, 不带包的名称。

PyImport_AppendInittab("_myModule", PyInit__myModule);

只要确保你的文件结构的形式为:

myPackage\
   __init__.py
   myModule.py

然后一切正常。



文章来源: Initialize a sub-module within a package with SWIG and Python 3