Popen管道2厘米悬挂,没有给出预期的结果

时间:2016-05-13 09:51:25

标签: python linux grep subprocess

我正在尝试使用grep并将其传递给uniq以获得独特的结果......(在这里greping 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(用户提供的文件名)

1 个答案:

答案 0 :(得分:0)

.communicate()会返回None,除非您通过PIPE,即stdoutstderr在您的示例中始终为None。此外,您应关闭父级中的process.stdout,以便grep知道uniq是否过早死亡。它没有解释为什么grep“挂起”。问题可能是grep args,例如-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)()