2

我有一个 python 程序,我在其中不断读取通过 subprocess.Popen 启动并通过 subprocess.PIPE 连接的其他程序的输出

我面临的问题是它有时会丢失已启动程序的大部分输出。

例如,通过管道监视 inotify 事件以inotifywait丢失许多事件。

这是相关的功能:

    进程 = subprocess.Popen(["inotifywait", "-q", "-r", "-m",
      "--format", "%e:::::%w%f", srcroot], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    轮询 = select.poll()
    polling.register(process.stdout)
    process.stdout.flush()

    而真:
        process.stdout.flush()
        如果 polling.poll(max_seconds*1000):
            line = process.stdout.readline()
            如果长度(线)> 0:
                打印行[:-1]

执行命令inotifywait -q -r -m --format %e:::::%w%f /opt/fileserver/ > /tmp/log1并移动一些文件(以生成 inotify 事件)给出一个 >8000 行文件。另一方面,使用我./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)

此外,我会直接将 inotify 与它的一个 Python绑定一起使用,而不是使用 inotifywait 生成一个进程。

于 2015-08-02T10:13:32.433 回答