IOError: [Errno 12] Not enough space

見出しにつられた人、ごめんなさい。ここには解決方法は書いてない。

なかなかに謎めいた振る舞いがあって。Windows 版 CPython で、「バイナリモードを強制」する定石に、

1 import sys
2 
3 if sys.platform == "win32":
4     import os, msvcrt
5     msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
6     msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)

なんてのがあって。これがないと、コンソールの ANSI カラー制御とか効かない、とか色々あるのね。だから、必要な場合にはいつも必要、というものです、これ。

なんだけど、これの有無による「Not enough space」発生有無に遭遇し、してまた、その成功した対処の意味がまたわからない。

デバッグ目的で json.dumpsという話から。

 1 # -*- coding: utf-8 -*-
 2 import sys
 3 
 4 if sys.platform == "win32":
 5     import os, msvcrt
 6     msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
 7     msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
 8 
 9 d = {}  # 大きな辞書
10 t = [u"あ", u"い", u"う", u"え", u"お"]
11 
12 for i in range(2**11):
13     k1 = i % 64
14     k2 = i % len(t)
15     if k1 not in d:
16         d[k1] = []
17     d[k1].append(t[k2] * (i % (len(t) * 10)))
18 
19 import json
20 print(json.dumps(d, indent=2, ensure_ascii=False).encode("cp932")) # 1
21 #json.dump(d, sys.stdout, indent=2, ensure_ascii=False) # 2

上記「1」は、msvcrt.setmode があると Not enough space、外すと問題なくなる。けど、外すことは解決にならないので外せない。が、「2」はどちらでも Not enough space にはならない。多分これはコーディング変換の差。のはずだけど、ただね、msvcrt.setmode の有無で変わるってのもよくわからないのですよ。