【仕事の自動化】Pythonでの自動化プログラムを、さらに効率化させる「スケジュール実行」のやり方【初心者でもわかる】

キノコードでは、今までPythonでの自動化プログラムを色々紹介してきました。 でも、それらのプログラムを決まった時間に実行していませんか? 面倒ですよね。 その作業があるために、作業を中断したり、集中力が切れたり、あるいはその作業を忘れていたりしませんか? 今回この動画でお教えてするスケジュール実行によって解決することができます。パソコンを起動さえしていれば、24時間いつでも毎日でも毎分でもプログラムを実行することができます。 仕事でデータ集計をしている方、特定のサイトからデータをダウンロードしている方、株や為替、仮想通貨の分析を自動化したい方にお役立ちできる内容です。 この動画も初心者の方でもわかるように解説をしました。これを覚えてもらえればパソコンを起動しているだけで24時間、パソコンがあなたの代わりに作業をしてくれます。無料で働いてくれる人も見つけられたようなものです。 本編動画でぜひやり方を習得してください。

こんにちはキノコードです。
キノコードでは、他の動画で、Pythonで集計をしてExcelに書き出す処理、自動でExcelの分析のレポートを作成する処理、Googleスプレッドシートに書き出す処理、PythonでGmailで送信する処理など解説してきました。
でも、それらのプログラムを決まった時間に実行していませんか?面倒ですよね。
その作業があるために、作業を中断したり、集中力が切れたり、あるいはその作業を忘れていたりしませんか?
今回この動画でお教えてするスケジュール実行によって解決することができます。パソコンを起動さえしていれば、24時間いつでも毎日でも毎分でもプログラムを実行することができます。
仕事でデータ集計をしている方、特定のサイトからデータをダウンロードしている方、株や為替、仮想通貨の分析を自動化したい方にお役立ちできる内容です。
この動画も初心者の方でもわかるように解説をしました。これを覚えてもらえればパソコンを起動しているだけで24時間、パソコンがあなたの代わりに作業をしてくれます。無料で働いてくれる人も見つけられたようなものです。パソコン画面に切り替えてレッスンを進めていきましょう。

スケジュール実行は、Macではcron、Windowsでははタスクスケジューラーを使います。その方法を説明した後に、最後に、MacでもWindowsでも実行できるようにDockerを用いた設定方法を紹介します。
パソコンには既にPythonがインストールされている前提で話を進めます。もしインストールが済んでいない場合は、「Pythonの環境構築の方法」の動画を参考にしていてください。この動画では、VSCodeとPythonのディストリビューションのanacondaをインストールしています。
また、Dockerを使ったスケジュール実行は、DockerとGitをインストール済みの方向けです。Dockerのインストールについては「Dockerを用いた設定方法」を参考にしてください。Gitについては動画の準備がまだないですが、近々作成予定です。難しくはないので「Git インストール方法」などで検索をしてみてください。

実行するプログラムの説明

import datetime
import pandas as pd

dt_now = datetime.datetime.now()
df = pd.DataFrame()
df.to_csv('/Users/kinocode/Documents/MyTest/test_'+str(dt_now)+'.csv')
print(str(dt_now),'fin')

さて、まず、どんなプログラムをスケジュール実行をするのか説明をします。
VSCodeでファイルを作成してみましょう。VSCodeはMac、Windowsの方のどちらでも使うことができます。
VSCodeの設定方法については、Pythonの環境構築の動画で説明をしています。
VSCodeの設定がまだの方はそちらをご覧ください。
さて、どのようなプログラムを作成するかの説明に戻ります。
今回は、簡単なソースコードにします。
Pythonを使ってcsvファイルを書き出すという処理にします。このソースコードについてもっと知りたい方は、「Pandas入門コース」があります。右上に出ているカードからご覧ください。
datetimeのライブラリで現在の時間を取得。それを文字列に変えた後でdf_nowという変数に代入。そして、データフレームを作成します。データフレームはカラムが「datetime,name,greet」の3つ。そして現在の時刻と、「kinocode」「Hello cron」という文字列を代入します。そして、そのデータフレームをCSVファイルに書き出します。CSVファイルには、現在の時間を挿入して、何時に書き出せたかわかるようにします。またprint関数を使って、現在の時刻と「Hello world from cron」という文字列を表示させてみましょう。実行してみましょう。CSVファイルが作成できました。このようなcsvファイルです。
このプログラムファイルを「app.py」と名前をつけて保存をしてください。
今は、データフレームを作成して書き出していますが、ここに違う処理を書けば、仕事を自動化させる処理に変えることができます。例えば、データベースからデータ取得してPandasで集計をしたり、集計をした結果をエクセルやGoogleスプレッドシートに書き出しをしたり、Webスクレイピングを実行したり、Gmailを送ったり、機械学習のライブラリでデータ分析をしたりなど。
色々なプログラムを自動化することができます。
さて、今回は、簡単なプログラムですがデータフレームをcsvファイルで1分おき書き出すスケジュール実行をしていきましょう。

