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

问题描述 投票:0回答:1

我有这样的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 coreDM中省略coreDM()my_mod.py时,PyImport_Import可以正常工作并打印my_func() got called,否则它返回NULL。为什么会发生这种情况?预先感谢!

错误信息:

ImportError: cannot import name 'coreDM'
Python Module not found
python c++ python-c-api python-embedding
1个回答
0
投票

使用PyList_Insert代替PyList_Append来从所需位置导入测试。

正如@DavidW提到的那样,核心库中有一个名为test的可导入模块。

更改

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

to

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

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

注意:您应该重命名test

© www.soinside.com 2019 - 2024. All rights reserved.