如果stdin包含EOF,如何知道stdin何时为空?

时间:2015-02-23 11:22:12

标签: python stdin cat

尝试在python中创建一个简单的cat克隆,

sys.stdout.write(sys.stdin.read())

我注意到这对于包含 CTRL + Z EOF / substitude character 0x1a的二进制文件(即python cat.py < binaryfile > supposed_copy)来说非常糟糕,因为这似乎会导致read()考虑其完成的工作。我不能简单地循环遍历代码以避免这种情况,因为很明显在某些时候stdin.read()将等到提供新输入,一旦达到输入的真正结束将不会发生。

那么,如何解决这个问题,即

  • 如何知道何时完全读取重定向到stdin的文件,或
  • 如何妥善处理?

3 个答案:

答案 0 :(得分:2)

您需要告诉Python以二进制模式打开stdinstdout。您可以使用-u选项执行此操作。例如

python -u cat.py < binaryfile > supposed_copy

请注意,这会使stdinstdout无缓冲。

答案 1 :(得分:2)

扩展this answer

if sys.platform == "win32":
    import msvcrt
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)

答案 2 :(得分:1)

有关如何确保将stdin / stdout打开为二进制文件的说明,请参阅Reading binary data from stdin