Какой смысл использовать ref-квалификатор `const &&`?

У меня был немного другой вкус той же проблемы со следующими требованиями:

  1. Захват и возврат сообщений STDOUT по мере их накопления в буфере STDOUT (т. е. в реальном времени). @vartec решил эту Pythonically с использованием генераторов и ключевым словом «yield» выше
  2. Распечатайте все строки STDOUT (, даже если процесс завершается до того, как буфер STDOUT может быть полностью прочитан )
  3. Не тратьте процессорные циклы на процесс на высокочастотном
  4. Проверьте код возврата подпроцесса
  5. Печать STDERR (раздельно из STDOUT), если мы получим ненулевой код возврата ошибки.

Я объединил и изменил предыдущие ответы, чтобы придумать следующее:

import subprocess
from time import sleep

def run_command(command):
    p = subprocess.Popen(command,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         shell=True)
    # Read stdout from subprocess until the buffer is empty !
    for line in iter(p.stdout.readline, b''):
        if line: # Don't print blank lines
            yield line
    # This ensures the process has completed, AND sets the 'returncode' attr
    while p.poll() is None:                                                                                                                                        
        sleep(.1) #Don't waste CPU-cycles
    # Empty STDERR buffer
    err = p.stderr.read()
    if p.returncode != 0:
       # The run_command() function is responsible for logging STDERR 
       print("Error: " + str(err))

Этот код будет выполнен так же, как и предыдущие ответы:

for line in run_command(cmd):
    print(line)
22
задан Niall 5 October 2014 в 19:34
поделиться