如何从 C++ 启动 Python 线程?
How can I start a Python thread FROM C++?
请注意,我只能使用 Python 2.6。我有一个 Python 2.6 应用程序,它使用 C++ 多线程 API 库,该库由 boost-python 构建。我的用例只是从 C++ boost 线程执行 Python 函数回调,但尽管进行了许多不同的尝试并研究了所有可用的在线资源,但我还没有找到任何可行的方法。所有建议的解决方案都围绕着不同的功能组合:Py_Initialize*
、PyEval_InitThreads
、PyGILState_Ensure
、PyGILState_Release
但是在尝试了所有可能的组合之后,在实践中没有任何效果,例如
- Embedding Python in multi-threaded C++ applications with code here
- PyEval_InitThreads in Python 3: How/when to call it? (the saga continues ad nauseum)
因此,这个问题:我如何从 C++ 开始 运行 一个 Python 线程 ?我基本上想:创建它,运行 它带有 Python 目标函数对象,然后忘记它。
这可能吗?
根据您问题中的以下文字:
Run a Python thread from C++? I basically want to: create it, run it with a Python target function object and forget about it.
您可能会发现使用 sytem
:
简单地生成一个进程很有用
system("python myscript.py")
如果您需要包含参数:
string args = "arg1 arg2 arg3 ... argn"
system("python myscript.py " + args)
您应该从您的 init 例程中调用 PyEval_InitThreads
(并保留 GIL)。然后,您可以生成一个 pthread(使用 boost),并在该线程中调用 PyGILState_Ensure
,然后调用您的 python 回调(PyObject_CallFunction
?),释放任何返回值或处理任何错误(PyErr_Print
?),用PyGILState_Release
释放GIL,让线程死掉。
void *my_thread(void *arg)
{
PyGILState_STATE gstate;
PyObject *result;
gstate = PyGILState_Ensure();
if ((result = PyObject_CallFunction(func, NULL))) {
Py_DECREF(result);
}
else {
PyErr_Print();
}
PyGILState_Release(gstate);
return NULL;
}
OP 的答案 also answers this OP or DP (Derived:)). It clearly demonstrates how to start a thread from C++ that callbacks to Python. I have tested it and works perfectly though needs adaptation for pre-C++11. It uses Boost Python, is indeed an all inclusive 5* answer and the example source code is here。
请注意,我只能使用 Python 2.6。我有一个 Python 2.6 应用程序,它使用 C++ 多线程 API 库,该库由 boost-python 构建。我的用例只是从 C++ boost 线程执行 Python 函数回调,但尽管进行了许多不同的尝试并研究了所有可用的在线资源,但我还没有找到任何可行的方法。所有建议的解决方案都围绕着不同的功能组合:Py_Initialize*
、PyEval_InitThreads
、PyGILState_Ensure
、PyGILState_Release
但是在尝试了所有可能的组合之后,在实践中没有任何效果,例如
- Embedding Python in multi-threaded C++ applications with code here
- PyEval_InitThreads in Python 3: How/when to call it? (the saga continues ad nauseum)
因此,这个问题:我如何从 C++ 开始 运行 一个 Python 线程 ?我基本上想:创建它,运行 它带有 Python 目标函数对象,然后忘记它。
这可能吗?
根据您问题中的以下文字:
Run a Python thread from C++? I basically want to: create it, run it with a Python target function object and forget about it.
您可能会发现使用 sytem
:
system("python myscript.py")
如果您需要包含参数:
string args = "arg1 arg2 arg3 ... argn"
system("python myscript.py " + args)
您应该从您的 init 例程中调用 PyEval_InitThreads
(并保留 GIL)。然后,您可以生成一个 pthread(使用 boost),并在该线程中调用 PyGILState_Ensure
,然后调用您的 python 回调(PyObject_CallFunction
?),释放任何返回值或处理任何错误(PyErr_Print
?),用PyGILState_Release
释放GIL,让线程死掉。
void *my_thread(void *arg)
{
PyGILState_STATE gstate;
PyObject *result;
gstate = PyGILState_Ensure();
if ((result = PyObject_CallFunction(func, NULL))) {
Py_DECREF(result);
}
else {
PyErr_Print();
}
PyGILState_Release(gstate);
return NULL;
}
OP 的答案