私は、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
を実行した場合、私はターゲットファイル/tmp/testrsyslogomoutput.txt
に "foo" を得ることができます。しかし、私がrsyslog内でそれを実行すると、メッセージはrsyslogを停止/再開したときにのみ送信されたように見えます(ある時点でいくつかのバッファがフラッシュされると思います)。
まず、Rsyslogに問題があると考えました。だから私はrsyslogの設定に何も変更せずに、シェルのもので私のpythonプログラムを置き換えました。シェルスクリプトは、rsyslogのに完璧に動作し、あなたは以下のコードで見ることができるように、スクリプトは本当に簡単です:
#! /bin/sh
cat /dev/stdin >> /tmp/testrsyslogomoutput.txt
私のシェルスクリプトは動作しますが、私のPythonの1がないので、私は私がどこかでミスをしたと信じて私のPythonコードが見つかりませんでした。あなたが私の間違いを指摘することができればそれはすばらしいでしょう。事前に
感謝:)それはファイルの読み込みが完了するまで
あなたが提案したことを試しましたが、何の違いもありません。これは、この些細なシェルスクリプトでも完全に機能します。私もpythonスクリプト(readlines()なし)で/ dev/stdinから読み込もうとしましたが、それでもハングします。 –
ああ。次のアイデア:Pythonの-uフラグを付けてpythonを呼び出すことによって、PythonのI/Oバッファリングを式から外します。 – alexis
あなたのサポートのおかげでAlexis、私もpython -uで試して、何も変わっていません。 –