2016-11-16 1 views
1

HTML-PDF Webサービスを使用してWindowsでPDFを生成しようとしています(Python 2.x)。このリンクPython 2.x - Write binary output to stdout?は、私が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ギガバイトを持っています。誰でも何が起こっているのか知っていますか? C:\ドライブにも10 GBの空き容量があります。ソースコードmsvcrtを調べて、何が起きているのかを確認する必要があります。私はそれを確認しようとしています。

+1

「E:」ドライブまたは「C:」ドライブのファイルにリダイレクトされたstdoutにPDFを書き込んでいますか? – eryksun

+0

sys.stdout.fileno()はちょうど1です、私はこのスクリプトをシェルからpython file.pyとして実行しますが、それはあなたの質問に答えますか? – Nishant

+1

stdoutをディスクファイルにリダイレクトしていない場合は、バイナリモードに変更する必要はありません。 – eryksun

答えて

1

このanswerは、原則として何が起こっているのかを説明しており、トレースバックは正確に失敗したコールを示します。

特に、32767バイトより大きいデータブロックsys.stdin.read()にしようとすると、読み取る十分なデータがないときにIOError "[Errno 12]スペースが足りません"が発生します。

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

これは、人々がエラーメッセージを言い換えたときの問題です。 OPはIOError "No Disk Space"と言っています。しかし、Windows CRTにはそのようなメッセージはありません。 'ENOMEM'(12、'スペース不足 ')と' ENOSPC'(28、 ''スペースが残っていません ')があります。 – eryksun

+1

あなたは 'ENOMEM'の例を挙げています。どうやら、古いALPCコンソールサブシステムを使用しているWindows 7以前を使用しています。これにより、conhost.exeとクライアントプロセスpython.exeの間に64Kの共有ヒープが設定されます。共有ヒープの使用可能なブロックのうち最大のものより大きい読み取りバッファを割り当てようとすると、メモリ関連のエラーが発生します。 Windows 8以降には、ALPCではなくドライバを使用する全く異なるコンソールサブシステムがあり、この問題は発生しません。 – eryksun

+1

訂正ありがとうございます、あなたはすべての詳細が正しいです。私の例は、この質問にはあまり関係しません。 – void

関連する問題