#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. У меня возникла идея, что вы можете сохранять состояние демона во время процесса, и как только старый демон будет убит и появится новый демон, он получит состояние из хранилища