見出しにつられた人、ごめんなさい。ここには解決方法は書いてない。
なかなかに謎めいた振る舞いがあって。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 の有無で変わるってのもよくわからないのですよ。