Хранить значение os.system или os.popen - PullRequest
3 голосов
/ 12 мая 2010

Я хочу извлечь ошибку из файла журнала и сохранить значение как ошибку. Когда я использую:

errors = os.system("cat log.txt | grep 'ERROR' | wc -l")

Я получаю код возврата, сработала команда или нет. Когда я использую:

errors = os.popen("cat log.txt | grep 'ERROR' | wc -l")

Я понимаю, что пытается сделать команда.

Когда я запускаю это в командной строке, я получаю 3, как количество ошибок.

Может кто-нибудь предложить другой способ в Python, который позволит мне сохранить значение этой команды bash?

Спасибо

Ответы [ 4 ]

6 голосов
/ 12 мая 2010

popen устарело. Вместо этого используйте подпроцесс . Например, в вашем случае:

p1 = Popen(["cat", "log.txt"], stdout=PIPE)
p2 = Popen(["grep", "ERROR"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
1 голос
/ 12 мая 2010

Сначала откройте канал, используя popen, как вы.

p = os.popen("cat log.txt | grep 'ERROR' | wc -l")

Теперь просто получите доступ к каналу, как обычный файл:

output = p.readline()

Это будет строка, так что вам все равно придется выполнить дополнительный анализ, но это не должно быть проблемой.

РЕДАКТИРОВАТЬ: Хорошо, похоже, начиная с Python 2.6, os.popen устарела. Таким образом, я откладываю свой ответ до того, кто ответил правильно, используя subprocess.Popen. Спасибо за это, ребята.

1 голос
/ 12 мая 2010

Вы, вероятно, ищете:

grep -c 'ERROR' log.txt

Как правило, для запуска подпроцесса вам необходимо использовать модуль subprocess. Есть много примеров, я уверен, что вы не потерялись.

0 голосов
/ 12 мая 2010

Сколько 'ERROR' в файле:

nerrors = open('log.txt').read().count('ERROR') # put whole file in memory

Сколько строк содержит 'ERROR':

nerrors = sum(1 for line in open('log.txt') if 'ERROR' in line) # line at a time

Если вы должны использовать буквальную строку bash, то в Python 2.7 +:

from subprocess import check_output as qx
nerrors = int(qx("cat your_file.txt | grep 'ERROR' | wc -l", shell=True))

См. Сохранение вывода системной команды в виде строки для реализации check_output() для Python <2.7. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...