跳至内容

带环境变量的 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 中,默认情况下显示这些环境变量。👀