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.