Подпроцесс Python для вызова команд Unix, вопрос о том, как хранится вывод - PullRequest
2 голосов
/ 25 марта 2011

Я пишу скрипт на python, который читает строку / строку, вызывает Unix, использует grep для поиска в файле запроса строк, содержащих эту строку, а затем печатает результаты.

from subprocess import call

for line in infilelines:

    output = call(["grep", line, "path/to/query/file"])
    print output
    print line`

Когда я смотрю на результаты, напечатанные на экран, я получаю список совпадающих строк из файла запроса, но я также получаю целые числа "1" и "0" в качестве выходных данных, а line никогда не печатается на экран. Я ожидаю получить строки из файла запроса, которые соответствуют моей строке, за которой следует строка, которую я использовал в своем поиске.

Ответы [ 3 ]

6 голосов
/ 25 марта 2011

вызов возвращает код возврата процесса.

Если вы используете Python 2.7, используйте check_output.

from subprocess import check_output
output = check_output(["grep", line, "path/to/query/file"])

Если вы используете что-либо до этого, используйте коммуникацию.

import subprocess
process = subprocess.Popen(["grep", line, "path/to/query/file"], stdout=subprocess.PIPE)
output = process.communicate()[0]

Это откроет канал для stdout, который вы можете прочитать при общении.Если вы тоже хотите использовать stderr, вам нужно добавить также «stderr = subprocess.PIPE».

Это вернет полный вывод.Если вы хотите разбить его на отдельные строки, используйте split.

output.split('\n')

Я полагаю, что Python позаботится о преобразовании конца строки для вас, но, поскольку вы используете grep, я собираюсь предположить, что вы 'в Unix, где окончание строки равно \ n.

http://docs.python.org/library/subprocess.html#subprocess.check_output

4 голосов
/ 26 марта 2011

Следующий код работает с Python> = 2.5:

from commands import getoutput
output = getoutput('grep %s path/to/query/file' % line)
output_list = output.splitlines()
0 голосов
/ 26 марта 2011

Почему вы хотите выполнить вызов на внешний grep, когда сам Python может это сделать?Это дополнительные издержки, и ваш код будет зависеть от установленной grep.Вот как вы делаете простой grep в Python с оператором "in".

query=open("/path/to/query/file").readlines()
query=[ i.rstrip() for i in query ]
f=open("file")
for line in f:
    if "line" in query:
        print line.rstrip()
f.close()
...