непрерывный цикл в построчную обработку стандартного вывода подпроцесса - PullRequest
0 голосов
/ 28 марта 2019

В Python 3.7, какие конкретные изменения необходимо внести в приведенный ниже код, чтобы цикл успешно завершился после завершения работы subprocess?

Следующий код запускает подпроцесс и печатает каждую строку. Но проблема в том, что цикл while true никогда не завершается, потому что консоль продолжает печатать b'' в каждой новой строке до тех пор, пока я не перезагружу машину.

import subprocess  
proc = subprocess.Popen('python name-of-script.py',cwd="C:\\path\\to\\directory",stdout=subprocess.PIPE)  
while True:  
  line = proc.stdout.readline()
  if line != '':  
    #the real code does filtering here  
    print(line)
  else:
    break

После значимого вывода терминал продолжает печатать следующее:

b''
b''
b''
b''
b''
b''
b''
b''
b''
b''
b''
b''  

Ответы [ 2 ]

1 голос
/ 28 марта 2019

При создании объекта Popen вы получаете поток байтов как stdout.

Это объясняется в документации

Если были заданы аргументы encoding или errors или аргумент universal_newlines был True, поток является текстовым потоком, в противном случае это поток байтов.

Поэтому, когда вы сравниваете line с пустой строкой , она всегда будет неравной, поскольку line в лучшем случае может быть пустым byte объектом, b''.

Пустой байтовый объект является ложным значением, поэтому замена if line != '' на if line: работает как для пустой строки, так и для пустого байтового объекта.

Если позже вы захотите, чтобы stdout был текстовым потоком, код не нарушается:)

while True:  
   line = proc.stdout.readline()
   if line:  
       #the real code does filtering here  
       print(line)
   else:
       break
0 голосов
/ 28 марта 2019

Это потому, что вы сравниваете яблоки с грушами.

'' - это не то же самое, что b''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...