Unix Popen.communicate не может сжать большой файл - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужно сжать файлы размером более 10 ГБ, используя python поверх команд оболочки, и поэтому решил использовать подпроцесс Popen.

Вот мой код:

outputdir = '/mnt/json/output/'
inp_cmd='gzip -r ' + outputdir

pipe = Popen(["bash"], stdout =PIPE,stdin=PIPE,stderr=PIPE)
cmd = bytes(inp_cmd.encode('utf8'))
stdout_data,stderr_data = pipe.communicate(input=cmd)

Он не распаковывает файлы в выходном каталоге. Есть выход?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Лучший способ - использовать subprocess.call () вместо subprocess.communicate ().

call () ожидает полного выполнения команды, в то время как в Popen () необходимо внешне использовать метод wait () для завершения выполнения.

0 голосов
/ 24 апреля 2019

Вы пробовали это так:

output_dir = "/mnt/json/output/"

cmd = "gzip -r {}".format(output_dir)

proc = subprocess.Popen(
    cmd,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    stdin=subprocess.PIPE,
    shell=True,
)

out, err = proc.communicate()
...