从命令行使用-u选项在二进制文件中进行Python管道处理
有没有一种方法可以在不让整个程序运行期间的Python输出变成无缓冲状态的情况下,传入一个二进制文件?我只想通过命令行来操作,而不想用open(...,'rb')这种方式。看起来,-u选项似乎是唯一可以从命令行读取文件为二进制数据的方法。
http://docs.python.org/using/cmdline.html
-u 强制标准输入、标准输出和标准错误输出完全无缓冲。在某些系统上,这也会将标准输入、标准输出和标准错误输出设置为二进制模式。
2 个回答
0
这段代码会把标准输入(也就是你输入的内容)设置为无缓冲模式。这样一来,你就不需要在运行解释器的时候加上 -u
这个选项了。不过,这个功能只适用于Unix系统。
import fcntl, os, sys
def set_fd_nonblocking(fd):
u"put an open file descriptor into non-blocking I/O mode"
if fcntl.fcntl(fd, fcntl.F_SETFL, os.O_NONBLOCK) != 0:
raise IOError, "can't set file descriptor %s option O_NONBLOCK" % (fd,)
set_fd_nonblocking(sys.stdin.fileno())
不过,我不太确定这样做会有什么副作用,比如对 raw_input
这个内置函数会有什么影响。
要小心哦;即使在非阻塞模式下,如果 select
告诉你文件描述符(fd)可以读取了,你仍然需要捕捉 OSError
错误,并检查 e.errno == os.errno.EAGAIN
。这种错误应该被忽略。
1
你可以试着不用Python的文件模式,而是直接从sys.stdin
这个像文件一样的对象中获取文件号,然后用os.read()
来从中读取数据。
import os
import sys
stdin_no = sys.stdin.fileno()
some_bytes = os.read(stdin_no, 1024)