存储os.system或os.popen的值

时间:2010-05-12 09:20:32

标签: python bash operating-system

我想从日志文件中删除错误并将值保存为错误。当我使用时:

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

我得到命令工作与否的返回码。当我使用时:

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

我得到了命令试图做的事情。

当我在命令行中运行时,我得到3,因为有多少错误。

有人可以在Python中建议另一种允许我保存此bash命令值的方法吗?

由于

4 个答案:

答案 0 :(得分:6)

popen已弃用。请改用subprocess。例如,在您的情况下:

p1 = Popen(["cat", "log.txt"], stdout=PIPE)
p2 = Popen(["grep", "ERROR"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

答案 1 :(得分:1)

你可能正在寻找:

grep -c 'ERROR' log.txt

通常,为了生成子流程,您需要使用subprocess模块。有很多例子,我相信你不会迷路。

答案 2 :(得分:1)

首先使用popen打开管道。

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

现在只需像普通文件一样访问管道:

output = p.readline()

这将是一个字符串,所以你仍然需要做一些额外的解析,但这应该不是问题。

编辑:好的,似乎从Python 2.6开始,os.popen已被弃用。因此,我将答案推迟到使用subprocess.Popen正确回答的人。谢谢你们。

答案 3 :(得分:0)

文件中有多少'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))

有关Python的check_output()的实现,请参阅Capturing system command output as a string。 2.7。