从命令行使用-u选项在二进制文件中进行Python管道处理

0 投票
2 回答
1311 浏览
提问于 2025-04-17 03:24

有没有一种方法可以在不让整个程序运行期间的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)

撰写回答