python 스크립트에서 STDIN을 읽는 데 이상한 문제가 있습니다.STDIN에서 올바르게 읽을 수 없습니다
여기가 나의 사용 사례입니다. rsyslog가 출력 모듈로 구성되어있어 rsyslog가 로그 메시지를 파이썬 스크립트로 파이프 할 수 있습니다.
내 파이썬 스크립트는 정말 간단하다 :
#! /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
을 실행하면 내가 대상 파일 /tmp/testrsyslogomoutput.txt
에 "foo는"을 얻을 수 있습니다. 그러나 내가 rsyslog 내에서 실행할 때, 메시지가 rsyslog를 중지/재시작 할 때만 전송 된 것으로 보입니다. (어떤 점에서는 일부 버퍼가 플러시됩니다.)
처음에는 Rsyslog에 문제가 있다고 생각했습니다. 그래서 필자는 Python 프로그램을 rsyslog 구성을 변경하지 않고 쉘 1로 대체했습니다. 쉘 스크립트를 위해 rsyslog와 함께 완벽하게 작동하고 아래의 코드에서 볼 수 있듯이, 스크립트는 정말 간단하다 : 내 쉘 스크립트가 작동하지만 내 파이썬 하나하지 않기 때문에
#! /bin/sh
cat /dev/stdin >> /tmp/testrsyslogomoutput.txt
가, 내가 어딘가에서 실수를 믿는다 내 파이썬 코드하지만 어디에서 찾을 수 없습니다. 내 실수를 저에게 지적하면 좋을 것입니다. 이 파일을 읽는 완료 될 때까지
나는 당신이 제안한 것을 시도해 보았지만 아무런 차이가 없다. 이 사소한 쉘 스크립트로도 여전히 완벽하게 작동합니다. 또한/dev/stdin 내 python 스크립트에서 (readlines()없이) 읽으려고했는데 여전히 중단됩니다. –
오 잘. 다음 생각 : python의 I/O를 -u 플래그로 python을 호출하여 방정식 밖으로 버퍼링하십시오. – alexis
Alexis에게 도움을 주셔서 감사합니다. 파이썬 -u로 시도해 보았지만 아무 것도 변경하지 않았습니다. –