Размер попсового буфера подпроцесса - PullRequest
0 голосов
/ 03 июля 2018

Как я могу установить размер буфера popen или очистить его? У меня есть два сценария: ty2.py просто сделать две печати

#import sys
a, b = b'123', '123'
print(a)
print(b)

#print(sys.getsizeof(a)) #36
#print(sys.getsizeof(b)) #52

и t1.py вызывают скрипт t2.py, используя popen

import subprocess as sp
#pipe = sp.Popen(['stdbuf', '-o0', '-i0', '-e0', 'python3', '-u', 't2.py'], stdout=sp.PIPE, bufsize=2, universal_newlines=True)
pipe = sp.Popen(['python3', 't2.py'], stdout=sp.PIPE, bufsize=2)
#pipe.stdout.flush() #also doesn't work
print(pipe.stdout.read())

вывод: b "b'123 '\ n123 \ n"

мои данные должны поступать в режиме реального времени, и мне нужно выводить только последний отпечаток. Является ли это возможным? Нет никакой разницы, если я установлю bufsize 0, 1, 2 или даже 200: он читает обе распечатки (я знаю, что 0 означает отсутствие буфера, но я вижу полную буферизацию). Мне нужно ограничить это. stdbuf и -u также не работают.

1 Ответ

0 голосов
/ 04 июля 2018

Если вы действительно хотите последний отпечаток, вы можете попробовать:

   pipe = subprocess.Popen([<YOUR COMMANDS>], stdout=subprocess.PIPE, shell=True, 
   universal_newlines=True).communicate()[0]

   print(pipe.rstrip().split('\n')[-1])

Когда universal_newlines=True, поток будет текстовым потоком, в противном случае это поток байтов. Я не уверен, если вы хотите эту опцию.

...