Python Popen grep - PullRequest
       26

Python Popen grep

5 голосов
/ 23 января 2012

Я бы хотел, чтобы Попен выполнил:

grep -i --line-buffered "grave" data/*.txt

При запуске из оболочки это дает мне желаемый результат. Если я начну в той же директории, где я тестирую grep, Python Repl и следую инструкции из документации , я получу то, что должно быть правильным списком аргументов для подачи Popen:

['grep', '-i', '--line-buffered', 'grave', 'data/*.txt']

Результат p = subprocess.Popen(args) равен

grep: data/*.txt: No such file or directory

и если я попытаюсь p = subprocess.Popen(args, shell=True), я получу:

Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

Любая помощь о том, как выполнить требуемый процесс? Я на MacOS Lion.

Ответы [ 2 ]

9 голосов
/ 23 января 2012

Если вы введете * в 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.

4 голосов
/ 23 января 2012

Проблема в том, что оболочка выполняет глобализацию файла: data / *. Txt

Вам нужно будет сделать это самостоятельно, например, с помощью модуля glob.

import glob
cmd_line = ['grep', '-i', '--line-buffered', 'grave'] + glob.glob('data/*.txt')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...