cronのpythonスクリプト内にあるjson.dump()でensure_ascii=Falseにして日本語出力しようとしてハマった

pythonスクリプトで、辞書をjson.dump()でファイル出力した。日本語については、オプション引数でensure_ascii=Falseとすることで出力できる。できるのだが……cronに登録して実行すると、これがうまくいかない。あれこれやってもうまくいかず、結局最後はwatchコマンドに行き着いてしまったメモ。

スポンサーリンク

状況

環境はPython 3.6、macOSX 10.13 High Sieera。

contents = [ { … } , { … } ] という形式のリストについて、下記のようにjson.dumpした。

with open(out_feed_path, "w") as f:
    json.dump(contents, f, ensure_ascii=False, indent=4)

ensure_ascii=Falseは日本語処理のためで、これがないと文字コードポイントがずらずらと出力される。indentはそのままインデント。

このコードは、ターミナル上で実行する分には問題なく動く。が、cronに登録して実行すると、どうも日本語が出力されるところで止まってしまうような感じ(ファイル自体は出力される)。実際、ensure_ascii=Trueとすると、正常に出力される(文字コードポイントが)。pythonでは文字コードについて何かとハマってきた覚えがあるけれど、どうもcronになるとさらにややこしいらしい。。。おおぉ……。

抵抗

Pythonでバッチ書いてcronで実行させると死ぬ « くちなわのしょ::おねーさんブログ分室」の記事よれば、PYTHONIOENCODING=UTF-8にすればよいことであった。しかし、cron内で変数設定したり、env PYTHONIOENCODHING=UTF-8を前に置いたりしてみたものの、うまくいかず。bash -l -cでログインシェルをかませればいいかなと思ったけれど、これもうまくいかず。

watchにした

色々試してみてはいたものの、結局どうにもならず……。さりとてスクリプトを手動実行するわけにもいかず。

それで、自分でも如何なものかと思わなくもないのだが、当面はwatchコマンドで定期実行することにした。watch -n 3600で一時間毎、には違いない。。。

関連コンテンツ

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。