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 coreDM
和 coreDM()
从 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
而不是
我有这样的 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
否则它 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
而不是