Программа Kill запускается с помощью exec (open (file) .read ()) в python - PullRequest
0 голосов
/ 07 октября 2019

В моем коде я вызываю конвейер из интерфейса tkinter. Когда пользователь нажимает кнопку Run, весь конвейер начинает работать. Если выбраны определенные настройки, вызывается верхний уровень основного графического интерфейса, который запрашивает дополнительный файл. Это все работает, кроме случаев, когда нажата кнопка отмены или закрытое окно X. Верхний уровень закрывается, но программа продолжает работать. В конце концов он потерпит крах, потому что файл отсутствует. вызов sys.exit () не является решением, потому что тогда весь графический интерфейс пользователя закрывается, и я хочу, чтобы только определенный уровень верхнего уровня закрывался и останавливал работающий файл.

Как убить файл, запущенный с помощью exec (открыть (файл) .read ()) без уничтожения всей программы?

1 Ответ

2 голосов
/ 07 октября 2019

Честно говоря, вам, вероятно, вообще не следует использовать exec, но, если вы это сделаете, exec все еще работает в том же процессе и потоке, что и ваша основная программа, нет выхода из него, не убив основную программу.

Вы должны открыть его в другом процессе, подпроцессе или потоке. Поскольку ваш exec, похоже, выполняет код Python, вы можете просто использовать:

from subprocess import Popen
p = Popen(['python', filename'])

И затем он работает в фоновом режиме, ваш обычный процесс продолжается, и вы можете убить его в любой момент с помощью.

p.kill()

Это усложняется, если вы хотите, чтобы этот процесс вводил данные или считывал их результаты, но это вопрос другого вопроса. Вы можете начать здесь, чтобы увидеть, как читать выходные данные: Сохранить выходные данные subprocess.Popen в строке

Небольшой пример для получения выходных данных будет выглядеть примерно так:

from subprocess import Popen, PIPE
p = Popen(['python', filename], stdout=PIPE, stderr=PIPE)
output, errors = p.communicate()

Однако это будет ждать, пока процесс завершит свою работу, поэтому, возможно, запустите все это из другого потока или найдите другой способ получить выходные данные (возможно, в файл журнала)

Обратите внимание, что я использовалпросто 'python' в Popen, если исполняемый файл python отсутствует в вашем пути или имеет другое имя, вы должны заменить его на полный путь к исполняемому файлу

...