与 grep 一起使用时 Python 子进程调用卡住 |

Posted

技术标签:

【中文标题】与 grep 一起使用时 Python 子进程调用卡住 |【英文标题】:Python subprocess call stuck when used with grep | 【发布时间】:2019-01-08 09:15:47 【问题描述】:

我想获取大于 4GB 的 tar.gz 文件的未压缩文件大小。我找到了一个 shell 命令来做同样的事情,并且 shell 命令工作得很好。但是当我在我的 python 程序中使用相同的命令时,它永远不会完成。

我在 RHEL 6.8 上运行脚本。

获取正确的未压缩文件大小的命令

gzip -dc some_tar_gz.tar.gz | wc -c

我的python脚本

import subprocess
import shlex
from pprint import pprint

command_list = shlex.split("gzip -dc some_tar_gz.tar.gz | wc -c")
result = subprocess.Popen(command_list, stdout=subprocess.PIPE,   stderr=subprocess.PIPE, shell=True)
out, err = result.communicate()
pprint(out)

上面的 gzip 命令在 5 分钟内返回了未压缩的文件大小。 但是上面的 python 脚本即使在 1 小时后也没有返回任何结果。

编辑 1:

当我删除shell=True 并看到top 命令的结果时,python 进程占用了大约 27GB VIRT,之后该进程被自动终止。我遇到了问题,但我不知道如何解决。

【问题讨论】:

这是造成这种情况的 shell 管道。子流程文档概述了approach on how to replace that。它归结为使用两个 Popen 实例,一个用于管道的每一侧,使用第一个子进程的标准输出在第二个子进程的标准输入上。 How to run " ps cax | grep something " in Python?的可能重复 @shmee 谢谢,您的方法完美无缺。请将您的评论移至回答,以便我接受它作为正确答案。 我希望你能接受重复的标志。尽管有不同的 shell 命令,你的问题,resp。根本问题与我提到的问题几乎相同。除了复制 unutbu 对另一个问题的回答之外,我无能为力:) @shmee 我是新来的,但是如何接受重复的标志? 【参考方案1】:

工作代码,以防有人有同样的问题

import subprocess
import shlex
from pprint import pprint

command_list_1 = shlex.split("gzip -dc some_tar_file.tar.gz")
command_list_2 = shlex.split("wc -c")

p1 = subprocess.Popen(command_list_1, stdout=subprocess.PIPE)
p2 = subprocess.Popen(command_list_2, stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()

output = p2.communicate()[0]
pprint(output.rstrip())

【讨论】:

以上是关于与 grep 一起使用时 Python 子进程调用卡住 |的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 启动 openoffice 进程以使用子进程与 pyuno 一起使用

将 STARTF_USESTDHANDLES 标志与 CreateProcess() 一起使用时将套接字传递给子进程时出错

如何将 Shaka 打包器与 python 子进程调用一起使用?我收到此错误无效的流描述符名称/值对:

如何在 Python 中将 mv 命令与子进程一起使用

PoolProcessExecutor 和子进程 Python

带有管道的子进程调用[重复]