подпроцесс python, перенаправляющий код выхода в файл

#python #subprocess

#python #подпроцесс

Вопрос:

Используя подпроцесс run()/ popen(), мы можем перенаправить stdout и stderr во внешний файл. Есть ли какой-нибудь способ также перенаправить код выхода?

Комментарии:

1. Как насчет r = subprocess.run(...) и записи r.returncode в файл на python?

2. Нет, потому что операционная система под ним работает не так.

3. Смотрите man wait(2) , и не используйте эту run функцию. Это удобная функция. Вы можете получить больше контроля над подпроцессом, используя Popen напрямую.

4. Если ваши подпроцессы можно изменять в исходном коде, вы можете перехватывать большинство сигналов завершения, быстро сохранять состояние и завершать работу с соблюдением сигнала. Знайте, что SIGKILL (9) не может быть перехвачен, и он уничтожает процесс независимо от того, в каком состоянии он находится.

5. @keith я имел в виду popen(). Я обновил вопрос. Спасибо

Ответ №1:

Просто прочитайте атрибут returncode возвращаемого объекта subprocess.run и запишите его в файл.

 import subprocess

r = subprocess.run(["ls"])
with open("returncode.txt", "w") as f:
    f.write(str(r.returncode))
 

Комментарии:

1. моя вызывающая функция может быть уничтожена во время выполнения subprocess.run(), есть ли какой-либо способ указать это в функции run()?

2. ну, насколько я знаю, если вызывающая функция будет уничтожена, программа, которую вы запускали с помощью подпроцесса, немедленно остановится и не выдаст код выхода @GauravPathak

3. returncode является целым числом. Он должен быть каким-то образом сериализован перед записью.

4. @GauravPathak Но не могли бы вы рассказать мне более подробно о том, как вызывающая функция «убивается»?

5. У меня возникла идея, что вы можете сохранять состояние демона во время процесса, и как только старый демон будет убит и появится новый демон, он получит состояние из хранилища