Macでの設定方法

まずMacでの設定方法を解説します。
Macには、もともとcronというツールが入っています。
cronとは、macOSやLinuxに入っているプログラムで、ユーザーが設定したスケジュール通りにプログラムを自動実行してくれるものです。
cronを使うと、パソコンが決まった時刻に決まったプログラムを自動で実行する、ということです。
また、定期実行が終わったらlogファイルとものに実行結果を記録することもできます。エラーが出た時などにわかりやすいため、その設定も解説するので覚えていきましょう。
プログラムを保存するフォルダを用意します。私は、Macの書類つまりDocumentの中にpython_cronというフォルダを作成しました。
そして、最初に作ったpythonファイルをこのフォルダに保存をします。

続いて、cronの設定を行います。
まず、cronからパソコン上のファイルにアクセスできるように設定をします。
これをしなければ、cronが動いてくれません。
システム環境設定を開きます。セキュリティとプライバシーをクリック。 プライバシーのタブ。フルディスクアクセス をクリック。鍵マークがあるので、それをクリックした上で、macのロックを解除するときに使うパスワードを入力。プラスの矢印をクリックすると新しい画面が開くので、command+shift+Gのキーを同時に押します。そうすると、フォルダの場所を入力できますのでそこに「/usr/sbin/cron」と入力します。すると「/usr/sbin/」の中のcronが選択された状態になっているので、開くをクリック。cronが追加され、チェックが入っていることを確認をした上で、もう一度鍵マークをクリックしてロックをかけます。画面は閉じておきましょう。

export EDITOR=vim

それでは、cronの設定を記述するエディタの設定をしましょう。ターミナルを開いて、「export EDITOR=vim」というコマンドを実行してください。
これはエディタを起動するときに、自動で開くエディタとしてvimを選択するという記述です。exportは環境変数を設定するコマンドで、そのコマンドでEDITORという環境変数をvimに変更しています。

echo $PATH

またcronの設定のためにPATHという環境変数を確認しておきましょう。
ターミナルで「echo $PATH」と入力すると、PATHという環境変数が確認できます。
このPATHとは、Pythonプログラムを実行するためのファイルが保存されている場所を設定するものです。
cronにこのPATHを設定していなければ、cronでpythonファイルを実行する際に、anacondaのPythonで実行をすることができません。そうなると、Macにもともとインストールされているpythonで実行されてしまう可能性があります。
MacにもともとインストールされているPythonにはPandasなどのライブラリがインストールされていません。したがって、anacondaのPythonを実行できるようにこのPATHの記述が必要になります。
表示されたものをそのままコピーします。VSCodeにコピーしておきましょう。

crontab -e

続いて、ターミナルを開いて、crontab -eと入力をしてください。そうするとcrontabをVimで編集できるようになります。crontabとは、スケジュール自動実行するcronを設定ファイルのことです。ここにスケジュール自動実行の処理の設定内容を書いていきましょう。
初めてcrontabを起動する場合は何も記述されていません。Vimで編集をするにはiと入力をします。ここにこのような記述をします。

PATH=
# (分) (時) (日) (月) (曜日)  (実行するコマンド)
*/1 * * * * python /Users/kinocode/Documents/MyTest/cron-sample.py >> /Users/kinocode/Documents/MyTest/cron.log 2>&1
PATH=/Users/kinocode/opt/anaconda3/bin:/Users/kinocode/opt/anaconda3/condabin:/Users/kinocode/.rbenv/shims:/Users/kinocode/.rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
# (分) (時) (日) (月) (曜日)  (実行するコマンド)
*/1 * * * * python /Users/kinocode/Documents/python-cron/app.py >> /Users/kinocode/Documents/python-cron/cron.log 2>&1

