2016-11-21 10 views
0

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の外で呼び出されたときに完璧に動作すると言っていました)。

答えて

1

実際にはcrontabに問題がありました。ファイルを編集したときに自動的にリロードされませんでした。

crontab /etc/crontab 

service cron restart 

今のcrontabは、環境変数を正しくロードされています。私はリロードを強制的に

。 crontabファイルのヘッダーには、次の変数があります。

SHELL=/bin/bash 

TERM=xterm 
PYTHONIOENCODING=UTF-8 
LANG=en_US.UTF-8 
LC_ALL=en_US.UTF-8 
関連する問題