перенаправить стандартный вывод из subprocess.check_call в функцию? - PullRequest
3 голосов
/ 30 марта 2011

Вызов subprocess.check_call() позволяет указать объект файла для stdout, но перед записью данных в файл я хотел бы построчно изменить их.

В настоящее время я перенаправляю вывод во временный файл (созданный tempfile.TemporaryFile(). После завершения check_call я построчно считываю этот временный файл, вносю изменения и записываю окончательный выходной файл.

Поскольку вывод большой, чистое решение в памяти неосуществимо, и я хотел бы изменить данные на лету и напрямую записать в окончательный выходной файл.

Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

2 голосов
/ 30 марта 2011
def check_call_modify(command, modifier_function, output_file)
    p = subprocess.Popen(command, stdout=subprocess.PIPE)
    for line in p.stdout:
        line = modifier_function(line)
        output_file.write(line)    
    p.wait()
    if p.returncode:
        raise subprocess.CalledProcessError(p.returncode, command)
    return p.returncode

, чтобы использовать его, передайте функцию для изменения каждой строки и файла.Приведенный ниже тупой пример сохранит результат ls -l в верхнем регистре в listupper.txt:

with open('listupper.txt', 'w') as f:
    check_call_modify(['ls', '-l'], operator.methodcaller('upper'), f)
0 голосов
/ 30 марта 2011

Python типизирован по утке, так что вы всегда можете обернуть свой файловый объект перед передачей его в check_call.

В этом ответе есть пример , который делает это для write(), но, если быть точным, вы, вероятно, также хотите обернуть writelines().

...