2016-11-07 2 views
0

У меня есть некоторый код, как это:Запуск Grep через Python - не работает

f = open("words.txt", "w") 
subprocess.call(["grep", p, "/usr/share/dict/words"], stdout=f) 
f.close() 

Я хочу Grep словарь MacOs для определенного шаблона и записать результаты в words.txt. Например, если я хочу сделать что-то вроде grep '\<a.\>' /usr/share/dict/words, я бы запустил вышеуказанный код с p = "'\<a.\>'". Однако вызов подпроцесса не работает должным образом, и words.txt остается пустым. Любые мысли о том, почему это так? Кроме того, существует ли способ применить регулярное выражение к /usr/share/dict/words без вызова grep-subprocess?

редактировать: Когда я бегу grep '\<a.\>' /usr/share/dict/words в моем терминале, я получаю такие слова, как: аа объявления ае ах Ai ак аль утра ар в в аш топора ау, как выводит терминал (или файл, если я перенаправляю их там). Это то, что я ожидаю после words.txt после запуска вызова подпроцесса.

+1

Пожалуйста, предоставьте хотя бы один матч, который вы ожидаете. До сих пор я полагаю, что вы можете безопасно удалить символы '' 'и' \ ' из вашего шаблона. Вам не нужно скрывать символы, потому что вы не используете оболочку прямо сейчас. Ваш текущий вызов должен работать с дополнительным аргументом 'shell = True' – woockashek

+0

@woockashek добавил пример соответствия –

ответ

2

Как @woockashek уже прокомментировал, вы не получаете никаких результатов, потому что в вашем файле ввода нет ни одного из '\<a.\>'. Вероятно, вы, вероятно, надеетесь найти хиты для \<a.\>, но тогда, очевидно, вам нужно опустить одинарные кавычки, которые вас путают.

Конечно, Python прекрасно знает, как искать регулярное выражение в файле.

import re 

rx = re.compile(r'\ba.\b') 
with open('/usr/share/dict/words', 'Ur') as reader, open('words.txt', 'w') as writer: 
    for line in reader: 
     if rx.search(line): 
      print(line, file=writer, end='') 

одиночные кавычки здесь являются частью строки синтаксиса Python, так же, как и одиночные кавычки в командной строке, являются частью синтаксиса оболочки. В любом случае они не являются частью реального регулярного выражения, которое вы ищете.

subprocess.Popen документация туманно намекает на часто забывают тот факт, что оболочка цитирует не является необходимым или полезным, если вы не имеете shell=True (которые, как правило, следует избегать в любом случае, по этой и другим причинам).

Python, к сожалению, не поддерживает \< и \> в качестве операторов граничного слова, поэтому мы должны использовать (функционально эквивалентный) \b.

+0

спасибо! большое объяснение и пифонический пример –

-1

Стандартные входные и выходные каналы для процесса, инициированного вызовом(), привязаны к вводу и выходу родителя. Это означает, что вызывающая программа не может захватить вывод команды. Используйте check_output(), чтобы захватить выход для последующей обработки:

import subprocess 
f = open("words.txt", "w") 
output = subprocess.check_output(['grep', p ,'-1']) 
file.write(output) 
print output 
f.close() 

PD: Я надеюсь, что это работает, я не могу проверить ответ, потому что я не MacOS, чтобы попробовать.

+0

Вы можете привязать стандартный вывод к дескриптору открытого файла просто отлично; здесь не проблема. – tripleee

Смежные вопросы