環境変数付き 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