PyImport_Import 在 python 模块中导入子模块时失败

PyImport_Import failing when submodules are imported in a python module

我有这样的 cpp 代码:

void callPython() {
    Py_Initialize();    
    PyObject* sysPath = PySys_GetObject("path");
    PyList_Append(sysPath, PyUnicode_FromString("/jarvis_repo/src/cpp/packages/jarvis/nlp/"));
    // Load the module
    PyObject *pName = PyUnicode_FromString("my_mod");
    PyObject *pModule = PyImport_Import(pName);
    if (pModule != NULL) {
        std::cout << "Python module found\n";       

        PyObject* pFunc = PyObject_GetAttrString(pModule, "my_func");
        if(pFunc != NULL){
            PyObject_CallObject(pFunc, NULL);
        } else {
            std::cout << "Couldn't find func\n";
        }
    }
    else {
        PyErr_Print();
        std::cout << "Python Module not found\n";
}     
    Py_Finalize();
}

我在同一个目录/jarvis_repo/src/cpp/packages/jarvis/nlp/中还有两个文件my_mod.py和test.py如下:

my_mod.py

from test import coreDM
def my_func():
    print("my_func() got called")
    coreDM()

test.py

class coreDM():
    def __init__(self):
        print("Initialized test")

    def print_message():
        print("Hello from coreDM")

from test import coreDMcoreDM()my_mod.py 中省略时, PyImport_Import 工作正常并打印 my_func() got called 否则它 returns NULL。 知道为什么会发生这种情况吗? 提前致谢!

错误消息:

ImportError: cannot import name 'coreDM'
Python Module not found

使用 PyList_Insert 代替 PyList_Append 以从您想要的位置导入测试。

如@DavidW 所述,核心库中有一个名为 test 的可导入模块。

改变

PyList_Append(sysPath, PyUnicode_FromString("/jarvis_repo/src/cpp/packages/jarvis/nlp/"));

PyList_Insert(sysPath, 0, PyUnicode_FromString("/jarvis_repo/src/cpp/packages/jarvis/nlp/"));

所以 test 模块首先在 /jarvis_repo/src/cpp/packages/jarvis/nlp/ 中找到,而不是在核心库中。

注意: 你应该重命名 test 而不是