Открытые и уничтожающие процессы на Mac - PullRequest
0 голосов
/ 01 мая 2019

Открытая программа не закрывается при вызове с помощью terminate () в macOS.

Я попытался открыть внешний файл через python, а затем закрыть его. Кажется, все работает, кроме как убить процесс (приложение) в macOS. Как это убить?

prog = subprocess.Popen(['open', FileName])
while True:
    if keyboard.is_pressed("q"):
         prog.terminate()
         break

1 Ответ

1 голос
/ 01 мая 2019

Не так просто.

В mac команда open выскочит из системы, чтобы найти приложение для запуска вашего файла, а это означает, что она выполнит fork-exec другого исполняемого файла в качестве нового процесса. Как только это будет сделано, команда open прекратит работу, оставив другой процесс запущенным (в фоновом режиме, как потерянный процесс).

Таким образом, используя контекст subprocess, вы увидите идентификатор процесса open, но не идентификатор процесса дочернего процесса, запущенного open. Кроме того, рассмотрим случай, когда open запускает каталог, который на Mac будет открываться как новое окно в Finder. Тогда у вас нет нового идентификатора процесса! Аналогично для других файлов, если приложение было вызвано уже запущенным до того, как вы вызвали open, и вместо этого оно предпочитает открывать новый файл на новых вкладках существующего процесса.

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

Редактировать

Это справочная страница из открытых. Вы можете использовать некоторые переключатели, чтобы запускать процесс до завершения дочернего процесса и так далее. Но, тем не менее, я не уверен, что вы можете убить дочерние процессы, убив open (зависит от того, удастся это или нет, зависит от множества факторов). Возможно, вам нужно выяснить идентификаторы процессов дочерних процессов и уничтожить их напрямую.

...