コンテンツにスキップ

環境変数を使用したCLI引数

コマンドラインでCLI引数として提供されない場合、環境変数から値を読み取るようにCLI引数を構成することもできます。

それを行うには、typer.Argument()envvarパラメータを使用します。

import typer
from typing_extensions import Annotated


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


if __name__ == "__main__":
    typer.run(main)

ヒント

可能であれば、Annotatedバージョンを使用することを推奨します。

import typer


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


if __name__ == "__main__":
    typer.run(main)

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

// Check the 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.

// Call it without a CLI argument
$ python main.py

Hello Mr. World

// Now pass a value for the CLI argument
$ python main.py Czernobog

Hello Mr. Czernobog

// And now use the environment variable
$ AWESOME_NAME=Wednesday python main.py

Hello Mr. Wednesday

// CLI arguments take precedence over env vars
$ AWESOME_NAME=Wednesday python main.py Czernobog

Hello Mr. Czernobog

複数の環境変数

単一の環境変数に限定されるわけではなく、コマンドラインで渡されなかった場合に値を取得するために使用できる環境変数のリストを宣言できます。

import typer
from typing_extensions import Annotated


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


if __name__ == "__main__":
    typer.run(main)

ヒント

可能であれば、Annotatedバージョンを使用することを推奨します。

import typer


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


if __name__ == "__main__":
    typer.run(main)

確認してください。

// Check the 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.

// Try the first env var
$ AWESOME_NAME=Wednesday python main.py

Hello Mr. Wednesday

// Try the second env var
$ GOD_NAME=Anubis python main.py

Hello Mr. Anubis

ヘルプテキストから環境変数を隠す

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

import typer
from typing_extensions import Annotated


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


if __name__ == "__main__":
    typer.run(main)

ヒント

可能であれば、Annotatedバージョンを使用することを推奨します。

import typer


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


if __name__ == "__main__":
    typer.run(main)

確認してください。

//Check the help
$ python main.py --help

// It won't show the env var
Usage: main.py [OPTIONS] [NAME]

Arguments:
  [NAME]  [default: World]

Options:
  --help                Show this message and exit.

// But it will still be able to use it
$ AWESOME_NAME=Wednesday python main.py

Hello Mr. Wednesday

技術詳細

Clickアプリケーションでは、環境変数はデフォルトで非表示になっています。🙈

Typerでは、これらの環境変数はデフォルトで表示されます。👀