Вызов подпроцесса Python ничего не возвращает или зависает даже после долгого времени - PullRequest
0 голосов
/ 08 января 2019

Я хочу получить размер несжатого файла tar.gz, размер которого превышает 4 ГБ. Я нашел команду оболочки, чтобы сделать то же самое, и команда оболочки работает отлично. Но когда я использую ту же команду в моей программе на Python, она никогда не завершается.

Я запускаю скрипт на RHEL 6.8.

Команда для получения правильного размера несжатого файла

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

Мой скрипт на питоне

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 брал около 27 ГБ 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...