将子进程中的stdout和stderr写入命名管道时出错

2024-05-03 22:59:37 发布

您现在位置:Python中文网/ 问答频道 /正文

在Windows 10上,os.write(fifo, line)执行一次(我在命名管道上的接收进程得到它),然后它崩溃,得到以下结果:

os.write(fifo, line)
OSError: [Errno 22] Invalid argument

这是我简化的核心问题:

def run(cmd):
    fifo = os.open("\\\\.\\pipe\\LogPipe", os.O_WRONLY)
    proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr=subprocess.PIPE)
    while proc.poll() is None:
        line = proc.stdout.readline()
        if line.decode() != "":
            #print(line.decode()) #this works
            os.write(fifo, line)
            
    os.close(fifo)

if __name__ == "__main__":
    run(["python", "-u", "cpu_bound_process_emitting_stderr_and_stdout_messages.py"])

它看起来与stdout = subprocess.PIPE, stderr=subprocess.PIPE的设置有关,因为如果我跳过popen,我可以多次os.write(fifo, line)而不会出现问题;命名管道在两端都起作用

有人知道我做错了什么吗?多谢各位