typer 命令¶
typer 命令为您的小型脚本在终端中提供 ✨ 完成 ✨ 功能。即使它们在内部没有使用 Typer。当然,如果您在脚本中使用 **Typer**,它会更好地工作。
如果您有一个使用 **Typer** 的小型自定义 Python 脚本(也许是某个项目的一部分),用于一些小型任务,并且它没有复杂/重要到足以创建一个完整的可安装 Python 包(可以用 pip 安装的东西),那么它可能最有用。
在这种情况下,您可以在终端中使用 typer 命令运行您的程序,它将为您的脚本提供完成功能。
typer 命令还具有为您的 Typer 程序生成 Markdown 文档的功能 📝。
安装¶
当您使用以下命令安装 Typer 时
pip install typer
...它包含 typer 命令。
如果您不想使用 typer 命令,可以改为安装
pip install typer-slim
您仍然可以通过将 Typer 库作为模块调用来使用它
python -m typer
安装完成¶
然后,您可以使用以下命令为 typer 命令安装完成
$ typer --install-completion
bash completion installed in /home/user/.bashrc.
Completion will take effect once you restart the terminal.
示例脚本¶
假设您有一个在 my_custom_script.py 中使用 Typer 的脚本
from typing import Optional
import typer
app = typer.Typer()
@app.command()
def hello(name: Optional[str] = None):
if name:
typer.echo(f"Hello {name}")
else:
typer.echo("Hello World!")
@app.command()
def bye(name: Optional[str] = None):
if name:
typer.echo(f"Bye {name}")
else:
typer.echo("Goodbye!")
if __name__ == "__main__":
app()
为了使其正常工作,您还需要安装 Typer
$ python -m pip install typer
---> 100%
Successfully installed typer
使用 Python 运行¶
然后,您可以使用普通的 Python 运行您的脚本
$ python my_custom_script.py hello
Hello World!
$ python my_custom_script.py hello --name Camila
Hello Camila!
$ python my_custom_script.py bye --name Camila
Bye Camila
直接使用 Python 运行它没有问题。事实上,如果其他代码或程序使用您的脚本,这可能是最好的方法。
⛔️ 但是,在您的终端中,当您按下 TAB 键时,您将不会获得任何子命令或选项的完成,例如 hello、bye 和 --name。
使用 typer 命令运行¶
您也可以使用 typer 命令运行相同的脚本
$ typer my_custom_script.py run hello
Hello World!
$ typer my_custom_script.py run hello --name Camila
Hello Camila!
$ typer my_custom_script.py run bye --name Camila
Bye Camila
- 您不需要直接使用
python,而是使用typer命令。 - 在文件名之后,添加子命令
run。
✔️ 如果您按照上述方法为 typer 命令安装了完成,那么当您按下 TAB 键时,您将获得 ✨ 所有内容的完成 ✨,包括脚本的所有子命令和选项,例如 hello、bye 和 --name 🚀。
如果主函数¶
因为 typer 命令不会使用带有以下内容的代码块
if __name__ == "__main__":
app()
...如果您只使用 typer 命令调用该脚本,也可以将其删除。
运行其他文件¶
typer 命令可以运行任何使用 **Typer** 的脚本,但脚本甚至不需要使用 **Typer**。
您甚至可以运行一个包含可以使用 typer.run() 的函数的文件,即使脚本没有使用 typer.run() 或其他任何东西。
例如,像这样的 main.py 文件仍然可以工作
def main(name: str = "World"):
"""
Say hi to someone, by default to the World.
"""
print(f"Hello {name}")
然后你可以用它来调用
$ typer main.py run --help
Usage: typer run [OPTIONS]
Say hi to someone, by default to the World.
Options:
--name TEXT
--help Show this message and exit.
$ typer main.py run --name Camila
Hello Camila
它还将为 --name *CLI 选项* 等提供自动补全功能。
运行包或模块¶
您可以传递一个模块(可能在包中)来导入,而不是文件路径。
例如
$ typer my_package.main run --help
Usage: typer run [OPTIONS]
Options:
--name TEXT
--help Show this message and exit.
$ typer my_package.main run --name Camila
Hello Camila
选项¶
您可以指定以下 **CLI 选项** 之一
--app:包含Typer()对象的变量名称,作为主应用程序运行。--func:包含将与typer.run()一起使用的函数的变量名称。
默认值¶
当您使用 typer 命令运行脚本时,它将使用以下优先级的应用程序
- 来自
--app*CLI 选项* 的应用程序对象。 - 从
--func*CLI 选项* 转换为 **Typer** 应用程序的函数(就像使用typer.run()时一样)。 - 名称为
app、cli或main的变量中的 **Typer** 应用程序。 - 文件中第一个可用的 **Typer** 应用程序,无论名称如何。
- 名称为
main、cli或app的变量中的函数。 - 文件中第一个函数,无论名称如何。
生成文档¶
您还可以使用 typer 命令为您的 **Typer** 应用程序生成 Markdown 文档。
带有文档的示例脚本¶
例如,您可以有一个像这样的脚本
import typer
app = typer.Typer(help="Awesome CLI user manager.")
@app.command()
def create(username: str):
"""
Create a new user with USERNAME.
"""
print(f"Creating user: {username}")
@app.command()
def delete(
username: str,
force: bool = typer.Option(
...,
prompt="Are you sure you want to delete the user?",
help="Force deletion without confirmation.",
),
):
"""
Delete a user with USERNAME.
If --force is not used, will ask for confirmation.
"""
if force:
print(f"Deleting user: {username}")
else:
print("Operation cancelled")
@app.command()
def delete_all(
force: bool = typer.Option(
...,
prompt="Are you sure you want to delete ALL users?",
help="Force deletion without confirmation.",
),
):
"""
Delete ALL users in the database.
If --force is not used, will ask for confirmation.
"""
if force:
print("Deleting all users")
else:
print("Operation cancelled")
@app.command()
def init():
"""
Initialize the users database.
"""
print("Initializing user database")
if __name__ == "__main__":
app()
使用 typer 命令生成文档¶
然后,您可以使用 typer 命令为其生成文档。
您可以使用子命令 utils。
然后是子命令 docs。
$ typer some_script.py utils docs
提示
如果你只安装了typer-slim,并且没有typer命令,你仍然可以使用以下命令生成文档:
$ python -m typer some_script.py utils docs
选项:
--name TEXT: 在文档中使用的 CLI 程序名称。--output FILE: 用于写入文档的输出文件,例如 README.md。--title TEXT: 在文档中使用的标题,默认情况下为命令的名称。
例如
$ typer my_package.main utils docs --name awesome-cli --output README.md
Docs saved to: README.md
示例文档输出¶
例如,对于前面的脚本,生成的文档将如下所示:
awesome-cli¶
很棒的 CLI 用户管理器。
用法:
$ awesome-cli [OPTIONS] COMMAND [ARGS]...
选项:
--install-completion: 为当前 shell 安装补全。--show-completion: 显示当前 shell 的补全,以便复制或自定义安装。--help: 显示此消息并退出。
命令:
create: 使用 USERNAME 创建新用户。delete: 使用 USERNAME 删除用户。delete-all: 删除数据库中的所有用户。init: 初始化用户数据库。
awesome-cli create¶
使用 USERNAME 创建新用户。
用法:
$ awesome-cli create [OPTIONS] USERNAME
选项:
--help: 显示此消息并退出。
awesome-cli delete¶
使用 USERNAME 删除用户。
如果未使用 --force,将要求确认。
用法:
$ awesome-cli delete [OPTIONS] USERNAME
选项:
--force / --no-force: 强制删除,无需确认。[必需]--help: 显示此消息并退出。
awesome-cli delete-all¶
删除数据库中的所有用户。
如果未使用 --force,将要求确认。
用法:
$ awesome-cli delete-all [OPTIONS]
选项:
--force / --no-force: 强制删除,无需确认。[必需]--help: 显示此消息并退出。
awesome-cli init¶
初始化用户数据库。
用法:
$ awesome-cli init [OPTIONS]
选项:
--help: 显示此消息并退出。