Catch stderr в subprocess.check_call без использования subprocess.PIPE

Я хотел бы сделать следующее:

  • выложить на другой исполняемый файл из Python, используя subprocess.check_call
  • поймать stderr дочернего процесса, если есть
  • добавьте вывод stderr в вывод исключения CalledProcessError из родительского процесса.

Теоретически это просто. Функциональная подпись check_call содержит kwarg для stderr :

 subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) 

Однако, сразу ниже, в документации содержится следующее предупреждение:

Примечание . Не используйте stdout=PIPE или stderr=PIPE с этой функцией. Поскольку трубы не читаются в текущем процессе, дочерний процесс может блокироваться, если он генерирует достаточный вывод в канал для заполнения буфера для буфера OS.

Проблема в том, что почти каждый пример, который я могу найти для получения stderr из дочернего процесса, упоминает использование subprocess.PIPE для захвата этого вывода.

Как вы можете захватить stderr из дочернего процесса без использования subprocess.PIPE ?

One Solution collect form web for “Catch stderr в subprocess.check_call без использования subprocess.PIPE”

stdout и stderr могут быть привязаны ко всему, что может принимать данные, такие как файл-дескриптор. вы можете даже предоставить открытую file_handle для записи в stdout и stderr :

 file_handle = open('some_file', 'w') subprocess.check_call(args, *, stdin=None, stdout=file_handle, stderr=file_handle, shell=False) 

теперь каждая строка выводится в тот же файл, или у вас может быть другой файл для каждого.

stdin также читается как дескриптор файла, используя next() для чтения каждой строки в качестве команды ввода для отправки в дополнение к начальным args .

его очень надежная функция.

Python - лучший язык программирования в мире.