CLIツールにPythonスクリプトを渡して、柔軟にカスタマイズできるようにしたい
環境
- Python 3.6
背景
PythonでCLIツールを作成しています。
あるWebサービスから情報を取得して、以下のようなフォーマットでCSVファイルを出力するようなCLIです。
実際には20~40列あります。
name,a_seconds,b_seconds
Alice,3600,1800
Bob,3600,3600
コマンドは以下のように実行します。
$ python print_csv.py
やりたいこと
CSVのいくつかの列は、ユーザがカスタマイズして出力できるようにしたいです。
たとえば、a_b_hours
列を出力したい場合、以下のような設定をコマンドの外から渡せるようにしたいです。
column_name = "a_b_hours"
def column_func(df):
df[column_name] = df["a_secons"] + df["b_seconds"]
出力結果
name,a_seconds,b_seconds,a_b_hours
Alice,3600,1800,1.5
Bob,3600,3600,2
質問
上記の機能を提供するために、コマンドの外から、Pythonスクリプトを渡すにはどうすればよいでしょうか?
以下のようなコマンドを実行できるようにしたいです。
$ python main.py 3
num = 3
$ python main.py 3 --script custom.py
num * num = 9
main.py
def custom_print(num: int):
"""実際には、10~100行の処理を想定している"""
print(f"num = {num}")
if if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("num", type=int, help="出力する整数")
parser.add_argument("--script", help="外部から注入するスクリプト")
args = parser.parse_args()
if args.script is not None:
# args.scriptを使ってcustom_printを変更する
custom_print = ...
custom_print(args.num)
custom.py
カスタマイズしたい場合、Pythonスクリプトを作成して、このファイルをコマンドに渡します。
def custom_print(num: int):
print(f"num * num = {num*num}")
考えたこと
exec
を使えばよいんですかね?