Python
Windows10

バグ回避策有り:Fall Creator Update (Win10) でpython が 「OSError: raw write() returned invalid length・」

エラーの状態

Fall Creator Update (Windows10)でcmd.exe や powershell.exeでpythonを実行しているとprint等で以下のようなエラーで止まる場合があります。
OSError: raw write() returned invalid length・・・・
どうも、print文等でOSの認識している文字数とpythonが認識している文字数が違うように認識してエラーを出して止まっているように見えます。

エラーの情報

以下のように、報告されているようで、puthon3.4以下とpython2.7は保守状態なのでbugf fixしないような事が書かれています。
3.5はパッチは出ているようで、3.6はbugが出ないような対応しているようです。
Title: OSError: raw write() returned invalid length on latest Win 10 Consoles

エラーの再現スクリプト

実は単純に日本語や英字を表示し続けても止まりません。
実行中のターミナルをクリックしたりとどうも表示中に別のイベントが発生すると止まりやすいようなので、以下のようなスクリプトでエラーが出るのを確認します。(winsock等の通信スクリプとかでも止まりやすくなります)

test.py
import string,random

def random_string(length, seq=string.digits + string.ascii_lowercase):
        sr = random.SystemRandom()
        return ''.join([sr.choice(seq) for i in range(length)])

while(True):
  print(random_string(100))

上記スクリプトをwindows10のコマンドプロンプト(cmd.exe)から
python test.py
と実行するとランダムな文字列が表示され続けますが、この表示されているウインドウで左クリックしてから、右クリックとかすると以下のようなエラーで止まる事が確認出来ます。(python3.4で確認)


k83kr1k658q9pf75hlrgpqvrlqb6h8u1v9pnum03o4baw7jm6bj7ii8y70wcmv6ndfiq1cxrmi8hyhij0ndguh60ue1er3rb9inw
k83kr1k658q9pf75hlrgpqvrlqb6h8u1v9pnum03o4baw7jm6bj7ii8y70wcmv6ndfiq1cxrmi8hyhij0ndguh60ue1er3rb9inw
Traceback (most recent call last):
File "test.py", line 9, in
print(random_string(100))
OSError: raw write() returned invalid length 204 (should have been between 0 and 102)


エラーの回避策

  1. python3.5はパッチを当てる?python3.6は対応済のようなのでpython3.5かpython3.6に移行する方法があります(未検証なので、python.orgに書かれている事が正しければです)
  2. 1.以外ののversionの場合最初に以下のような記述を追加すればエラーは回避出来るようです。

import win_unicode_console
win_unicode_console.enable()


これは上記エラー再現スクリプトの先頭に追加してエラーが出ない事を確認しています(python3.4 他のversionは未検証です)

ただこの方法だと全てのスクリプトに追加しなければならないのですが、pythonは立ち上げ時にsitecustomize.pyを読み込むようなので、これに追加(なければ新規作成)すればよさそうです。以下の概要があります。
29.13. site — サイト固有の設定フック
この真ん中位の所で書いてあります。
sitecustomize.pyがあるかどうかの確認はpythonをインタープリターモードで立ち上げて
import sitecustomize
でエラーが無ければ既にあって、そのパスは
sitecustomize.__file__
を見ればファイルのパスはわかります。

新規作成の場合は適当にインストールしたライブラリを読み込んで
import numpy
numpy.__file__
とかすれば、site-packagesのパスがわかるので、
...lib\site-packages\sitecustomize.py
に作成すればOKです。