Typer,构建出色的 CLI。易于编码。基于 Python 类型提示。
文档:https://typer.tiangolo.com
源代码:https://github.com/fastapi/typer
Typer 是一个用于构建 CLI 应用程序的库,用户会喜欢使用它,开发人员也会喜欢创建它。基于 Python 类型提示。
它也是一个运行脚本的命令行工具,可自动将它们转换为 CLI 应用程序。
主要特点是:
typer
命令/程序,您可以使用它来运行脚本,自动将它们转换为 CLI,即使它们内部不使用 Typer。 Typer是 FastAPI 的小兄弟,它是 CLI 中的 FastAPI。
创建并激活虚拟环境,然后安装Typer :
$ pip install typer
---> 100%
Successfully installed typer rich shellingham
main.py
: def main ( name : str ):
print ( f"Hello { name } " )
该脚本内部甚至没有使用 Typer。但您可以使用typer
命令将其作为 CLI 应用程序运行。
使用typer
命令运行您的应用程序:
// Run your application
$ typer main.py run
// You get a nice error, you are missing NAME
Usage: typer [PATH_OR_MODULE] run [OPTIONS] NAME
Try 'typer [PATH_OR_MODULE] run --help' for help.
╭─ Error ───────────────────────────────────────────╮
│ Missing argument 'NAME'. │
╰───────────────────────────────────────────────────╯
// You get a --help for free
$ typer main.py run --help
Usage: typer [PATH_OR_MODULE] run [OPTIONS] NAME
Run the provided Typer app.
╭─ Arguments ───────────────────────────────────────╮
│ * name TEXT [default: None] [required] |
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --help Show this message and exit. │
╰───────────────────────────────────────────────────╯
// Now pass the NAME argument
$ typer main.py run Camila
Hello Camila
// It works! ?
这是最简单的用例,甚至没有在内部使用 Typer,但它对于简单的脚本已经非常有用。
注意:当您创建 Python 包并使用--install-completion
运行它或使用typer
命令时,自动完成功能会起作用。
现在让我们开始在您自己的代码中使用 Typer,将main.py
更新为:
import typer
def main ( name : str ):
print ( f"Hello { name } " )
if __name__ == "__main__" :
typer . run ( main )
现在你可以直接用Python运行它:
// Run your application
$ python main.py
// You get a nice error, you are missing NAME
Usage: main.py [OPTIONS] NAME
Try 'main.py --help' for help.
╭─ Error ───────────────────────────────────────────╮
│ Missing argument 'NAME'. │
╰───────────────────────────────────────────────────╯
// You get a --help for free
$ python main.py --help
Usage: main.py [OPTIONS] NAME
╭─ Arguments ───────────────────────────────────────╮
│ * name TEXT [default: None] [required] |
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --help Show this message and exit. │
╰───────────────────────────────────────────────────╯
// Now pass the NAME argument
$ python main.py Camila
Hello Camila
// It works! ?
注意:您还可以使用typer
命令调用相同的脚本,但您不需要这样做。
这是最简单的例子。
现在让我们看看更复杂一点的。
修改文件main.py
。
创建一个typer.Typer()
应用程序,并创建两个子命令及其参数。
import typer
app = typer . Typer ()
@ app . command ()
def hello ( name : str ):
print ( f"Hello { name } " )
@ app . command ()
def goodbye ( name : str , formal : bool = False ):
if formal :
print ( f"Goodbye Ms. { name } . Have a good day." )
else :
print ( f"Bye { name } !" )
if __name__ == "__main__" :
app ()
这将:
typer.Typer
应用程序。typer.run
实际上为您隐式创建了一个。@app.command()
添加两个子命令。app()
本身,就像它是一个函数一样(而不是typer.run
)。检查新的帮助:
$ python main.py --help
Usage: main.py [OPTIONS] COMMAND [ARGS]...
╭─ Options ─────────────────────────────────────────╮
│ --install-completion Install completion │
│ for the current │
│ shell. │
│ --show-completion Show completion for │
│ the current shell, │
│ to copy it or │
│ customize the │
│ installation. │
│ --help Show this message │
│ and exit. │
╰───────────────────────────────────────────────────╯
╭─ Commands ────────────────────────────────────────╮
│ goodbye │
│ hello │
╰───────────────────────────────────────────────────╯
// When you create a package you get auto-completion for free, installed with --install-completion
// You have 2 subcommands (the 2 functions): goodbye and hello
现在检查hello
命令的帮助:
$ python main.py hello --help
Usage: main.py hello [OPTIONS] NAME
╭─ Arguments ───────────────────────────────────────╮
│ * name TEXT [default: None] [required] │
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --help Show this message and exit. │
╰───────────────────────────────────────────────────╯
现在检查goodbye
命令的帮助:
$ python main.py goodbye --help
Usage: main.py goodbye [OPTIONS] NAME
╭─ Arguments ───────────────────────────────────────╮
│ * name TEXT [default: None] [required] │
╰───────────────────────────────────────────────────╯
╭─ Options ─────────────────────────────────────────╮
│ --formal --no-formal [default: no-formal] │
│ --help Show this message │
│ and exit. │
╰───────────────────────────────────────────────────╯
// Automatic --formal and --no-formal for the bool option ?
现在您可以尝试新的命令行应用程序:
// Use it with the hello command
$ python main.py hello Camila
Hello Camila
// And with the goodbye command
$ python main.py goodbye Camila
Bye Camila!
// And with --formal
$ python main.py goodbye --formal Camila
Goodbye Ms. Camila. Have a good day.
总之,您将参数类型( CLI 参数和CLI 选项)声明为函数参数。
您可以使用标准的现代 Python 类型来做到这一点。
您不必学习新的语法、特定库的方法或类等。
只是标准的Python 。
例如,对于int
:
total : int
或者对于bool
标志:
force : bool
对于文件、路径、枚举(选择)等也类似。还有一些工具可以创建子命令组、添加元数据、额外验证等。
您将获得:出色的编辑器支持,包括无处不在的完成和类型检查。
当您的用户安装您的软件包或使用typer
命令时,他们会在终端(Bash、Zsh、Fish、PowerShell)中获得:自动--help
、自动完成功能。
有关包含更多功能的更完整示例,请参阅教程 - 用户指南。
Typer站在巨人的肩膀上。它唯一需要的内部依赖项是 Click。
默认情况下,它还带有额外的标准依赖项:
rich
:自动显示格式良好的错误。shellingham
:安装完成时自动检测当前shell。shellingham
你可以只使用--install-completion
。shellingham
,您必须传递 shell 的名称来安装完成,例如--install-completion bash
。typer-slim
如果您不需要额外的标准可选依赖项,请安装typer-slim
。
当您安装时:
pip install typer
...它包含相同的代码和依赖项:
pip install " typer-slim[standard] "
standard
额外依赖项是rich
和shellingham
。
注意: typer
命令仅包含在typer
包中。
该项目根据 MIT 许可证条款获得许可。