【问题标题】:Printing out subprocess when regex captures正则表达式捕获时打印出子进程
【发布时间】:2015-03-16 18:42:26
【问题描述】:

我在 python 中运行 bash 命令:

proc = subprocess.Popen(cmd)
proc.wait()

此 cmd 打印输出。但是我不希望它打印,除非它被一些正则表达式捕获。不知道该怎么做,因为这是我第一次使用subprocess

【问题讨论】:

  • 您也可以简单地将输出通过管道传输到 grep

标签: python regex subprocess


【解决方案1】:

您也可以将输出直接通过管道传输到 grep 等:

from subprocess import PIPE, Popen

p = Popen(["ps"], stdout=PIPE)
p2 = Popen(["grep", "chrome"],stdin=p.stdout, stdout=PIPE,universal_newlines=True)
p.stdout.close()

out,err = p2.communicate()
print(out)

 421 ?        00:00:03 chrome
 767 ?        00:00:02 chrome
 843 ?        00:00:04 chrome
 2788 ?        00:52:16 chrome
 2819 ?        00:00:00 chrome-sandbox
 2820 ?        00:00:00 chrome
 2827 ?        00:00:00 chrome-sandbox

【讨论】:

    【解决方案2】:

    你可以这样做:

    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = proc.communicate()
    

    要检查任何输出/错误,您可以在(out,err) 上应用您的正则表达式,然后打印您想要的任何内容。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      在简单的情况下,您应该能够使用subprocess.check_output 来获取调用结果。在 Python3 中,这将返回一个 bytes 对象。在 Python2 中,它像往常一样是 str

      # Python3
      result_in_bytes = subprocess.check_output(cmd)
      result = result_in_bytes.decode() # -> string
      
      # Python2
      result = subprocess.check_output(cmd)
      

      那么您应该能够在该字符串上运行您的正则表达式。

      【讨论】:

        【解决方案4】:

        模拟 shell 管道:

        #!/usr/bin/env python
        from subprocess import Popen, PIPE
        
        output = Popen("cmd | grep 'pattern'", shell=True,
                       stdout=PIPE).communicate()[0]
        

        没有外壳:

        #!/usr/bin/env python
        from subprocess import Popen, PIPE
        
        grep = Popen(['grep', 'pattern'], stdin=PIPE, stdout=PIPE)
        cmd_process = Popen(['cmd'], stdout=grep.stdin)
        output = grep.communicate()[0]
        cmd_process.wait()
        

        或者您可以在纯 Python 中过滤 cmd 的输出:

        #!/usr/bin/env python
        from subprocess import Popen, PIPE
        
        matched_lines = []
        cmd_process = Popen(['cmd'], stdout=PIPE)
        with cmd_process.stdout:
            for line in iter(cmd_process.stdout.readline, b''):
                if b'pattern' in line: # or re.match(br'pattern', line)
                    matched_lines.append(line)
        cmd_process.wait()
        

        【讨论】:

          猜你喜欢
          • 2021-02-24
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 1970-01-01
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多