如何从C ++启动Python线程?

时间:2016-12-20 15:40:03

标签: python c++ multithreading boost-python

请注意,我不得不使用Python 2.6。我有一个Python 2.6应用程序,它使用一个用boost-python构建的C ++多线程API库。我的用例只是从C ++ boost线程执行Python函数回调,但尽管有许多不同的尝试和研究所有可用的在线资源,我还没有找到任何有效的方法。所有提议的解决方案都围绕着不同的功能组合:Py_Initialize*PyEval_InitThreadsPyGILState_EnsurePyGILState_Release但在尝试所有可能的组合后,在实践中没有任何作用,例如

因此,这个问题:如何从C ++ 启动并运行Python线程?我基本上想要:创建它,用Python目标函数对象运行它并忘记它。

这可能吗?

3 个答案:

答案 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