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で一時間毎、には違いない。。。
コメント
コメント一覧 (2件)
初めして、コメント失礼します。
私もこの問題に直面し、
> with open(out_feed_path, “w”) as f:
の部分を
> with open(out_feed_path, “w”, encoding=’utf-8′) as f:
とすることで、解決しました。(3系の場合)
な、なんと、そんなことで……
ありがとうございます。