Python C api PyImport_importmodule 当文件有导入语句时失败
Python C api PyImport_importmodule fail when the file has an import statement
我尝试使用Python C api调用C++中python的函数,测试成功。
但是如果我打算导入一个已经导入其他模块的模块,Pymodule_findmodule 将 return Null 即使它在那里并创建了一个编译文件。这是我的代码
Py_Initialize();
PySys_SetPath("C:/Users/Mik/Documents/GitHub/youtube-dl");
PyObject * pythonFile = PyImport_ImportModule("test2");
这是该目录中名为 test2.py 的 python 文件,其中包含一个名为 test_dl.py 的文件和一个名为 TESTDL 的 class 文件
from test_dl import TESTDL
def someFunction(someInput):
return 12345
添加导入行后,我的程序就不再将其识别为模块
编辑:原来 test_dl 的第一行是:
from __future__ import unicode_literals
这就是我收到此导入错误的原因:没有名为 future
的模块
谢谢!
对 PySys_SetPath()
的函数调用完全覆盖了 Python 模块路径。结果是您的 Python 脚本 test_dl
找不到 Python 系统模块(在本例中 __future__
)并抛出异常。
您需要做的是 将模块的目录附加 到系统路径。为此,首先查询系统路径的现有值,然后将您的路径添加到其中:
PyObject *sys_path = PySys_GetObject("path");
PyList_Append(sys_path, PyString_FromString("C:/Users/Mik/Documents/GitHub/youtube-dl"));
我尝试使用Python C api调用C++中python的函数,测试成功。
但是如果我打算导入一个已经导入其他模块的模块,Pymodule_findmodule 将 return Null 即使它在那里并创建了一个编译文件。这是我的代码
Py_Initialize();
PySys_SetPath("C:/Users/Mik/Documents/GitHub/youtube-dl");
PyObject * pythonFile = PyImport_ImportModule("test2");
这是该目录中名为 test2.py 的 python 文件,其中包含一个名为 test_dl.py 的文件和一个名为 TESTDL 的 class 文件
from test_dl import TESTDL
def someFunction(someInput):
return 12345
添加导入行后,我的程序就不再将其识别为模块
编辑:原来 test_dl 的第一行是:
from __future__ import unicode_literals
这就是我收到此导入错误的原因:没有名为 future
的模块谢谢!
对 PySys_SetPath()
的函数调用完全覆盖了 Python 模块路径。结果是您的 Python 脚本 test_dl
找不到 Python 系统模块(在本例中 __future__
)并抛出异常。
您需要做的是 将模块的目录附加 到系统路径。为此,首先查询系统路径的现有值,然后将您的路径添加到其中:
PyObject *sys_path = PySys_GetObject("path");
PyList_Append(sys_path, PyString_FromString("C:/Users/Mik/Documents/GitHub/youtube-dl"));