subprocess.Popen: различная буферизация для stdin, stdout, stderr? - PullRequest
3 голосов
/ 09 апреля 2011

Мне нужно установить поток stderr в Popen вызове с буферизацией строки.Я обнаружил аргумент bufsize, но он применяется ко всем файлам stdin, stdout и stderr.

Как настроить буферизацию для каждого файла по-разному?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2011

Я полагаю, вы используете PIPE для stderr?В этом случае, я думаю, вы можете сделать что-то вроде этого:

p = subprocess.Popen(..., stderr=subprocess.PIPE)
fd = p.stderr.fileno()
my_stderr = os.fdopen(os.dup(fd), 'rU', new_bufsize)
os.close(fd)
# use my_stderr from here on
1 голос
/ 01 января 2012

Если вы намереваетесь в конце концов записать stdout / stderr в файл и вам просто нужен небуферизованный вывод, вы можете использовать следующие:

LOG_FILE = codecs.open('somelog.txt', 'a', 'utf_8', buffering=0)

subprocess.Popen(ARGS, stdout = LOG_FILE, stderr = LOG_FILE).communicate()

Тогда используется буферизация для файла, в данном случае: без буферизации.

...