Eav*_*own 35 python binary stdout
有没有办法在Python 2.x中将二进制输出写入sys.stdout?在Python 3.x中,您可以使用sys.stdout.buffer(或分离stdout等等),但我无法找到任何Python 2.5/2.6的解决方案.
编辑,解决方案:来自ChristopheD的链接,如下:
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
Run Code Online (Sandbox Code Playgroud)
编辑:我正在尝试将PDF文件(二进制形式)推送到stdout以便在Web服务器上提供服务.当我尝试使用sys.stdout.write编写文件时,它会将各种回车符添加到二进制流中,导致PDF呈现损坏.
编辑2:对于这个项目,遗憾的是我需要在Windows Server上运行,因此Linux解决方案已经完成.
Simply Dummy示例(从磁盘上的文件读取,而不是动态生成,只是因为我们知道生成代码不是问题):
file = open('C:\\test.pdf','rb')
pdfFile = file.read()
sys.stdout.write(pdfFile)
Run Code Online (Sandbox Code Playgroud)
Chr*_*heD 29
你在哪个平台?
如果你在Windows上,你可以试试这个食谱(无论如何,链接表明它是Windows特定的).
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
Run Code Online (Sandbox Code Playgroud)
在网上有一些参考文献,在Python 3.1中有/应该是一个函数以sys.stdout二进制模式重新打开但我真的不知道是否有比Python 2.x更好的替代方案.
您可以使用无缓冲模式:python -u script.py.
-u Force stdin, stdout and stderr to be totally unbuffered.
On systems where it matters, also put stdin, stdout and stderr
in binary mode.
在Python 2.x中,默认情况下所有字符串都是二进制字符数组,所以我相信你应该能够做到
>>> sys.stdout.write(data)
Run Code Online (Sandbox Code Playgroud)
编辑:我已经证实了你的经验.
我创建了一个文件gen_bytes.py
import sys
for char in range(256):
sys.stdout.write(chr(char))
Run Code Online (Sandbox Code Playgroud)
另一个read_bytes.py
import subprocess
import sys
proc = subprocess.Popen([sys.executable, 'gen_bytes.py'], stdout=subprocess.PIPE)
res = proc.wait()
bytes = proc.stdout.read()
if not len(bytes) == 256:
print 'Received incorrect number of bytes: {0}'.format(len(bytes))
raise SystemExit(1)
if not map(ord, bytes) == range(256):
print 'Received incorrect bytes: {0}'.format(map(ord, bytes))
raise SystemExit(2)
print "Everything checks out"
Run Code Online (Sandbox Code Playgroud)
将它们放在同一目录中并运行read_bytes.py.果然,似乎Python实际上是在输出上转换换行符.我怀疑这只发生在Windows操作系统上.
> .\read_bytes.py
Received incorrect number of bytes: 257
Run Code Online (Sandbox Code Playgroud)
在ChristopheD的带领下,将gen_bytes更改为以下内容可以解决问题.
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
for char in range(256):
sys.stdout.write(chr(char))
Run Code Online (Sandbox Code Playgroud)
我把它包括在内是为了完整性.ChristopheD值得赞扬.
您可以使用argopen .argopen(),它将dash作为stdin/stdout处理,并修复Windows上的二进制模式.
import argopen
stdout = argopen.argopen('-', 'wb')
stdout.write(some_binary_data)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18835 次 |
| 最近记录: |