Как вы тривиально меняете скрипт Python для захвата всего, что написано в stdout, само по себе и его подпроцессах? - PullRequest
2 голосов
/ 27 сентября 2019

Предположим, у вас есть большой сценарий, который записывает в стандартный вывод во многих местах, как напрямую (с использованием функций Python, таких как print() или logging, который идет в stdout), так и косвенно, запуская subprocess записи, которые пишут в стандартный вывод.

Существует ли тривиальный способ перехвата всего этого стандартного вывода?

Например, если вы хотите, чтобы скрипт завершил отправку электронного письма со всеми его выводами.

Под «тривиальным» я подразумеваю постоянное, а не линейное изменение кода.В противном случае, я полагаю, вам придется вводить параметры перенаправления (и некоторую логику накопления) в каждый вызов subrprocess.Вы можете перехватить весь вывод самого скрипта, перенаправив sys.stdout, однако я не вижу похожего «универсального» тривиального решения для всех вызовов subprocess или вообще любого другого типа кода, который вы можете использоватьдля запуска этих подпроцессов.

Есть ли какое-либо такое решение, или нужно использовать скрипт бегуна, который будет вызывать этот скрипт Python как подпроцесс и захватывать все stdout из этого подпроцесса?

1 Ответ

1 голос
/ 27 сентября 2019

Вероятно, самый короткий способ сделать это, не специфичный для Python, - это использовать os.dup2() например:

f = open('/tmp/OUT', 'w')
os.dup2(f.fileno(), 1)
f.close()

Что он заменяет файловый дескриптор 1, которыйобычно будет вашим stdout.С файловым дескриптором f (который затем можно закрыть).После этого все пишет в stdout и в /tmp/OUT.Это дублирование наследуемо, подпроцессы имеют запись fd 1 в тот же файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...