Python子进程调用不会返回任何内容,或者即使经过很长时间也不会卡住

时间:2019-01-08 09:15:48

标签: python subprocess gzip tar popen

我想获取tar.gz文件的未压缩文件大小,该文件大小大于4GB。我发现一个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分钟内返回了未压缩的文件大小。 但是,即使经过1小时,上述python脚本也没有返回任何结果。

编辑1:

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

编辑2:

工作代码

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())

1 个答案:

答案 0 :(得分:1)

在有人遇到相同问题的情况下工作代码

<style>
    .email-row {
    }
    .email-col-2 {
        width: 49%;
        display: inline-block;
    }
</style>

@component('mail::message')
<div class="email-row">
    <div class="email-col-2">
        @component('mail::button', ['url' => '453634', 'color' => 'light'])
            btn1
        @endcomponent
    </div>
    <div class="email-col-2">
        @component('mail::button', ['url' => '123', 'color' => 'green'])
            bnt2
        @endcomponent
    </div>
</div>

@endcomponent