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で一時間毎、には違いない。。。

本サイトはUXを悪くするevilなGoogle広告を消しました。応援してくださる方は おすすめガジェット を見ていってください!
よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメント一覧 (2件)

  • 初めして、コメント失礼します。

    私もこの問題に直面し、
    > with open(out_feed_path, “w”) as f:
    の部分を
    > with open(out_feed_path, “w”, encoding=’utf-8′) as f:
    とすることで、解決しました。(3系の場合)

コメントする

目次