環境

  • 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を使えばよいんですかね?