一番最初は、環境変数のPATHの設定の記述です。
「PATH=」と書いて、そのあとに先ほどVSCodeに貼り付けたパスをコピーしましょう。それをペーストします。
文頭に#がついているこの行は、説明文です。
文頭に#をつけることで、その行のあとの記述はコメントアウトすることができます。
4行目からがメインの記述です。
構文は「 (分) (時) (日) (月) (曜日)  (実行するコマンド)」という構成になっています。
前半の書き方を見てみましょう。
それぞれの項目には数字を入力することができます。
分には0-59の数字。
時には、0−23。
日には、1-31。
月には、1-12。
曜日には、0-7が入力できます。また、曜日の0は日曜日、1は月曜日、2は火曜日と進んでいきます。ちなみに、6が土曜日で7が0と同様に日曜日になっています。
また、「*」と書くと全て選択するということになります。
では、これらの数字やアスタリスクを使ってどのようにスケジュール設定をすればいいでしょうか?
具体例を交えてみていきましょう。
「毎日9時15分」の定期実行する場合は「15 9 * * * 」と記述します。9時15分として、それ以外は毎月の毎時間の毎曜日です。
「毎週月曜の9時15分」としたいときは、「15 9 * * 1」と記述します。9時15分として、それ以外は毎月の毎時間の月曜日です。
「毎月10日の9時15分」としたいときは、「15 9 10 * *」と記述します。9時15分として、毎月10日として毎曜日です。
「毎月10日と20日と30日の9時15分」に実行したい場合は、「15 9 10,20,30 * *」と記述します。
「毎月1日から6日の9時15分」に実行したい場合は、「15 9 1-6 * *」と記述します。
10分ごとに実行したい場合は、分に「*/10 * * * *」と記述すれば、10分間隔で実行できます。
以上がスケジュールの設定方法です。
続いて、後半の書き方についてみていきましょう。
pythonの後ろのディレクトリは、pythonファイルが保存されているディレクトリを記述してください。
私のパソコンの場合は、書類の中のpython-Cronというフォルダにファイルを置いているのでこのような記述になっています。
そして、ディレクトリのあとはptyhonのファイル名を記述しましょう。
次に、「>>」と指定することで、pyファイルの出力結果、つまりprint関数で表示させてものを特定のログファイルに追記をすることができます。ちなみに、>>でファイルへの追記。>でファイルへの上書きのコマンドです。。
また、「2>&1」と書くことで、pyファイルの出力結果に加えて、コマンドの実行時に起こったエラーも、指定したファイルに出力することができます。ちなみに、0と記述すると「標準入力」、1と記述すると「標準出力」、2と記述すると「標準エラー出力」という意味になります。また、>はリダイレクトという意味です。しがたって、2>&1と入力をすると、標準出力もエラー出力もcron.logというファイルに記録されることになります。詳しく知りたい方は、Unix、Linuxのコマンドでお調べいただければと思います。今は深追いしたくない方は、そんな記述をしているんんだー程度でよいと思います。

ファイルに記述し終えたら、vimで編集している人は「esc」ボタンを押したあとに「:wq」と入力しエンターを押します。そうすることで、上書き保存ができます。
。ファイルを保存しないでvimを抜ける場合「:q!」、ファイルを保存してからvimを抜ける場合「:wq」とすればよいです。
保存後、正しく実行できている場合は、指定したフォルダに「cron.log」というフォルダが作成され、1分ごとに追記されているはずです。

*/1 * * * * python /d/tmp/Kino-Code/python-cron/cron-sample.py >> /d/tmp/Kino-Code/python-cron/cron.log 2>&1

