p=subprocess.Popen(["ls", "-l", "*.out"], stdout = subprocess.PIPE, shell=True)
вызывает
/bin/sh -c ls -l *.out
будет исполнено.
Если вы попробуете эту команду в каталоге, вы увидите - в типичной манере мистификации - все файлы перечислены. И флаг -l
также игнорируется. Это ключ.
Видите ли, флаг -c
поднимает только ls
. Остальные аргументы съедаются /bin/sh
, а не ls
.
Чтобы эта команда работала прямо на терминале, вам нужно набрать
/bin/sh -c "ls -l *.out"
Теперь / bin / sh видит полную команду "ls -l * .out" в качестве аргумента для флага -c
.
Таким образом, для правильной работы с помощью subprocess.Popen
лучше всего просто передать команду в виде одной строки
p=subprocess.Popen("ls -l *.out", stdout = subprocess.PIPE, shell=True)
output,error=p.communicate()
print(output)