【问题标题】:Popen piping 2 cmd hanging and not giving expected resultPopen管道2 cmd挂起并且没有给出预期的结果
【发布时间】:2016-05-13 09:51:25
【问题描述】:

我正在尝试使用 grep 并将其通过管道传输到 uniq 以获得独特的结果...(在此处获取 ip 地址)

process = subprocess.Popen(['grep','-sRIEho', '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', '/tmp/test'])
p2 = subprocess.Popen(['uniq'],stdin=process.stdout)    
stdout,stderr = p2.communicate()

问题是它挂起并且没有向我显示独特的结果...... 这是“/tmp/test”文件:

127.0.0.1
127.0.0.1
127.0.0.1
1.9.12.12
192.168.1.2
192.168.1.2
192.168.1.3
192.168.1.4

结果很好......它是一样的 知道这里发生了什么吗? 顺便说一句,我不能在这里使用 Shell=True(用户提供的文件名)

【问题讨论】:

    标签: python linux grep subprocess


    【解决方案1】:

    .communicate() 返回None,除非您通过PIPE,即在您的示例中stdoutstderr 始终为None。此外,您应该关闭父级中的process.stdout,以便grep 知道uniq 是否过早死亡。它没有解释为什么grep“挂起”。问题可能是 grep 参数,例如 -R(递归,遵循符号链接)。

    尝试How do I use subprocess.Popen to connect multiple processes by pipes? 的可行解决方案,例如:

    #!/usr/bin/env python3
    from subprocess import Popen, PIPE
    
    with Popen(['uniq'], stdin=PIPE, stdout=PIPE) as uniq, \
         Popen(['grep'] + grep_args, stdout=uniq.stdin):
        output = uniq.communicate()[0]
    

    或者:

    #!/usr/bin/env python
    from plumbum.cmd import grep, uniq  # $ pip install plumbum
    
    output_text = (grep[grep_args] | uniq)()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2014-10-16
      相关资源
      最近更新 更多