У нас есть приложение C++ QT, мы встроили в него python. Мы предоставили пользователю два интерфейса 1. Запустить файл 2. Остановить выполнение. Мы выполняем файл Python в потоке без графического интерфейса, используя 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 прервется.






PyEval_SetTrace влияет только на текущий поток.
Вы хотите PyErr_SetInterrupt. Он прерывает (то, что Python считает) основной поток независимо от вызывающего потока (которому не нужно беспокоиться о GIL).
@srinivasM: Я не думаю, что Python знает больше, чем поток под названием Py_Initialize — можете ли вы сделать так, чтобы он был таким же?
Спасибо @Davis: это сработало для основного потока. Можете ли вы предложить, есть ли способ остановить другие потоки?
@srinivasM: есть PyThreadState_SetAsyncExc, но я не знаю, как получить его аргумент id.
Спасибо Дэвис, как прервать поток (который не является основным потоком), который выполняет PyRun_FileExFlags