我不熟悉在C ++应用程序中嵌入python。如果以前曾经问过这个问题,请原谅我,即使我通过网络搜索完成了我的作业。
所以,这是我的问题。 如果我在应用程序的主线程中运行嵌入式python代码,一切运行正常。但是如果我在子线程(由主线程创建)中运行嵌入式python代码,一些python导入将无法工作。
我在这里做了一个小程序来演示:
#include <iostream>
#include <boost/python.hpp>
#include <boost/thread.hpp>
using namespace boost::python;
int threadFunc ( ){
PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
std::cout << "Py_GetProgramName: " << Py_GetProgramName() << std::endl;
std::cout << "Py_GetPath: " << Py_GetPath() << std::endl;
std::cout << "Py_GetExecPrefix: " << Py_GetExecPrefix() << std::endl;
object main_module = boost::python::import ( "__main__");
object main_namespace = main_module.attr("__dict__");
object objc_import = boost::python::import ( "objc" );
exec("a = 10\n", main_namespace);
exec("print a\n", main_namespace);
return 0;
}
int main( ){
Py_InitializeEx( 0 ); //
PyEval_InitThreads();
// Uncomment this will make the program work.
//object objc_import = boost::python::import ( "objc" );
PyEval_ReleaseLock();
boost::thread * theChildThread = new boost::thread (threadFunc);
while (1){
boost::this_thread::sleep( boost::posix_time::seconds(1) );
}
delete theChildThread;
Py_Finalize();
return 0;
}
当我尝试在threadFunc
中导入objc时代码失败object objc_import = boost::python::import ( "objc" );
通过实验不同的东西,我发现如果我在启动子线程之前在主线程中执行此操作,整个程序将起作用(请参阅main函数中的注释):
//Uncomment this will make the program work.
//object objc_import = boost::python::import ( "objc" );
我想知道那里发生了什么。反正有没有在主线程中导入objc,但仍然使子线程工作?
谢谢,