Unix Popen.communicate не может заархивировать большой файл

#python #unix #subprocess #gzip #popen

#python #unix #подпроцесс #gzip #popen

Вопрос:

Мне нужно архивировать файлы размером более 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)
  

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

Ответ №1:

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

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

Ответ №2:

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

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

Комментарии:

1. В чем разница между кодом, который я опубликовал, и тем, который вы предоставили? Очевидных изменений нет.

2. Мой ответ фактически передает команду ( cmd ) в Popen в качестве первого параметра. Он также использует shell=True . Вам следует прочитать Popen документы и взглянуть на соображения безопасности .

3. Пробовал, не работает.. Я думаю, это как-то связано с ожиданием или таймаутом.

4. Возникает ли TimeoutExpired исключение? Если нет, то, вероятно, это не так. Этот код работает и будет архивировать все файлы в каталоге. Вы пробовали запускать это в оболочке python?

5. Да, @Alex, я запустил его. Команда выполняется, но без какого-либо результата.