Python, подпроцесс, канал и выберите

У меня есть программа на Python, где я постоянно читаю вывод другой программы, запущенной через subprocess.Popen и подключенной через subprocess.PIPE

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

Например, отслеживать события inotify через канал для inotifywait проигрывает много событий.

Это соответствующие функции:

    process = subprocess.Popen (["inotifywait", "-q", "-r", "-m", 
      "--format", "% e:::::% w% f", srcroot], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
    polling = select.poll ()
    polling.register (process.stdout)
    process.stdout.flush ()

    пока верно:
        process.stdout.flush()
        if polling.poll(max_seconds*1000):
            line = process.stdout.readline()
            если len (строка) > 0:
                строка печати [:-1]

Выполнение команды inotifywait -q -r -m --format %e:::::%w%f /opt/fileserver/ > /tmp/log1 и перемещение некоторого файла (для генерации событий inotify) дает файл>8000 строк. С другой стороны, используя мой ./pscript.py > /tmp/log2 дать файл с около 5000 строк.

1 ответ

Вы полностью игнорируете stderr в своем примере. Попробуйте создать процесс следующим образом:

process = subprocess.Popen(["inotifywait", "-q", "-r", "-m", 
  "--format", "%e:::::%w%f", srcroot], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

Кроме того, я бы использовал inotify напрямую с одной из его привязок Python, а не порождал процесс с inotifywait.

Другие вопросы по тегам