【问题标题】:Store value of os.system or os.popen存储 os.system 或 os.popen 的值
【发布时间】:2011-02-18 12:47:09
【问题描述】:

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

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

我得到了命令是否有效的返回码。当我使用时:

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

我知道命令试图做什么。

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

谁能在 Python 中提出另一种方法来让我保存这个 bash 命令的值?

谢谢

【问题讨论】:

    标签: python bash operating-system


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      首先像你一样使用 popen 打开一个管道。

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

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

      output = p.readline()
      

      这将是一个字符串,因此您仍然需要进行一些额外的解析,但这应该不是问题。

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

      【讨论】:

      【解决方案3】:

      您可能正在寻找:

      grep -c 'ERROR' log.txt
      

      通常要生成子进程,您需要使用subprocess 模块。例子很多,相信你不会迷路的。

      【讨论】:

      • bash 很好,我想将输出保存到 Python 中的变量
      【解决方案4】:

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

      请参阅Capturing system command output as a string 以了解适用于 Python check_output() 的实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2015-05-20
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多