подпроцесс python. Открыть с shell = False, - PullRequest
1 голос
/ 22 сентября 2019

Эта команда выполняется:

process_1     =  subprocess.Popen("gzip -dc " + infile + " > " + inter_file, 
                                  cwd                = base_dir,
                                  stdout             = subprocess.PIPE, 
                                  shell              = True,
                                  universal_newlines = True)
output, error = process_1.communicate()  

Теперь я хочу удалить shell=True (у меня много строк, подобных приведенным выше, и я подозреваю, что Shell = True вызывает утечку памяти):

process_1     =  subprocess.Popen(["gzip", "-dc", infile, ">", inter_file], 
                                  cwd                = base_dir,
                                  stdout             = subprocess.PIPE, 
                                  shell              = False,
                                  universal_newlines = True)
output, error = process_1.communicate() 

выход:

gzip:  > .gz: No such file or directory

gzip: blabla.txt: not in gzip format

, но blabla.txt равен inter_file: кажется, что установка Shell = False путает infile и inter_file.Как исправить?

PS общий ответ приветствуется.У меня есть 50 нечетных системных вызовов, как указано выше, которые мне нужно переформатировать для запуска в режиме Shell = False.

1 Ответ

3 голосов
/ 22 сентября 2019

> - это синтаксис оболочки , используемый для перенаправления вывода.Поэтому он будет интерпретироваться только при запуске команды в оболочке.

Если вам нужно придерживаться опции -c для gzip, а не архивировать файлы на месте, вы можете прочитать вывод в Python и записатьэто в файл:

process_1     =  subprocess.Popen(["gzip", "-dc", infile], 
                                  cwd                = base_dir,
                                  stdout             = subprocess.PIPE, 
                                  shell              = False,
                                  universal_newlines = True)
output, error = process_1.communicate() 

with open(inter_file, 'wb') as file_desc:
    file_desc.write(output)

Если вы уверены, что у вас достаточно места на диске, чтобы дважды поместить оригинальный файл на диск, хотя бы на мгновение вы можете сначала скопировать файл, а затем запуститьgzip без -c:

from shutil import copyfile

copyfile(infile, inter_file)
process_1     =  subprocess.Popen(["gzip", "-d", inter_file], 
                                  cwd                = base_dir,
                                  stdout             = subprocess.PIPE, 
                                  shell              = False,
                                  universal_newlines = True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...