実行が確認できたら、実行を停止しましょう。
再び、「crontab -e」を実行して編集画面を開き、止めたいcron設定の頭に「#」 を書くことで実行を止めることができます。こちらを保存します。
crontab -l
正しく実行されていない場合は、crontab -lを実行しましょう。
こうするとことで、現在設定されているCronリストを表示させることができます。
設定したcrontabが保存されていない可能性もあるので確認をしてみましょう。
crontabが保存されているのに動かない場合は、そもそもそのプログラムが動くのかVSCodeなどで確認してみましょう。
他にも、ファイルの書き出しをするプログラムの場合は、絶対パスで記述をしましょう。相対パスで記載すると保存したいディレクトリに書き出せません。
VSCodeでは、うまくいくのにCronで期待通り動かない場合は、ログファイルを確認した上で、絶対パスや環境変数、あるいはエラー内容などをもう一度見直してみましょう。
どうしてもうまくいかない場合は、cronを完全に初期化する方法もあります。完全に初期化するには「crontab -r」というコマンドを実行します。
「crontab -r」は設定したcronを全て削除するので、気をつけて使ってください。
ちなみに、通常のキーボードであれば、「e」と「r」は隣通しにあり、非常に打ち間違いをしやすいです。
「crontab -e」を入力しようとして「crontab -r」を入力してしまって、意図せずcron設定を初期化してしまったということはベテランエンジニアでもよくあることなので、慎重にコマンドを打つようにしてください。
コツとしては、テキストエディタなどに「crontab -e」と入力し、間違いないことを確認してからそれをコピーしてターミナルに貼り付ける方法です。

Windowsでの設定方法

続いて Windows での設定方法を解説します。
Windowsでは、Windowsにもともと入っている、タスクスケジューラーというアプリケーションを利用します。
それではタスクスケジューラの設定の前に、動画の最初で作ったpythonファイルを保存するフォルダを作成します。windowsではmacのところで説明したcronを使っていませんが、Documentの中に、python_cronというフォルダを作成してpythonファイルを保存をします。
続いて、Windowsタスクスケジューラを起動します。タスクスケジューラはWindowsのスタートボタンをクリックして、管理ツールを選択。その中にタスクスケジューラがあるのでクリックをして起動します。
起動したら、右側のメニューから「基本タスクの作成」を選択します。
名前と説明を記入します。ここでも「python-cron」と名前をつけておきます。次へを選択。
続いてトリガを設定します。
ここでは「毎日」を選択します。次へを選択。
続いて時刻と間隔を設定します。9時15分として、1日おきとしましょう。
なお、最短だと「5分ごと」に変更することができます。のちほど設定を変更する説明をするので、そこで5分おきにする設定について説明します。
続いて操作の設定では、プログラムの開始を選択します。
スクリプトにはpythonの実行ファイルであるpython.exeのパスを指定します。anacondaをインストールしている方は、Cドライブ、ユーザーの中の、インストールしたアカウントの中の、anaconda3。その中の下の方に、python.exeがあるはずです。こちらを選択します。引数のオプションには実行するファイル名。今回はapp.pyです。開始(オプション)には実行するファイルまでのパスを指定します。今回はドキュメントの中のpython-cronのフォルダに格納されているので、アドレスバーをそのままコピーして貼り付けます。
スケジュール実行する前に、設定がうまくいっているかタスクスケジューラでプログラムを実行してみましょう。
スケジュールの名前を右クリックをして、実行するをクリックします。
そうするとCSVファイルができています。タスクスケジューラの設定がうまくいっているようです。
これで明日以降、毎日9時15分にpythonファイルが実行されます。
次に5分おきに実行できるように編集をしてみましょう。
スケジュール名を選択をして右クリック。プロパティをクリックします。
全般のタブが開いているので、隣のタブ「トリガー」を選択します。
編集をクリックします。
「繰り返しの間隔」にチェックを入れて、「5分」に選択をします。継続時間を無制限にします。継続期間には15分や1時間があるので、5分おきの実行を1時間継続させておわらせるということもできます。
OKをクリックして、再度、OKをクリックします。
これで9時15分おきに5分おきに実行されることになりました。
ただし、この動画の撮影時間が深夜1時にやっていますので、時間を今の時間に設定をして今から5分おきに実行してみて、csvファイルができるのか確認してみましょう。
今の時間に変更をします。
それでは20分後にジャンプしてみましょう。ファイルができているようです。
それでは最後に、スケジュールの停止方法です。停止したいスケジュールの名前を右クリックをして、「無効」を選択します。「状態」が無効になれば、停止できています。ちなみに、右クリックのメニューに「終了」がありますが、これは実行しているタスクを一時的に終了させたい時に使用します。「終了」を選択すると、またトリガーで設定した時刻になるとタスクが実行されます。
以上がwindowsのタスクスケジューラの実行でした。
実行できていない場合は、Pythonファイルに間違いがある可能性があるので、VSCodeで単体でファイルを実行して、正しく処理がされるか確認してみましょう。
もしくは、操作の設定の部分で間違っている可能性があります。その場合はpython.exeのパスやPythonファイルのバスが正しく設定されていない可能性があります。こちらをもう一度見直してみましょう。

