2016-11-16 54 views
1

我想在Windows中使用HTML-PDF Web服务在Python 2.x中生成PDF。这个链接Python 2.x - Write binary output to stdout?说我需要修改二进制文件,如果我写它到标准输出。当我在Python 2.x中使用msvcrt时,为什么会出现IOError?

def generate_pdf(): 
    pdf = callservice(html) 
    if pdf is not None and sys.platform == "win32": 
     import os, msvcrt 
     msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 
    return pdf 

def process(): 
    pdf = generate_pdf() 
    # This comes as IOError Errno 12 not enough space 

E:\此程序运行的驱动器有10 GB可用。有谁知道会发生什么? C:\驱动器也有10 GB可用。我们是否应该检查msvcrt的源代码以查看正在发生的事情。我正在检查。

+1

您是否将PDF写入stdout,该文件已被重定向到驱动器'E:'或驱动器'C:'上的文件? – eryksun

+0

sys.stdout.fileno()只是1,我从shell运行这个脚本作为python file.py,这是否回答你的问题? – Nishant

+1

如果你不是将stdout重定向到磁盘文件,我没有理由将其改为二进制模式。 – eryksun

回答

1

answer原则上解释了发生了什么,追踪会显示一个确切的失败调用。

特别是,如果试图对sys.stdin.read()数据块进行大于32767字节的操作,将导致IOError“[Errno 12]空间不足”,因为没有足够的数据要读取。考虑在Windows 7上运行以下示例:

python -c "import sys; data = sys.stdin.read(32768)" 
+1

这是人们解释错误消息时的问题。 OP说这是一个'IOError'“没有磁盘空间”。但Windows CRT没有这样的信息。有'ENOMEM'(12,“空间不足”)和'ENOSPC'(28,“设备上没有剩余空间”)。 – eryksun

+1

您正在举一个'ENOMEM'的例子。显然你使用的是Windows 7或更早版本,它使用旧的ALPC控制台子系统。这会在conhost.exe和客户端进程python.exe之间建立一个64K共享堆。您尝试分配的读缓冲区大于共享堆中最大的可用区块,从而导致与内存有关的错误。 Windows 8 +有一个完全不同的控制台子系统,它使用驱动程序而不是ALPC,并没有这个问题。 – eryksun

+1

感谢您的更正,您的所有细节都是正确的。我的例子与这个问题没有多大关系。 – void

相关问题