PyScripter でパスに日本語を含むとUnicodeEncodeErrorとなる対応

Python IDE の PyScripter 。Linuxに対応していないのが残念だが、軽量でかなり使いやすい。

ソースコードまでのパスに、日本語(非ASCII文字)が含まれると、PyScripterからの実行、デバッグ実行時に、

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 8-10: ordinal not in range(128)

てなエラーが発生する。

 

パスに、"テスト"という日本語が含まれるため、エラーとなっている。

pyscripter_encode_err01

python コマンドで実行するなり、ダブルクリックで実行するなり、PyScripter以外からこのファイルを実行する分には問題ない。

まぁ、日本語をパスに含まないようにすればよいのだが、面倒だ。

https://code.google.com/p/pyscripter/issues/detail?id=427

 

Python のインストールフォルダ直下の Lib フォルダに、site.py ファイルがあるので、これを編集する。

例えば、

C:\Python27\Lib\site.py

をテキストエディタで開き、def setencoding() の最初の if 0:if 1: に変更する

def setencoding():
    """Set the string encoding used by the Unicode implementation.  The
    default is 'ascii', but if you're willing to experiment, you can
    change this."""
    encoding = "ascii" # Default value set by _PyUnicode_Init()
    ### ↓↓↓ ここを、0 -> 1 に変更
    if 1:
        # Enable to support locale aware default string encodings.
        import locale
        loc = locale.getdefaultlocale()
        if loc[1]:
            encoding = loc[1]
    if 0:
        # Enable to switch off string to Unicode coercion and implicit
        # Unicode to string conversion.
        encoding = "undefined"
    if encoding != "ascii":
        # On Non-Unicode builds this will raise an AttributeError...
        sys.setdefaultencoding(encoding) # Needs Python Unicode build !

実行してみる。

エラーとならずに、実行できた!

pyscripter_encode_err02

。。。はよいが、Python自体の設定を変更しているので、副作用が気になる。

コードを見ると、locale.getdefaultlocale() の 2つめの要素を、sys.setdefaultencoding に与えている。

自分の環境だと、cp932。

>>> import locale
>>> locale.getdefaultlocale()
('ja_JP', 'cp932')

上記、site.py を編集する前に、sys.getdefaultencoding() を実行すると、ascii が返るが、、、

>>> import site
>>> sys.getdefaultencoding()
'ascii'

編集後は、cp932 が返るようになる。

>>> import sys
>>> sys.getdefaultencoding()
'cp932'

http://python.rdy.jp/wiki.cgi?page=japaneseCharset

sys.setdefaultencodingは文字コードのこと考えていない古いソースコードのためにある設定項目なので、これから何か新しいものを書こうとするプログラマが設定する必要はありません。

Pythonは書けないが、海外で作られたアプリやMODユーティリティが UnicodeEncodeError/UnicodeDecodeError で動かないという方は、次のような設定で回避できる場合があります。

方法1:sitecustomize.pyを書き換える

Windows であれば C:\Python27\Lib\site-package\sitecustomize.py

Unix であれば /usr/lib/python2.7/site-package/sitecustomize.py

というファイル[3]に以下の2行を追記してください。ただし、「********」は、お使いのファイルシステムの文字コード(Windowsならcp932、Unixならたぶんutf-8)に置き換えてください。

import sys

sys.setdefaultencoding(‘********’)

以上の設定はPython全体で有効です。

とのことなので、設定しても良さそうな感じ。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です