从stdin读取二进制数据

the*_*eav 25 python python-2.x

是否可以在Python 2.6中将stdin读取为二进制数据?如果是这样,怎么样?

我在Python 3.1文档中看到这很简单,但在2.6中执行此操作的工具似乎并不存在.

如果3.1中描述的方法不可用,有没有办法关闭stdin并以二进制模式重新打开?

更新

为了清楚起见,我在MS-DOS shell中使用'type'来将二进制文件的内容传递给我的python代码.据我所知,这应该相当于Unix'cat'命令.但是当我测试它时,我总是比预期的文件大小少一个字节.

更新#2

首先,感谢所有的答案.我正在慢慢努力寻找一个真实可用的解决方案.最后,我仍然在尝试构建一个自包含的JAR文件,该文件执行我的Python代码,自动传递所有未触及的命令行参数.

我之所以使用Java/JAR/Jython路由,是因为我的一个主外部库只能作为Java JAR使用.但不幸的是,我开始以Python开展工作.不久前将代码转换为Java可能更容易,但由于这些东西都应该是兼容的,我想我会尝试通过它来证明它可以完成.

如果有人想知道,这也与我几天前提出的问题有关.

从Eclipse打包和部署Jython程序

在这个问题中回答了一些问题.

所以我会尝试更新我原来的问题,并附上一些关于我到目前为止已经弄清楚的内容.

Pre*_*Nué 22

从文档(见这里):

默认情况下,标准流处于文本模式.要将二进制数据写入或读取,请使用基础二进制缓冲区.例如,要将字节写入stdout,请使用 sys.stdout.buffer.write(b'abc').

但是,正如在接受的答案中,使用a调用python -u是另一个强制stdin,stdout和stderr完全无缓冲的选项.有关详细信息,请参阅python(1)联机帮助页.

有关文本缓冲的更多信息,请参阅文档io,并使用sys.stdin.detach()从Python中禁用缓冲.

  • 该doc导致py3k文档,而不是OP想要处理的内容. (7认同)

ana*_*nik 13

以下是Linux/Windows Python 2/3兼容代码的最终剪切,用于从stdin读取数据而不会损坏:

import sys

PY3K = sys.version_info >= (3, 0)

if PY3K:
    source = sys.stdin.buffer
else:
    # Python 2 on Windows opens sys.stdin in text mode, and
    # binary data that read from it becomes corrupted on \r\n
    if sys.platform == "win32":
        # set sys.stdin to binary mode
        import os, msvcrt
        msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
    source = sys.stdin

b = source.read()
Run Code Online (Sandbox Code Playgroud)


Dan*_*nes 12

使用-u命令行开关强制Python 2将stdin,stdout和stderr视为二进制无缓冲流.

C:> type mydoc.txt | python.exe -u myscript.py
Run Code Online (Sandbox Code Playgroud)

  • 更简单的是,你需要做的就是:sys.stdin = os.fdopen(sys.stdin.fileno(),'rb',0)这将以无缓冲的'二进制'模式重新打开fd. (4认同)

小智 9

如果你仍然需要这个...这个简单的测试我曾经读过二进制文件,其中包含0x1A字符

import os, sys, msvcrt

msvcrt.setmode (sys.stdin.fileno(), os.O_BINARY)
s = sys.stdin.read()
print len (s)
Run Code Online (Sandbox Code Playgroud)

我的测试文件数据是:

0x23, 0x1A, 0x45
Run Code Online (Sandbox Code Playgroud)

如果不将stdin设置为二进制模式,则只要将0x1A视为EOF,此测试就会打印1.当然它只适用于Windows,因为它取决于msvcrt模块.