Py_NewInterpreter后PyRun_String提示空指针

新手上路,请多包涵

因为项目需求,需要建立多线程多python解释器,也就是每个线程中都要生成一个python解释器执行python脚本。
在查询资料后,我想着在主线程中初始化python并获取python主解释器状态信息,然后在每个子线程中生成python解释器,在将子解释器的状态信息交换到全局解释器状态信息中,这样就能执行python脚本。
简易代码如下:
主线程中,其中mainState是全局PyTheadState指针

Py_Initialize();
PyEval_InitThread();
*mainState = PyEval_SaveThread();

子线程中

PyEval_AcquireLock();// 获取全局锁
PyThreadState *subState = Py_NewInterpreter(); // 建立子解释器
PyEval_ReleaseLock();
...
PyEval_AcquireThread(subState);
PyRun_SimpleString(script); // script是脚本语句
PyEval_ReleaseThead(subState);

测试正常运行,但是实际中需要将C++类导出到Python中并且有些python语句需要检查返回值,我将子线程中的代码做一些修改

PyEval_AcquireLock();// 获取全局锁
PyThreadState *subState = Py_NewInterpreter(); // 建立子解释器
PyEval_ReleaseLock();
...
PyEval_AcquireThread(subState);
PyObject *subObject = PyImport_ImportModule("__main__");
//PyObject *subObject = PyImport_AddModule("__main__");
PyObject *subDict = PyModule_GetDict(mainObject);
PyRun_String(script, Py_file_input, subDict, subDict); // script是脚本语句
PyEval_ReleaseThead(subState);

就提示PyRun_String出错了。
我在单线程中调用

PyObject *subObject = PyImport_ImportModule("__main__");
//PyObject *subObject = PyImport_AddModule("__main__");
PyObject *subDict = PyModule_GetDict(mainObject);
PyRun_String(script, Py_file_input, subDict, subDict); // script是脚本语句

但是在多线程中调用却失败,可在Python文档中提及Py_NewInterpreter会生成子解释器独立的__main__模块,尽可能的和主线程中的却分开来,那么应该是可以获取子解释器的__main__模块的,是我使用方法出错了吗?

阅读 2.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题