У меня есть странная проблема для чтения из STDIN в скрипте python.не может правильно прочитать STDIN
Вот мой прецедент. У меня rsyslog настроен с выходным модулем, поэтому rsyslog может передавать сообщения журнала на мой скрипт Python.
Мой Python скрипт действительно тривиальна:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
fd = open('/tmp/testrsyslogomoutput.txt', 'a')
fd.write("Receiving log message : \n%s\n" % ('-'.join(sys.stdin.readlines())))
fd.close()
Если я бегу echo "foo" | mypythonscript.py
я могу получить "Foo" в целевом файле /tmp/testrsyslogomoutput.txt
. Однако, когда я запускаю его в rsyslog, сообщения, кажется, отправляются только тогда, когда я останавливаю/перезапускает rsyslog (я считаю, что некоторый буфер в какой-то момент сбрасывается).
Сначала я подумал, что это проблема с Rsyslog. Поэтому я заменил мою программу python оболочкой, не меняя ничего на конфигурацию rsyslog. Скрипт работает отлично с Rsyslog и как вы можете видеть в коде ниже, сценарий действительно тривиален:
#! /bin/sh
cat /dev/stdin >> /tmp/testrsyslogomoutput.txt
Поскольку мой сценарий оболочки работает, но мой Python один не делает, я считаю, что я сделал ошибку где-то в мой код Python, но я не могу найти, где. Если бы вы могли указать мне на мою ошибку (и), это было бы здорово.
Заранее спасибо :)
Я пробовал то, что вы предлагали, это не имеет никакого значения. Он по-прежнему отлично работает с этим тривиальным сценарием оболочки. Я также попытался прочитать/dev/stdin в моем скрипте python (без readlines()), и он все еще зависает. –
О, хорошо. Следующая идея: взять буферизацию i/o из python из уравнения, вызвав python с флагом -u. – alexis
Спасибо за поддержку Alexis, я тоже пробовал с python -u и ничего не менял. –