请注意,我不得不使用Python 2.6。我有一个Python 2.6应用程序,它使用一个用boost-python构建的C ++多线程API库。我的用例只是从C ++ boost线程执行Python函数回调,但尽管有许多不同的尝试和研究所有可用的在线资源,我还没有找到任何有效的方法。所有提议的解决方案都围绕着不同的功能组合:Py_Initialize*
,PyEval_InitThreads
,PyGILState_Ensure
,PyGILState_Release
但在尝试所有可能的组合后,在实践中没有任何作用,例如
因此,这个问题:如何从C ++ 启动并运行Python线程?我基本上想要:创建它,用Python目标函数对象运行它并忘记它。
这可能吗?
答案 0 :(得分:1)
根据您的问题中的以下文字:
从C ++运行Python线程?我基本上想要:创建它,用Python目标函数对象运行它并忘记它。
您可能会发现使用sytem
简单生成流程非常有用:
system("python myscript.py")
如果你需要包含参数:
string args = "arg1 arg2 arg3 ... argn"
system("python myscript.py " + args)
答案 1 :(得分:0)
您应该从初始化程序中调用PyEval_InitThreads
(并保留GIL)。然后,你可以产生一个pthread(使用boost),并在该线程中调用PyGILState_Ensure
,然后调用你的python回调(PyObject_CallFunction
?),释放任何返回的值或处理任何错误({{ 1}}?),用PyErr_Print
释放GIL,让线程死掉。
PyGILState_Release
答案 2 :(得分:0)
OP How to call Python from a boost thread?的答案也回答了这个OP或DP(Derived :))。它清楚地演示了如何从回调Python的C ++启动一个线程。 我已经测试过并且完美地工作虽然需要适应前C ++ 11。它使用Boost Python,确实是一个全包的5 *答案和example source code is here。