Короткая версия: check_output
буферизует все выходные данные для возврата.Когда вы запускаете ls
, его стандартный вывод идет в буфер check_output
, а не в терминал.Когда вы выходите из оболочки, в которой вы находитесь в данный момент, вы получите все выходные сразу в виде одной строки Python.
Это приводит к вопросу, почему вы вместо этого получаете вспомогательную оболочку?выполнения содержимого cmd
?Во-первых, вы используете bash
неправильно;аргументом является файл для запуска, а не произвольная командная строка.Более правильной версией того, что вы делаете, будет
cmd = "printf 'xml files: %s\n' `find . -name '*.xml' | wc -l`"
subprocess.check_output(['/bin/bash', '-c', cmd])
или, если вы хотите, чтобы subprocess
запустил для вас оболочку вместо явного ее выполнения,
subprocess.check_output(cmd, shell=True)
Объединение аргумента списка с shell=True
почти никогда не является тем, что вам нужно.
Во-вторых, учитывая ваш исходный код, check_output
сначала пытается объединить ваш список в одну строку, которая затем присоединяется к sh -c
,То есть вы пытаетесь выполнить что-то вроде
sh -c /bin/bash "printf 'xml files: %s\n' `find . -name '*.xml' | wc -l`"
sh
run /bin/bash
, и ваша командная строка просто используется в качестве дополнительного аргумента для sh
, который для целей этого вопросамы можем предположить, что игнорируется.Таким образом, вы находитесь в интерактивной оболочке, стандартный вывод которой буферизуется, а не отображается, как описано в первой части этого ответа.