2020年2月11日pythonは内部の文字コードと実行環境の文字コードが色々絡み合っていて、いろんなところで悪さをする。Windows環境だと、内部はUTF-8で動いているのに実行環境はShift-JIS(正確にはcp932)という状態で、これが非常に悪さをする。いった悪さは日本人エンジニアは慣れっこな一方で、海外エンジニアには非常に理解されない問題。海外製のpythonスクリプトを日本のWindows環境で動かすと、文字コード不一致が原因でバグって死ぬ。subprocessを使って外部コマンドを実行しようとしたとき、外部コマンドの出力がUTF-8だと日本のWindows環境ではpythonが死ぬ。サンプル外部コマンド側UTF-8で「ハローワールド」と出力するだけのスクリプト。syssys.stdout.buffer.write(b'\xE3\x83\x8F\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\xAF\xE3\x83\xBC\xE3\x83\xAB\xE3\x83\x89')親コマンド側さっきのコマンドを実行してprintするだけのスクリプト。universal_newlines=True))実行結果こういうエラーになる。sequenceサンプルの解説これはsubprocess.check_outputがコマンドの出力にShift-JIS(正確にはcp932)を期待しているのに、UTF-8が飛び込んで来たので処理できなくてUnicodeDecodeErrorを吐いている。ちなみにsubprocess.check_outputにtimeout属性を付けると、別スレッドで動くようになってさらにエラーが複雑になる。↓こんな感じにスレッド2本が別々のエラーを吐いて死ぬ。rangeで、これは実はuniversal_newlines=Trueのときの挙動。ちなみにtextとuniversal_newlinesは同じ効果なので、text=Trueでも起きる。このとき、コマンドの出力をテキストストリームとして開く。逆に言えば、textやuniversal_newlinesを付けないときはバイトストリームになる。ここらへんの挙動は一応公式ドキュメントにあるので細かく知りたい人は読むと良い。対策univarsal_newlinesを外してしまえばバイトストリームとして読める。...が、わざわざunivarsal_newlinesを付けているということは文字列として処理したいはずなので、本筋としては「このコマンドの出力はUTF-8だよ」と教えてあげるべき。いうわけで、encoding=”utf8′′を付ければ良いです。universal_newlines=True)意味が分かればそれだけの話なんだけどハマると長いですよねこういうの。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。それは誰もが抱く夢です。3Dモデルだってパンチラしたくないと思っているハズです。いうわけで偉大なる先人がいます。最初に学ぶべきプログラミング言語ってなんだと思いますか?そうです。Shader使ってみた。性能は出ないのでただの失敗の記録です。元のアルゴリズムはコレ。...GeoJSONで市町村境界をマージして都道府県境界にしたい(その1)前回の続きで、国土地理院の「国土数値情報」っていうオープンデータで遊んでいます。独立した記事なので前回のは読まなくても良いです。