Mac、Windowsのどちらでも使えるDockerを用いた設定方法

続いて、Dockerを用いた設定方法を解説します。
Dockerのインストールさえ終わってしまえば、Dockerを使うことで、WindowsでもMacでも同じ手順でスケジュール自動実行の設定をすることができます。
またDcokerを使うことで、Pythonだけではなく他の言語でのスケジュール自動実行も簡単に組むことができます。
更にDockerでの設定は、そのままレンタルサーバーなどに持っていくことができ、同じ自動化を簡単に設定させることができます。
したがって、安いレンタルサーバーを契約さえすれば、24時間自動的に作業をさせることができます。
一方、パソコンでの設定は、電源を切ってしまうとその間は自動化した作業はできません。
そのような理由があるので、Dockerで設定することをキノコードではおすすめしています。それに新しい技術を学ぶのも楽しいですからね!
ちなみに、Mac、WindowsでのDockerのインストール、設定方法は、Dockerでpythonの環境構築の解説動画があります。インストールやDockerの基本的な知識がまだの方はそちらをご覧ください。
今、右上にカードがでているはずです。また、Docker入門講座というものを現在作成中です。もう少々お待ちください。
なお、この動画では、Macで設定を進めていきますが、フォルダの場所が違うぐらいなので問題なく進められるはずです。
では設定方法を見ていきましょう。

git clone https://github.com/kino-code/docker-cron.git /Users/kinocode/Documents/docker-cron
git clone https://github.com/kino-code/docker-cron.git docker-cron

まず、gitを使ってDockerfileなどの設定に必要なファイルをあなたのパソコンにダウンロードしましょう。
gitのcloneコマンドを使うとキノコードのGitHubにあるリポジトリを、あなたのパソコンにコピーすることができます。
「https://github.com/kino-code/python-cron.git 」がコピー元、「/Users/kinocode/Documents/docker-cron」がコピー先です。
この動画では、documentにdocker-cronというフォルダを作って、そこに必要なファイルをダウンロードしてきています。場所やフォルダ名はなんでもオッケーです。
実行します。

cd /Users/kinocode/Documents/docker-cron
cd docker-cron

cdでコピー先のディレクトリに移動をします。
作成したdocker-cronというフォルダに、cron.logというファイルがないことを確認してください。

docker-compose up -d

続いてコンテナを起動します。
docker-compose upでデタッチド・モードで、cronでPythonファイルを実行するコンテナの作成と起動をします。
Dockerの詳しい解説についてはDocker入門コースを作成する予定なので、もう少々お待ちください。
実行します。
Successfullyとでればコンテナの作成と起動が完了です。

docker exec docker-cron cron restart bash

コンテナの作成が終わったら、bashを使ってcronをrestartさせましょう。
bashは、Macでいうターミナル、Windowsでいうコマンドプロンプトのようなものです。
先ほど無かったcsvファイルが書き出せています。cron.logを確認してみましょう。こちらも問題なさそうです。
簡単でしたね。

docker exec -it docker-cron bash

今回の場合、cronの設定内容を変えたい場合は、Dockerの中に入って、バッシュを起動します。

crontab -e

そして、「crontab -e」でcronの設定内容を変更することができます。
ただし、cloneコマンドでコピーをしてきたフォルダの中にrootというファイルがあります。
このrootが、crontabと同期されています。
したがって、rootファイルを変更をするとcrontabの内容も変更されます。
cronの設定内容を変更する場合、rootファイルを変更したほうが良い便利です。

docker stop docker-cron

cronをストップさせる場合は、docker stop docker-cronでdockerをストップさせるのも方法ですし、macのところで説明をしたcrontabをコメントアウトするのも方法です。

以上が行った作業概要となります。
いかがでしょうか?思った以上に簡単だと感じられた方もいらっしゃるのではないででしょうか?
Pythonではメールを自動で送信したり、スクレイピングでデータを収集したり、株価を分析したりと、様々なことができます。
その様な作業を自動化することで、更に時間を有効的に使うことができます。ぜひやってみてください。
キノコードでは業務自動化のためのPython講座があります。ほかの動画も気になる方がいればぜひご覧ください。
また、人工知能の動画や株や為替の分析方法の動画もアップしていく予定です。
新着通知がいきますので、ぜひチャンネル登録をお願いします。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」

ファイルはこちら