2

subprocess.Popen を介して起動され、subprocess.PIPE を介して接続された他のプログラムの出力を継続的に読み取る python プログラムがあります。

私が直面している問題は、起動したプログラムからの出力のかなりの部分が時々失われることです。

たとえば、パイプを介して inotify イベントを監視すると、inotifywait多くのイベントが失われます。

これは関連する機能です:

    process = subprocess.Popen(["inotifywait", "-q", "-r", "-m",
      "--format", "%e:::::%w%f", srcroot], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    ポーリング = select.poll()
    polling.register(プロセス.stdout)
    process.stdout.flush()

    True の間:
        process.stdout.flush()
        polling.poll(max_seconds*1000) の場合:
            行 = process.stdout.readline()
            len(行) > 0 の場合:
                印刷行[:-1]

コマンドinotifywait -q -r -m --format %e:::::%w%f /opt/fileserver/ > /tmp/log1を実行し、(inotify イベントを生成するために) ファイルを移動すると、8000 行を超えるファイルが生成されます。一方、my を使用./pscript.py > /tmp/log2すると、約 5000 行のファイルが得られます。

4

1 に答える 1

1

あなたの例では stderr を完全に無視しています。次のようなプロセスを作成してみてください。

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

さらに、 inotifywait でプロセスを生成するのではなく、Pythonバインディングの 1 つで inotify を直接使用します。

于 2015-08-02T10:13:32.433 に答える