kanta's spike

Pythonでコマンドラインプログラムを作成する場合の一般的な方法を知りたい。

解決策

Pythonでコマンドラインオプションを扱うには、argparse — コマンドラインオプション、引数、サブコマンドのパーサー — Python 3.12.1 ドキュメントを利用する。1

GitHubでimport argparseを含むソースコードを知らべてみると、2 以下のような構造になっているようだ。

#!/usr/bin/env python3

import argparse
import sys


def main():
    args = parse_args()
    # 以下に処理を書く


def parse_args():
    parser = argparse.ArgumentParser(description="memoru")
    # オプションを設定
    return parser.parse_args()


if __name__ == "__main__":
    sys.exit(main())

以下にコードを解説する。

シバン(#!/usr/bin/env python3)

1行目の#!/usr/bin/env python3はシバンと呼ばれる。 シバンは、スクリプト実行時に使用するインタプリタを指定するための特別な命令である。

詳細は、macOSでPythonのスクリプトをコマンドとして呼び出したいを参照。

if __name__ == "__main__":

if __name__ == "__main__":には、pythonによりスクリプトが直接実行され場合に、実行される処理を記述する。

  • aaa.pyというモジュールがありimport aaaのようにモジュールをインポートした場合、__name__にはモジュールの名前(aaa)が設定される。
  • 一方、python aaa.pyを実行した場合、その__name____main__になる。

def parse_args():

argparseのオプション指定などは関数にまとめておくと、ロジックが整理されて良さそうだ。

エラー時に、ヘルプを表示したいので、オプションのエラーチェックも、この関数内で行う方が良さそう。

sys.exit(main())

sys.exit()の引数に0orNoneを指定した場合は終了ステータスは正常終了、それ以外は異常終了になる。

sys.exit()の引数に、エラーなどのオブジェクトを指定した場合は、stderrにオブジェクトを出力し、終了ステータス1(異常終了)になる。

そのため、コマンドラインプログラムの処理をmain()にまとめておけばその戻り値をsys.exit()に渡すことができる。

まとめ

登場したAPIは以下になる。

モジュール/パッケージ API 説明
sys exit 3 SystemExit 例外を発生させインタプリタを終了します。引数で終了ステータスを指定できます。

登場した用語は以下になる。

分類 用語 説明
Python トップレベルのスクリプト環境 4 実行を開始した最初のPythonモジュールのこと。 トップレベルのスクリプト環境では、__name__ 属性に __main__ が設定されます。

参考

作成日: 2023/12/20