问题描述
请考虑以下代码,这些代码从C ++运行嵌入式Python脚本。它创建了一个嵌入式python模块,然后运行导入第二个脚本的脚本。
#include <Python.h>
#include <iostream>
#include <fstream>
PyObject * mymodule_meth_test(PyObject * self) {
std::cout << "Hello World!" << std::endl;
Py_RETURN_NONE;
}
PyMethodDef module_methods[] = {
{"test",(PyCFunction)mymodule_meth_test,METH_NOARGS,NULL},{},};
PyModuleDef module_def = {PyModuleDef_HEAD_INIT,"mymodule",NULL,-1,module_methods};
extern "C" PyObject * PyInit_mymodule() {
PyObject * module = PyModule_Create(&module_def);
return module;
}
void runScript( const std::string& script,bool setArgv )
{
Py_SetPythonHome( L"C:\\dev\\vobs_sde\\sde\\3rdparty\\tools_ext\\python\\python38" );
PyImport_AppendInittab("mymodule",&PyInit_mymodule);
// Initialize the Python Interpreter
Py_Initialize();
wchar_t** _argv = (wchar_t**) PyMem_Malloc(0);
if ( setArgv )
PySys_SetArgv(0,_argv);
FILE* file = NULL;
fopen_s(&file,script.c_str(),"r");
if ( file )
{
PyRun_SimpleFile(file,script.c_str());
fclose(file);
}
PyMem_Free( _argv );
Py_Finalize();
}
int main( int argc,char* argv[] )
{
std::fstream file1;
file1.open( "mainfile.py",std::ios_base::out );
file1 << "import mymodule" << std::endl;
file1 << "mymodule.test()" << std::endl;
file1.close();
runScript( "mainfile.py",false );
std::fstream file2;
file2.open( "importing.py",std::ios_base::out );
file2 << "import mainfile" << std::endl;
file2.close();
runScript( "importing.py",false );
runScript( "importing.py",true );
return 0;
}
输出它:
Hello World!
Traceback (most recent call last):
File "importing.py",line 1,in <module>
import mainfile
ModuleNotFoundError: No module named 'mainfile'
Hello World!
这表明未调用PySys_SetArgv
时,从mainfile.py
导入importing.py
失败。为什么?这是Python错误还是强制性调用此函数?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)