15

clickランタイムが python3 であるがエンコーディングが ASCII であることをlibが検出すると、python プログラムが突然終了します。

RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Either switch to Python 2 or consult http://click.pocoo.org/python3/ for mitigation steps.

私の場合、この問題の原因が見つかりました。Mac から Linux ホストに接続すると、Terminal.app が SSH セッション ロケールを Mac ロケール (es_ES.UTF-8) に設定しましたが、Linux ホストがインストールされていません。そのようなロケール (en_US.utf-8 のみ)。

それを修正するために最初の回避策を適用しました(ただし、多くの問題がありました。受け入れられた回答を参照してください):

import locale, codecs
# locale.getpreferredencoding() == 'ANSI_X3.4-1968'
if codecs.lookup(locale.getpreferredencoding()).name == 'ascii':
    os.environ['LANG'] = 'en_US.utf-8'

編集:より良いパッチについては、私の受け入れられた回答を参照してください。

私のすべての Linux ホストは、ロケールとして「en_US.utf-8」をインストールしました (Fedora はデフォルトで使用します)。

私の質問は: python3 スクリプトでロケールを選択/強制するより良い (より堅牢な) 方法はありますか? たとえば、システムで利用可能なロケールの 1 つを設定します。

この問題を解決する別の方法があるかもしれませんが、私はそれを見つけられませんでした。

4

4 に答える 4

0

この単純な方法 (何かを行う前に適切な環境でスクリプトを再実行する) が見つからないので、何らかの理由で古いバージョンの Python を使用している将来の旅行者のために追加します。インポートの下に追加して、最初にします。

if os.environ["LC_ALL"] != "C.UTF-8" or os.environ["LANG"] != "C.UTF-8":
    os.execve(sys.executable,
              [os.path.realpath(__file__)] + sys.argv,
              {"LC_ALL": "C.UTF-8", "LANG": "C.UTF-8"})

于 2020-12-07T18:04:03.660 に答える