Python和C的管道:当我刷新时,Python不会从缓冲区中写入。
Python和C的管道:当我刷新时,Python不会从缓冲区中写入。
这是一项大学作业的一部分,但我遇到的问题与作业本身无关。
我有一个等待终端输入的C文件,其中有两个gets(info1)
和稍后的gets(info2)
。我使用缓冲写入器在Python中执行以下操作:
sys.stdout.buffer.write("Hello 1".encode("ascii")) sys.stdout.flush() sys.stdout.buffer.write("Hello 2".encode("ascii")) sys.stdout.flush()
然后,我有一个管道,将这些输出从Python代码发送到C程序的终端输入。当我运行命令时,我可以看到打印输出显示“Hello 1”和“Hello 2”都被发送到gets(info1)
。为什么会发生这种情况?由于我刷新了缓冲区,难道它不应该将第一个输入发送到终端,被C第一个gets(info1)
捕获,并将“Hello 2”捕获在第二个gets(info2)
中吗?我甚至在第一个刷新后引入了一个延迟函数,但它在睡眠后将两个输出都发送给了第一个gets(info1)
。管道显然是有效的,因为C程序能够获取由Python程序产生的终端输出。但是为什么我只能获取到第一个函数的输入,即使我在写入第一个字符串后刷新了缓冲区?
当我执行以下操作时:
sys.stdout.buffer.write("Hello 1".encode("ascii")) sys.stdout.buffer.write("\n".encode("ascii")) sys.stdout.flush() sys.stdout.buffer.write("Hello 2".encode("ascii")) sys.stdout.flush()
它可以正常发送。然而,我需要输出非常具体。
问题的原因是Python中的stdout会通过缓冲机制来提高性能,因此当使用print语句打印内容时,内容实际上并不会立即写入到输出流中,而是先存储在缓冲区中,直到缓冲区满或者程序结束时才会将缓冲区中的内容写入到输出流中。这就导致了在某些情况下,打印的内容可能不会按照预期的顺序出现。
解决方法是使用flush()函数来手动刷新缓冲区,将缓冲区中的内容立即写入到输出流中。另外,可以使用print语句的end参数来指定输出结束时的字符,默认情况下是换行符\n,可以将其修改为空字符串,这样就不会在输出结束时自动换行,而是需要手动刷新缓冲区。
以下是一个示例代码,展示了如何解决这个问题:
import sys # 打印内容到缓冲区 print("Hello, World!", end='', flush=True) # 手动刷新缓冲区 sys.stdout.flush()
通过使用flush()函数和修改print语句的end参数,我们可以确保打印的内容会立即写入到输出流中,从而解决了Python中stdout缓冲机制导致的顺序问题。