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可能更容易,但由于这些东西都应该是兼容的,我想我会尝试通过它来证明它可以完成.
如果有人想知道,这也与我几天前提出的问题有关.
所以我会尝试更新我原来的问题,并附上一些关于我到目前为止已经弄清楚的内容.
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)
小智 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模块.
| 归档时间: |
|
| 查看次数: |
30664 次 |
| 最近记录: |