環境変数を使用した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では、これらの環境変数はデフォルトで表示されます。👀