Skip to content

環境変数付き CLI 引数

CLI 引数 がコマンドラインで渡されなかった場合に、環境変数から値を読むよう設定することもできます。

Tip

環境変数について詳しくは、Environment Variables を参照してください。

そのためには、typer.Argument()envvar パラメータを使います。

from typing import Annotated

import typer

app = typer.Typer()


@app.command()
def main(name: Annotated[str, typer.Argument(envvar="AWESOME_NAME")] = "World"):
    print(f"Hello Mr. {name}")


if __name__ == "__main__":
    app()
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

import typer

app = typer.Typer()


@app.command()
def main(name: str = typer.Argument("World", envvar="AWESOME_NAME")):
    print(f"Hello Mr. {name}")


if __name__ == "__main__":
    app()

この場合、CLI 引数 name のデフォルト値は "World" ですが、コマンドラインで値が渡されなければ、環境変数 AWESOME_NAME に設定された値も読み取ります。

// help を確認
$ python main.py --help

Usage: main.py [OPTIONS] [NAME]

Arguments:
  [NAME]  [env var: AWESOME_NAME;default: World]

Options:
  --help                Show this message and exit.

// CLI 引数なしで実行
$ python main.py

Hello Mr. World

// 今度は CLI 引数を渡す
$ python main.py Czernobog

Hello Mr. Czernobog

// 次に環境変数を使う
$ AWESOME_NAME=Wednesday python main.py

Hello Mr. Wednesday

// CLI 引数は env var より優先される
$ AWESOME_NAME=Wednesday python main.py Czernobog

Hello Mr. Czernobog

複数の環境変数

環境変数は 1 つに限りません。コマンドラインで値が渡されなかったときに使える環境変数のリストを宣言できます。

from typing import Annotated

import typer

app = typer.Typer()


@app.command()
def main(
    name: Annotated[str, typer.Argument(envvar=["AWESOME_NAME", "GOD_NAME"])] = "World",
):
    print(f"Hello Mr. {name}")


if __name__ == "__main__":
    app()
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

import typer

app = typer.Typer()


@app.command()
def main(name: str = typer.Argument("World", envvar=["AWESOME_NAME", "GOD_NAME"])):
    print(f"Hello Mr. {name}")


if __name__ == "__main__":
    app()

確認してみましょう。

// help を確認
$ python main.py --help

Usage: main.py [OPTIONS] [NAME]

Arguments:
  [NAME]  [env var: AWESOME_NAME, GOD_NAME;default: World]

Options:
  --help                Show this message and exit.

// 1 つ目の env var を試す
$ AWESOME_NAME=Wednesday python main.py

Hello Mr. Wednesday

// 2 つ目の env var を試す
$ GOD_NAME=Anubis python main.py

Hello Mr. Anubis

help テキストから env var を隠す

デフォルトでは、使用される環境変数は help テキストに表示されますが、show_envvar=False で無効にできます。

from typing import Annotated

import typer

app = typer.Typer()


@app.command()
def main(
    name: Annotated[
        str, typer.Argument(envvar="AWESOME_NAME", show_envvar=False)
    ] = "World",
):
    print(f"Hello Mr. {name}")


if __name__ == "__main__":
    app()
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

import typer

app = typer.Typer()


@app.command()
def main(name: str = typer.Argument("World", envvar="AWESOME_NAME", show_envvar=False)):
    print(f"Hello Mr. {name}")


if __name__ == "__main__":
    app()

確認してみましょう。

// help を確認
$ python main.py --help

// env var は表示されない
Usage: main.py [OPTIONS] [NAME]

Arguments:
  [NAME]  [default: World]

Options:
  --help                Show this message and exit.

// それでも env var は使える
$ AWESOME_NAME=Wednesday python main.py

Hello Mr. Wednesday