初心者データサイエンティストの備忘録

調べたことは全部ここに書いて自分の辞書を作る

【Python】argparseとタスクスケジューラを使った定期実行

Pythonのコードに引数を渡してコマンドラインで実行したいときがあります。その際に、用いるモジュールがargparseです。 このargparseの使い方についての記事はググれば多く見つかります。しかし、使いどころに関する記事は多くないです。そこで、私なりにargparseの使いどころを考えてみました。

※使い方については、下記の記事を参考にしました。

docs.python.org

qiita.com

argparseができること

argparseを使うと、コマンドライン上でPythonコードに引数を渡して実行することができます。例えば、下記のPythonコードを実行することを考えます。

class UserInfo:
    def __init__(self, name):
        self.name = name
    
    def print_name(self):
        print(self.name) 


user_info = UserInfo(name="Suzuki")
user_info.print_name()

これは.pyでも.ipynb(Jupyter)でも実行できるコードです。これを下記のような形でコマンドラインから実行させたいときに使うのが、argparseです。

python 適当なファイル名.py "Suzuki"

上記の例を実装してみます。まず、下記のような.pyファイルを作成します。ファイル名はarg_user_info.pyとしました。

import argparse

# argparseの設定
parser = argparse.ArgumentParser(description="user_infoを実行するためのargparser")
parser.add_argument("name")
args = parser.parse_args()

# ユーザの情報を取り扱うclass
class UserInfo:
    def __init__(self, name):
        self.name = name
    
    def print_name(self):
        print(self.name) 

user_info = UserInfo(name=args.name)
user_info.print_name()

そしてコマンドラインで次を実行するだけです。

python arg_user_info.py "Suzuki"

上記を実行して、コマンドライン上にSuzukiと表示されればOKです。

argparseの使いどころ

argparseは下記のようなときに使います。

  • コマンドライン上で.pyファイルを動かす
  • そのときに引数を.pyファイルに渡す必要がある

なので、argparseの使いどころを考えるため、バッチファイルなどで.pyを動かさなければいけない状況を考えることにしました。

色々なシチュエーションがあると思うのですが、「ここでは.pyファイルを引数を変えて定常実行したい」というシチュエーションを考えてみます。恐らくこれが基本的な使い方なのではないかと思うからです。

今回は、図1が実現できるようにスクリプトの作成やタスクスケジューラの設定をしようと思います。

図1:やりたいこと

そのために、図2の構成でタスクスケジューラや各コードを構築していきます。

図2:タスクマネージャーと各コードの関係性

実装

print_time.pyでは、受け取った引数をファイル出力したいので、下記のようなスクリプトにします。

class WriteAtTime:
    def __init__(self, at_time):
        self._at_time = at_time

    @property
    def at_time(self):
        return self._at_time

    def return_at_time(self):
        return self.at_time

    def write_at_time_on_text(self):
        f = open(self._at_time+".txt", 'w')
        f.write(self.return_at_time())
        f.close()

arg_print_time.py

arg_print_time.pyはmkdir_at_time.batから引数(現在時刻)を受け取り、print_time.pyで実装したwrite_at_time_on_text()を実行します。

import argparse
from print_time import WriteAtTime

parser = argparse.ArgumentParser(description="print_hello_time.pyをbat実行させるためのスクリプト")
parser.add_argument("t")
args = parser.parse_args()

ins_print_hello_time = WriteAtTime(at_time=args.t)
ins_print_hello_time.write_at_time_on_text()

mkdir_at_time.bat

ここでは、現在時刻を取得し、ディレクトリの作成とarg_print_time.pyの実行を行います。

set time2=%time: =0%
set time3=%time2:~0,2%%time2:~3,2%%time2:~6,2%
mkdir %time3%
cd %time3%
python ..\arg_print_time.py %time3%

タスクスケジューラ

1分間隔で15分間mkdir_at_time.batを実行し続けるようにタスクスケジューラを設定しました。 設定の仕方は下記を参照しました。

minto.tech

se-abeaver.com

まとめ

  • argparseはコマンド上で引数を渡して.pyを実行する際に用いる
  • 上記の作業が必要になるのは、タスクスケジューラなどバッチファイルしか実行できないソフトを使って.pyを実行したいときなど