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で一時間毎、には違いない。。。
関連記事
Python の記事
- [2019年4月4日] C1801: Do not use len(SEQUENCE) to determine if a sequence is empty (len-as-condition)と怒られた時
- [2019年4月3日] Python + SendGrid API でメールを送信する
- [2018年8月21日] boto3でS3にアップロードした画像が、ブラウザで表示するとダウンロードされてしまう時
- [2018年7月27日] Pandasで2列を比較してTrue/Falseの新たな列を作る。さらに1/0へのマッピング
- [2018年7月20日] pythonのpipで入れているもの
- ---本記事---
- [2018年6月22日] pythonでRSSフィードを取得し、画像がない場合、リンク先の記事から拾う
- [2018年5月21日] pythonのmysqlclientでSSH越しにAWSのRDSにアクセス
- [2018年5月17日] matplotlibでx軸の時刻情報をフォーマットする
- [2018年5月11日] Pythonでユニークでランダムな文字列のリストを作成する
- [2018年1月29日] Pandasでcsv, excelデータの読み込み・書き込み
スポンサーリンク
初めして、コメント失礼します。
私もこの問題に直面し、
> with open(out_feed_path, “w”) as f:
の部分を
> with open(out_feed_path, “w”, encoding=’utf-8′) as f:
とすることで、解決しました。(3系の場合)
な、なんと、そんなことで……
ありがとうございます。