子进程写入文件时经常检查文件

Posted

技术标签:

【中文标题】子进程写入文件时经常检查文件【英文标题】:Frequently check a file while subprocess is writing to it 【发布时间】:2022-01-20 04:52:36 【问题描述】:

我有以下代码,其中 c++ 可执行文件 (run.out) 在运行时使用 std::cout 打印出一堆信息。此代码将run.out 的输出存储到storage.txt

storage = open("storage.txt", "w")
shell_cmd = "run.out" 
proc = subprocess.Popen([shell_cmd], stdout=storage, stderr=storage)

一旦subprocess 启动,我需要经常检查storage.txt 的内容,并根据刚刚存储在那里的内容来决定。我该怎么做?

【问题讨论】:

您是否需要将输出写入文件?如果没有,您可以使用subprocess 启动run.out 并捕获其输出。 Popen 特别允许您在生成标准输出时读取它。 子进程运行时读取storage.txt是什么意思? @kalatabe 我知道拥有stdout=subprocess .PIPE 要容易得多,但出于几个原因,我必须写入文件。 注意,写入文件(或管道)通常在操作系统级别缓冲。您可能必须先写几个 ko 才能在文件中看到任何内容... @MauriceMeyer 确切地说,当子进程正在写入它时,我想读取文件。 【参考方案1】:

您可以使用subprocess.poll() 立即返回并指示子进程是否仍在运行:

while proc.poll() is None:
    time.sleep(0.25)  # reads the content 4 times a seconds!
    data = open("storage.txt").read()
    if 'error' in data:
        print("failed ...")
        # somesomething ...

【讨论】:

以上是关于子进程写入文件时经常检查文件的主要内容,如果未能解决你的问题,请参考以下文章

在将输出写入文件时使用多处理显示来自子进程的实时输出

在文件中写入打印日志时,Python子进程在屏幕缓冲区中延迟

Windows 7 CreateProcess,子进程无法写入文件?

另一个进程使用的文件[重复]

多个线程同时写入多个文件 - 它正被另一个进程使用

子进程如何决定写入仅接受str的文件对象的编码