pythonスクリプトをあるサーバーから新しいドッカーコンテナに移行しています。しかし、私はエンコーディングに関する奇妙な問題に直面しています。crontabからpythonスクリプトを実行しているときのエンコードの問題
スクリプトを端末から直接(手動で)実行すると、成功して実行されます。しかし、私はcrontabファイルを通じて実行する場合、私は次のエラーを取得する:
UnicodeEncodeError: 'ascii' codec can't encode character
私はちょうどエンコーディングをチェックするために小さなスクリプトを作成しました:
import sys
print sys.stdout.encoding
私は手動で実行した場合、私は次の応答を取得:
をUTF-8
はその後、私はcronの中で、このスクリプトを追加し、ファイルへの出力を指示:
* * * * * /tmp/p.py > /tmp/p.log
これは空のp.logを保存しました...だから、私はpythonがcrontabからエンコードを取得していないと思います。
コマンドを呼び出す前に、crontabにエンコード変数を追加する方法がいくつかありましたが、うまくいきませんでした。 exempleため :
* * * * * PYTHONIOENCODING=UTF-8 /tmp/p.py > /tmp/p.log
または
* * * * * LANG=UTF-8 /tmp/p.py > /tmp/p.log
また、私は私のcrontabファイルの頭の中でこの変数を追加してみました。全く成功していない。
いくつかのロケールがインストールされているI Ubuntuを使用しています:
locale -a
C
C.UTF-8
en_US.utf8
POSIX
そして、ここでは私のロケール(外クーロン)である:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
は、私が実行しているいくつかのPythonスクリプトを持っているので、それは良い考えではありませんそれらを編集することもできます(私はcronの外で呼び出されたときに完璧に動作すると言っていました)。