Как прервать интерпретатор Python, встроенный в приложение C++

У нас есть приложение 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 прервется.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
732
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Спасибо Дэвис, как прервать поток (который не является основным потоком), который выполняет PyRun_FileExFlags

srinivas M 31.01.2019 05:06

@srinivasM: Я не думаю, что Python знает больше, чем поток под названием Py_Initialize — можете ли вы сделать так, чтобы он был таким же?

Davis Herring 31.01.2019 05:10

Спасибо @Davis: это сработало для основного потока. Можете ли вы предложить, есть ли способ остановить другие потоки?

srinivas M 04.02.2019 12:45

@srinivasM: есть PyThreadState_SetAsyncExc, но я не знаю, как получить его аргумент id.

Davis Herring 04.02.2019 15:10

Другие вопросы по теме