Если вы введете *
в bash, оболочка раскроет его до файлов в указанном каталоге перед выполнением команды.Popen в Python не делает ничего подобного, поэтому то, что вы делаете, когда вызываете Popen таким образом, говорит grep, что в каталоге data
есть файл *.txt
вместо всех файлов .txt
в data
каталог.Этот файл не существует, и вы получите ожидаемую ошибку.
Чтобы решить эту проблему, вы можете указать python запустить команду через оболочку, передав shell=True
в Popen:
subprocess.Popen('grep -i --line-buffered grave data/*.txt', shell=True)
Который переводится на:
subprocess.Popen(['/bin/sh', '-c', 'grep -i --line-buffered "grave" data/*.txt'])
Как объяснено в документации Popen
.
Вы должны использовать строку вместо списка здесь, потому что выхочу выполнить /bin/sh -c "grep -i --line-buffered "grave" data/*.txt"
(обратите внимание на кавычки вокруг команды, сделав ее единственным аргументом sh
).Если вы используете список, эта команда запускается: /bin/sh -c grep -i --line-buffered "grave" data/*.txt
, что дает вам вывод простого запуска grep
.