5分SHAREツイートシェアはてブLINEPocketこんにちは、ライフハックブロガーのたぬ(@tanuhack)です!「作ったPythonのプログラムが、ある決まった時間に自動で実行されればなあ...」Macのcron(クーロン)という機能を使えば可能です!![aside]補足cronとは、UNIX系のOS(MacやLinuxなど)に入っているプログラムの1つです。プログラムを起動する時間を予め設定しておくことで、cronが自動で定期的にプログラムを実行してくれるようになります。毎分実行させたり、一日おきにに実行させたり、毎週月曜の8時に実行させたりと、好きな間隔で設定することが出来ます。[/aside]プログラムの定時実行は主に以下の3つの用途で使われることが多いです。notebookやターミナルから手動でプログラムを実行させていた時期があったなんて、今では信じられないくらい定時実行は便利です。抜け出せる自信がありません!!さあ、あなたもcronを習得して、人間が行うには下らない単純作業を自動化させ、人生のクオリティを上げていきましょう!!それでは、どうぞ。注意cronはMacにしかありません。そのため当記事は、Macユーザー向けの内容となっております。タスクスケジューラ』と検索してみて下さい。-eと実行すると、cronの登録画面(vim)が出てきます。-ecronの登録画面|vimこの黒い画面にcronのコマンドを登録していきます。vimの操作するこの黒い画面はvim(ヴィム)と言って、普通のエディタのようなGUI(マウスや指などで操作できる画面のこと)操作ではなく、CUI(キーボードでしか操作できない画面)操作でしか動きません。最初は戸惑うかもしれませんが、慣れればどうってことありませんよ\(^o^)/vimには2つのモードがあります。インサート(挿入)モード:文字が入力できるコマンドモード:文字が入力できないvimを起動したら、コマンドモードが起動します。キーボードのIを押すと、コマンドモードからインサートモードに切り替わり、文字を入力することが出来るようになります。インサートモード|vim今回cronを作成する例として、デスクトップ(/Users/Kenta(※あなたのユーザー名)/Desktop/)にあるhello-cron.pyというPythonファイルを毎朝9:00に定時実行させるcronを作ってみましょう。sys.version)プログラムの実行タイミングを設定するcronは、次のような書式で実行する『タイミング』と『コマンド』を設定します。毎分実行ゆえに『デスクトップ(/Users/Kenta(※あなたのユーザー名)/Desktop/)にあるHello-cron.pyというPythonファイルを毎朝9時に定時実行させるcron』は以下のように設定できます。/Users/Kenta/Desktop/hello-cron.pyvimを閉じるvimをインサートモードからコマンドモードに切り替えるためにはescキーを押します。『:wq』と入力して、returnキーでcronを保存します。crontab』と表示されます。出力を確認するPythonのprint()メソッドは、ターミナル上に標準出力されません。実際にどうやって出力を確認するのかというと、ターミナル上でmailコマンドを使って確認します。言ったものの、mailコマンドで毎回確認するのは不便すぎるので、『標準出力』と『エラーメッセージ』を一緒に『logファイル』として出力する方法を紹介します。先程のcronを登録する際に、コードを付け足します。2>&1cron自体は正しく動作しています。Python3を実行したはずが、なぜかPython2.7系になっていますね。実は、cronでPythonプログラムをユーザーが意図した通りに動かすためには、次に紹介する4つのポイントを押さえなくてはいけません。文字コードを設定するそれぞれ見ていきましょう。Python3のPATHを通す先程、Python3を実行したつもりがPython2.7系で実行されていましたね。私以外にも多くの方が2.7系で実行されると思います。--versionコマンドでバージョンを確認)が動いていても、cron上ではPython2.7系が動いてしまいます。(64-bit)結論から言うと、crontabでPython3が動くようにPATHを通してあげればOKです。$PATHと入力して、そのPATHをcrontabに貼り付けます。Fusion.app/Contents/Public:/opt/X11/bin:/Users/kenta/.nodebrew/current/bin:/Users/Kenta/.nodebrew/current/binPATHを通してあげると、ちゃんとcronで実行したプログラムでもPython3系を動かすことが出来ました。相対パスではなく絶対パスを記述するcronで実行するプログラムでは、相対パスは使えません。先程のPATHみたいに、cronの環境変数はターミナルのそれと全然違うことが分かりますね。/tmp/cron_envSHELL=/bin/shUSER=KentaPATH=/usr/bin:/binPWD=/Users/KentaSHLVL=1HOME=/Users/KentaLOGNAME=Kenta_=/usr/bin/envうわ、すくなっ...。ご覧の通り、全然用意されていません。プログラムの中で環境変数を使用している場合は、『プログラムをそのまま変えずにcrontab上で環境変数を定義する』か『(※流出したら危ないけど)プログラムで環境変数を使わず、変数にKEYやPASSを直接代入する』か、で代用してください。文字コードを設定する出力に日本語を含む場合、次のようなエラーが発生します。range(128)cronにLANG=ja_JP.UTF-8と記述しておけばPythonプログラムに日本語が含まれても大丈夫です。print('プログラムに日本語が含まれても大丈夫!')さいごに今回は、Pythonを定時実行させるために欠かせないcronの使い方と注意すべき4つのポイントを紹介しました。:時間短縮この記事を書いた人たぬ効率沼ブロガールーチンワークを自動化で瞬殺することに人生の楽しさを見つけた効率沼ブロガーです。本業は「データ分析」と「作業の効率化」を生業としているデータアナリスト。PythonとGASに人生救われました。当ブログは、おかげさまで月間12万PV。2020年までに30万PV目指して頑張ってます。