python - Popen 管道 2 cmd 挂起并且没有给出预期的结果

标签 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(用户提供的文件名)

最佳答案

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

尝试来自 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)()

关于python - Popen 管道 2 cmd 挂起并且没有给出预期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37206793/

相关文章:

linux - 在 Bash 中解析文件名

python - PyOpenGL glReadPixels 在创建最终指针后导致 ctypes 参数错误

python - 如何在Python中反转str(class)?

linux - 服务器更改允许脚本不起作用。这可能是因为 PHP.ini 不同吗?

linux - 在 Linux 中优化搜索

linux - AWK 的多个字段分隔符

python - NumPy:使用自定义数据类型时的数组分配问题

python - 2个不同的曲面图与matplotlib python

python - python线程运行中64兆 block 的来源是什么?

sed 中的正则表达式替换给定特定格式的 url 的一部分