Будет ли уничтожение скрипта Python, вызывающего процессы оболочки, также убивать процессы оболочки?

Если у меня есть такой код в файле this_script.py:

import subprocess
subprocess.Popen(["python", "another_script.py"])

и я звоню

python this_script.py

и убить процесс во время его работы, убьет ли он подпроцесс?

Изменить: я проверил это, и если this_script убит, подпроцесс продолжает работать. Есть ли способ убедиться, что фоновый процесс умирает, когда основной процесс Python умирает?


person Andrew    schedule 21.03.2016    source источник
comment
Почему бы не попробовать?   -  person Tymoteusz Paul    schedule 21.03.2016
comment
Ответ может быть разным на разных платформах, поэтому, как предлагает @TymoteuszPaul, вы должны попробовать сами, чтобы убедиться, как он работает на вашей платформе.   -  person Matt Jordan    schedule 21.03.2016
comment
Я протестировал его, продолжает работать, когда основной процесс убит (это на CentOS). Есть ли способ убедиться, что подпроцесс умирает, когда умирает основной процесс?   -  person Andrew    schedule 21.03.2016


Ответы (1)


Да, вы можете поймать KeyboardInterrupt и SystemExit и убедиться, что kill подпроцесс.

from subprocess import Popen

try:
    p = Popen(args)
    p.wait()  # wait for the process to finish
except KeyboardInterrupt,  SystemExit:
    p.kill()
    raise
person MaxNoe    schedule 21.03.2016
comment
Проблема с этим кодом в том, что Popen() работает асинхронно. Другими словами, основной процесс Python почти сразу завершается, и теперь у вас есть подпроцесс, работающий в фоновом режиме. Чтобы исправить это, вы можете добавить p.wait(). в блоке try или измените except .. на finally... Не уверен, что хочет ОП... - person Martin Tournoij; 21.03.2016