Python Popen - ждать против общения против CalledProcessError
продолжающийсяиз моего предыдущего вопроса Я вижу, что для получения кода ошибки процесса, который я породил через Popen в python, мне нужно вызвать wait () или общаться () (который можно использовать для доступа к атрибутам stdout и stderr Popen):
app7z = '/path/to/7z.exe'
command = [app7z, 'a', dstFile.temp, "-y", "-r", os.path.join(src.Dir, '*')]
process = Popen(command, stdout=PIPE, startupinfo=startupinfo)
out = process.stdout
regCompressMatch = re.compile('Compressing\s+(.+)').match
regErrMatch = re.compile('Error: (.*)').match
errorLine = []
for line in out:
if len(errorLine) or regErrMatch(line):
errorLine.append(line)
if regCompressMatch(line):
# update a progress bar
result = process.wait() # HERE
if result: # in the hopes that 7z returns 0 for correct execution
dstFile.temp.remove()
raise StateError(_("%s: Compression failed:\n%s") % (dstFile.s,
"\n".join(errorLine)))
тем не мениедокументы предупредить, чтоwait()
может зайти в тупик (когда stdout = PIPE, как здесь), в то время какcommunicate()
может переполниться. Так:
Как именно я должен использовать общаться? Будет ли это:
process = Popen(command, stdout=PIPE, startupinfo=startupinfo)
out = process.communicate()[0]
# same as before...
result = process.returncode
if result: # ...
не уверен насчет блокировки и ошибок памяти
Есть ли лучший / более питонный способ решения проблемы? я не думаю, чтоsubprocess.CalledProcessError
илиsubprocess.check_call/check_output
применить в моем случае - или они?ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не писал код, я текущий сопровождающий, следовательно, вопрос 3.
Связанные с:
Python popen команда. Подождите, пока команда не закончитсяПроверьте код возврата команды, когда подпроцесс вызывает исключение CalledProcessErrorждать процесса, пока все подпроцесс не закончится?Я на Windows, если это имеет значение - Python 2.7.8
Должен быть один - и желательно только один - очевидный способ сделать это