使用C ++编写的Python,为什么要导入模块才能使用PySys_SetArgv

问题描述

请考虑以下代码,这些代码从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 (将#修改为@)