Как прервать интерпретатор Python, встроенный в приложение C ++ - PullRequest
0 голосов
/ 30 января 2019

У нас есть приложение C ++ QT, в него встроен python.Мы предоставили пользователю два интерфейса: 1. Выполнить файл 2. Остановить выполнение.Мы выполняем файл python в потоке без GUI, используя PyRun_FileExFlags.Мы хотели бы прервать выполнение файла Python (предположим, что файл Python имеет бесконечный цикл, он никогда не завершает выполнение).Как прервать?

Мы попробовали следующее 1. В основном потоке установить трассировку с помощью PyEval_SetTrace 2. (если пользователь нажал на Остановить выполнение) В функции обратного вызова трассировки мы установили ошибку "PyErr_SetString"

1: настройка функции трассировки

PyGILState_STATE state;
state = PyGILState_Ensure();                
PyEval_SetTrace(TraceHook, NULL);
PyGILState_Release(state);

2: функция трассировки

int TraceHook(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)
{
if (b_isInterrupted)
{
PyGILState_STATE state;
state = PyGILState_Ensure();
PyErr_SetString(PyExc_KeyboardInterrupt, "Python Interrupted.");
PyGILState_Release(state);
}
return 0;
}

Выполнение Python не прерывается.Я ожидаю, что выполнение Python прервется.

1 Ответ

0 голосов
/ 31 января 2019

PyEval_SetTrace влияет только на текущий поток .

Вы хотите PyErr_SetInterrupt.Он прерывает (как считает Python) основной поток независимо от вызывающего потока (который не должен беспокоиться о GIL).

...