追記:
2022/4/8:記事公開
2022/4/22:pythonanywhereで出来なかったflask-apschedulerのコードを記載
(残業長くて時間なかったので既存記事の追記で許してヒヤシンス)
----------------------------------------------------------------------------------------------
h05torです。
今回はpythonの備忘録記事です。
業務での研究用ツールとしてFlaskで作成してpythonanywhereにデプロイしているwebサイトで定期実行を導入するまでのお話です。
具体的に何がしたかったのかといいますと、測定機器から出力されたcsvファイルをアップロードして・・・・・みたいなことをするのですが、このcsvファイルが大量に溜まっていくので毎日1回自動的に削除するというプログラムを実装するという内容です。
(1個1個手動で削除するの面倒ですからね)
pythonにおける定期実行のモジュールとしてapscheduler、またそれのFlaskに適用した版であるflask_apscheduler(普通のapschedulerと何が違うのかは分からないです)があり、「何分毎」などの一定間隔での実行、「毎日何時何分に実行」といった指定時刻での実行が可能です。
apschedulerは↓のリンク先を参考にして下さい。
pythonのAPSchedulerによるプログラム、関数の定期実行 - どん底から這い上がるまでの記録 (pytry3g.com)
ですが・・・・・
なんとこの方法、pythonanywhereでは使用できませんでした!(※無料版の場合、有料版は分かりません)
どうやらpythonanywhereはスレッドが無効になっているみたいで、それが原因でflask-apschedulerが使用できないみたいです。
↓参照
PythonAnywhere で Flask APScheduler を使う : フォーラム : PythonAnywhere (www.pythonanywhere.com)
本体部分のflask_app.pyに「from flask_apscheduler import APScheduler」付け加えて
必要な記述加えてリロードしたらエラー起こしてwebページ開けなくなりました。
せっかくpythonanywhereにモジュールインストールしたのに・・・
(flask-apschedulerのモジュール自体は問題なくインストールできるみたい)
pythonanywhereの場合はヘッダーのメニューから「Tasks」で、1日に1回指定された時刻に指定したプログラムを実行させることができます。
「Files」で「ユーザー名」のディレクトリの直下に処理内容を記載したpyファイルを入れておき、上の画像のように処理ファイルを指定し、指定時刻を設定してCreateボタンを押せば、定期実行の設定を完了します。
設定が完了すると以下のような表示になります。
無料版では設定できる定期実行は1つのみです。
また定期実行の有効期限は1か月間なので、たまにExtend expiryを押して有効期限を延長してあげる必要があります。
今回は以上となります。
また何かあれば備忘録記事を書きます。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
当初、Flask-apschedulerで実装しようとしたがpythonanywhereでスレッド無効のため
はねられたコード
※実際の研究用プログラムのコードではなく、動作確認用のテストコードです。
指定時刻になるとcsvファイルを作成するコードです。
↓
""" 指定された時間にcsv作成 """ from flask import Flask,render_template from flask_apscheduler import APScheduler#定期実行のために必要なモジュール(flask用) from datetime import datetime import os import csv scheduler = APScheduler()#定期実行のために必要なモジュール app = Flask(__name__) @app.route('/') def index(): return render_template("index.html") @scheduler.task('cron',id="do_tick", day_of_week='sat', second=5)#指定時刻で実行 def tick(): now = datetime.now().strftime('%Y%m%d%H%M%S') title = now + ".csv" with open(title, 'w') as f: writer = csv.writer(f) writer.writerow(str(datetime.now())) scheduler.init_app(app)#定期実行のために必要なモジュール scheduler.start()#定期実行のために必要なモジュールを起動 if __name__ == "__main__": app.debug = True app.run(host = "localhost")