ググればすぐ出てくるが備忘録としてメモ。2018年にもなってPython2を使うのはどうかと思うが、時間のかかる集計処理などをnohupで実施するケースが稀にあるかと思う。
その際、場合によっては以下のようなエラーが発生する。
nohup some_script.py &
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-12: ordinal not in range(128)
解決策として、 PYTHONIOENCODING=utf-8
を環境変数に設定すると良い。
なぜこのようなことが起こるのか
sys.stdout.encoding
を確認してみる。
import sys
print(sys.stdout.encoding)
まずは普通に実行 (LANG=en_US.UTF-8
)
$ python encoding.py
UTF-8
nohupで実行してみると、None
になる。(一瞬で終わるため、バックグラウンドで実行していないのはご容赦ください)
$ nohup python encoding.py
nohup: ignoring input and appending output to ‘nohup.out
$ cat nohup.out
None
http://www.macfreek.nl/memory/Encoding_of_Python_stdout を読むと、
However, when the output is piped to a file or to a different process, the encoding is not defined, and defaults to 7-bit ASCII.
とあるので、 nohupはこの場合にあたり、asciiになるようだ。
したがって、プロセス実行前に sys.stdout.encoding
を変更するために PYTHONENCODING
環境変数を変更するべき、という理解で合っているのだろうか。
めでたしめでたし(?)