python вывод проверки подпроцесса: как получить все сообщение - PullRequest
0 голосов
/ 28 мая 2020

Я использую subprocess.check_output для удаления папок в has oop и хотел бы получить такие же результаты, как если бы я выполнял команду had oop с консоли.

Итак, может случиться так, что я попытаюсь удалить несколько каталогов, некоторые из которых не существуют.

Эта команда полностью завершается с ошибкой (потому что мой «несуществующий» каталог не может быть найден) предотвратить сбой, который я могу сделать:

try:
    subprocess.check_output('hadoop fs -rm -r -skipTrash  my_host/path_to_existing_directory/ my_host/path_to_nonexisting_directory', shell = True)
except subprocess.CalledProcessError as e:
    print(e.output, 'some of the folders were not found')

Этот второй вариант лучше, поскольку он сообщает мне, какие из моих каталогов были удалены, если таковые имеются. И чтобы отличить guish от некоторых из них, я могу добавить в свою распечатку «некоторые папки не найдены».

Однако, когда я выполняю ту же команду из командной строки, я получаю более точную информацию, которую я хотел бы воспроизвести:

hadoop fs -rm -r -skipTrash  my_host/path_to_existing_directory/ my_host/path_to_nonexisting_directory

Возвращает:

Deleted my_host/path_to_existing_directory
rm: `my_host/path_to_nonexisting_directory': no such file or directory

1 Ответ

3 голосов
/ 28 мая 2020

Процесс может записывать сообщения об ошибках в стандартный поток ошибок поток stderr, который вы также можете записать, перенаправив его на стандартный вывод stdout с помощью параметра stderr=subprocess.STDOUT

Итак, ваш код будет выглядеть так:

try:
    output = subprocess.check_output('...', shell = True, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
    print(e.output, 'some of the folders were not found')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...