, потому что команда, которую вы запускаете, выдает сообщения об ошибках в стандартный поток ошибок.
check_output
захватывает только стандартный вывод , если только вы не используете дополнительный параметр.Так что либо:
subprocess.check_output(command.split(),stderr=subprocess.STDOUT)
, поэтому ошибки также выводятся, либо (python 3):
subprocess.check_output(command.split(),stderr=subprocess.DEVNULL)
для полного подавления этого сообщения об ошибке.
Чтобы получитьПравильное сообщение об исключении со стандартной ошибкой, вы должны будете перенаправить поток ошибок в конкретный канал, чтобы у вас не было stderr=None
subprocess.check_output(command.split(),stderr=subprocess.PIPE)
Но это могло бы вызвать взаимные блокировки между выходными потоками и потоками ошибок (в зависимости от того, как программа выводит на выход или на ошибку, если каналы не читаются умным способом (например, с многопоточностью), одна запись может блокироваться из-за переполнения буфера, пока вы читаете другую, которая пуста).
Может быть, в вашем случае вам лучше использовать subprocess.Popen
и communicate
, которые прекрасно справляются с этим делом (с потоками или чем-то еще, что работает под ним)
p = subprocess.Popen(command.split(),stderr=subprocess.PIPE,stdout=subprocess.PIPE)
output,error = p.communicate()
(и сохраняйтета же обработка исключений)