如何从 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_InitThreadsPyGILState_EnsurePyGILState_Release 但是在尝试了所有可能的组合之后,在实践中没有任何效果,例如

因此,这个问题:我如何从 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