Pythonでコマンドライン引数の受け取り方

## コマンドライン引数とは

> コマンドライン引数とは、コンピュータのコマンド入力画面（コマンドライン）からプログラムを起動する際に指定する文字列のこと。また、これをプログラム側で受け取った変数などの値。

 http://e-words.jp/w/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E5%BC%95%E6%95%B0.html


> コマンドライン引数とはmain 関数の引数のことです。 実行するときに、 コマンドラインからコマンドライン引数に値を与えることができます。

http://www.ritsumei.ac.jp/~mmr14135/johoWeb/cmnds.html

```zsh
>>> ls -a
        ↑ココ
```

## Pythonでコマンドライン引数を受け取る

Pythonでコマンドライン引数を受け取るには主に3つの方法があります。

1. `sys.argv`を使う
2. `argparse`を使う
3. `click`を使う

です。

### sys.argv

最も認知されている(と思う)方法です。Pythonの標準ライブラリのsysを使用し取得します。

```python:args.py
import sys


def main() -> None:
    args = sys.argv
    print(args)


if __name__=='__main__':
    main()
```

実行

```zsh
>>> python args.py aaa 123 hoge
['args.py', 'aaa', '123', 'hoge']
```

|メリット|デメリット|
|:---:|:---:|
|簡単に記述できる| どんな型が来るのかがわからない|
|Python標準ライブラリである| helpがない |

### argparse

コマンドライン引数専用のPython標準ライブラリ。
Help機能や型の指定などができる。扱いはクセがある。

```python:args2.py
import argparse


def main() -> None:
    parser = argparse.ArgumentParser(description='説明')

    parser.add_argument('description', help='引数の説明')  # 実行時指定しないとエラーになる。
    parser.add_argument('hoge', help='hogehoge')  # 順番が決まっている。
    parser.add_argument('--foo', help='option')  # ハイフンを1~2個つけると実行時指定しなくても良くなる。

    args = parser.parse_args()

    print(args.description)
    print(args.hoge)
    print(args.foo)


if __name__ == "__main__":
    main()
```

実行

```zsh
>>> python args2.py -h
usage: aaa.py [-h] [--foo FOO] description hoge

説明

positional arguments:
  description  引数の説明
  hoge         hogehoge

optional arguments:
  -h, --help   show this help message and exit
  --foo FOO    option

>>> python args2.py aaa bbb
aaa
bbb
None

>>> python args2.py aaa bbb --foo 123
aaa
bbb
123
```

|メリット|デメリット|
|:---:|:----:|
|機能が豊富| 複雑|
|Helpがある||
|Python標準ライブラリである||

### click

Pythonのコマンドラインパーサ。別の言い方で、コマンドライン解析用モジュール。
Python標準ライブラリではないため別途インストールが必要だが、わかりやすさと使いやすさで上記2つを抜いている。そのため、これさえおぼえておけばOK
ちなみに、`click`、`Flask`、`jinja`は[同じプロジェクト](https://palletsprojects.com/p/)。

```zsh
# インストール
pip install click
```

```python:args3.py
import click


@click.command()
@click.option('--args', prompt=True, help='説明')
@click.option('--hoge', prompt=True, is_flag=True, help='hogehoge')
def main(args: str, hoge: bool) -> None:
    if hoge:
        print(args)


if __name__ == "__main__":
    main()
```

実行

```zsh
>>> python args3.py --args foo --hoge
foo

>>> python args3.py
Args: aaaaa
Hoge [y/N]: y
aaaaa
```

|メリット|デメリット|
|:---:|:---:|
|機能が豊富|Python標準ライブラリではない
|使いやすい|
|プロンプトに表示できる|
|進捗バーも表示できる|
|パスワード入力を隠すことができる|
|複数入力もできる|

### Fire

なにこれめっちゃ楽やん！！！ってやつ。
Googleのプロジェクト

```zsh
# インストール
pip install fire
```

```python:args4.py
import fire

def main(args: str, hoge: bool) -> None:
    if hoge:
        print(args)


if __name__ == "__main__":
    fire.Fire(main)   # これにするだけ
```

実行

```zsh
>>> python args3.py --args foo --hoge
foo
```

|メリット|デメリット|
|:---:|:---:|
|使いやすい|Python標準ライブラリではない|
|helpはDocstringから解析してくれる|

### 参考資料
[Pythonでコマンドライン引数を扱う方法（sys.argv, argparse）](https://note.nkmk.me/python-command-line-arguments/)
[Pythonでコマンドライン引数を渡す方法](https://intellectual-curiosity.tokyo/2018/12/14/python%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E5%BC%95%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%99%E6%96%B9%E6%B3%95/)
[ArgumentParserの使い方を簡単にまとめた](https://qiita.com/kzkadc/items/e4fc7bc9c003de1eb6d0)
[Python: コマンドラインパーサの Click が便利すぎた](https://blog.amedama.jp/entry/2015/10/14/232045)