# typer_demo.py
import typer
from pathlib import Path
from typing import Optional
from typing_extensions import Annotated app = typer.Typer(rich_markup_mode="rich")
config_app = typer.Typer()
file_app = typer.Typer()
app.add_typer(config_app, name="config", help="Configuration management")
app.add_typer(file_app, name="file", help="File operations") # Shared verbose option
def verbose_callback(value: bool):
if value:
typer.echo("Verbose mode enabled") # 新增 quiet_callback 函数
def quiet_callback(value: bool):
if value:
typer.echo("Quiet mode enabled") # 添加 -quiet 参数
@app.callback()
def main(
verbose: Annotated[
bool,
typer.Option("--verbose", "-v", callback=verbose_callback, help="Enable verbose mode")
] = False,
quiet: Annotated[
bool,
typer.Option("--quiet", "-q", callback=quiet_callback, help="Enable quiet mode")
] = False
):
pass @config_app.command("show")
def show_config(
key: Annotated[
Optional[str],
typer.Argument(show_default=False, help="Configuration key to show")
] = None
):
"""Display configuration values"""
# Implementation would load actual config
mock_config = {"user": "admin", "age": 30}
if key:
typer.echo(f"{key}: {mock_config.get(key, 'Not found')}")
else:
for k, v in mock_config.items():
typer.echo(f"{k}: {v}") @config_app.command("set")
def set_config(
key: Annotated[str, typer.Argument(help="Configuration key to set")],
value: Annotated[str, typer.Argument(help="Value to set")],
age: Annotated[
Optional[int],
typer.Option(min=0, max=150, help="Age validation example")
] = None
):
"""Set configuration values"""
# Implementation would save config
if age is not None:
typer.echo(f"Setting age to {age} with validation")
typer.secho(f"Set {key} = {value}", fg="green") @file_app.command("upload")
def upload_file(
path: Annotated[
Path,
typer.Argument(exists=True, file_okay=True, dir_okay=False,
readable=True, resolve_path=True,
help="File path to upload")
],
chunk_size: Annotated[
int,
typer.Option("--chunk", "-c", help="Chunk size in bytes",
rich_help_panel="Advanced Options")
] = 1024,
retries: Annotated[
int,
typer.Option("--retries", "-r", help="Number of retries",
rich_help_panel="Advanced Options")
] = 3
):
"""Upload a file to remote server"""
progress = typer.progressbar(length=100, label="Uploading")
for _ in progress:
# Simulate upload progress
pass
typer.secho(f"Uploaded {path} successfully!", bold=True) @file_app.command("download")
def download_file(
url: Annotated[str, typer.Argument(help="File URL to download")],
output: Annotated[
Path,
typer.Option("--output", "-o", help="Output path",
envvar="OUTPUT_DIR")
] = Path("downloads")
):
"""Download a file from URL"""
if not output.exists():
output.mkdir(parents=True)
typer.echo(f"Downloading {url} to {output}") if __name__ == "__main__":
app()

python的typer写cli脚本如此简单的更多相关文章

  1. python——复制目录结构小脚本

    引言 有个需要,需要把某个目录下的目录结构进行复制,不要文件,当目录结构很少的时候可以手工去建立,当目录结构复杂,目录层次很深,目录很多的时候,这个时候要是还是手动去建立的话,实在不是一种好的方法,弄 ...

  2. C#调用Python脚本的简单示例

    C#调用Python脚本的简单示例 分类:Python (2311)  (0)  举报  收藏 IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Huguni ...

  3. Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!

    Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!

  4. ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas

    ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...

  5. python用于web题里写解密脚本

    题源自bugku里的WEB3 选择选项让他停止,F12后出现如下代码,一看数字就知道是ASC: 复制出来,写pyhton脚本如下,在编译器里跑一下 s='KEY{J2sa42ahJK-HS11III} ...

  6. Python Telnet弱口令爆破脚本及遇到的错误与问题

    写得时候遇到了一个很大的问题,就是我在发送用户名,接受用户名就会一直卡住.然后等了好久后提示 recv ‘\r\nSession timed out.\r\n\r\nTelnet Server has ...

  7. 不要问我有多懒,写个脚本跑django

    写django的都知道,要跑起django测试环境,只需要 python manage.py runserver 就可以了,但是时间一长,就觉得敲这个命令太浪费时间了,而我又是个懒人. 同事用的是ct ...

  8. 用Python和Pygame写游戏-从入门到精通(py2exe篇)

    这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...

  9. 写一个脚本,自动启动tomcat

    我的服务器是使用tomcat的,时不时tomcat的进程会突然结束掉,不知道为什么,从日志上看也没有任何可疑之处,貌似就这样突然没了,接下来的日志都是重新启动tomcat之后打印的了.原因找不到,但要 ...

  10. 使用C#给Linux写Shell脚本(下篇)

    在上篇的<使用C#给Linux写Shell脚本>结尾中,我们留下了一个关于C#如何调用BashShell的问题.在文章发布之后,我留意到有读者留言推荐使用“Pash”(一款类PowerSh ...

随机推荐

  1. Huawei LiteOS基于Cortex-M4 GD32F4平台移植

    1.Huawei LiteOS简介 Huawei LiteOS源码获取: https://github.com/LiteOS/LiteOS, https://gitee.com/LiteOS/Lite ...

  2. 记一次DAC转换功能修改的解决

    最近的项目捣鼓msp430需要用到dac转换以输出模拟信号,项目代码是接手前同事的 有些地方调试不通,以前没有接触过msp430芯片,更是没搞过这种芯片io口时序驱动层的东西,甚至纯c的都是头一次作为 ...

  3. dart集合list方法详解

    List数组有两种声明方式: 01==>List 常用的属性==> length 计算数组的长度 reversed 数组翻转 isEmpty 是否为空 isNotEmpty 是否不为空 L ...

  4. 对比使用DeepSeek与文新一言,了解DeepSeek的关键技术论文

    DeepSeek是国内大模型技术的新秀,最近也在业界和媒体界火爆出圈,所以想学习一下其技术. 大模型时代,学习知识,当然首先想到利用大模型,由于在过去一年,对DeepSeek使用不多,所以想和文新一言 ...

  5. ADALM-Pluto修改IP地址

    在 GNURadio 中使用 ADALM-Pluto(以下简称Pluto)模块是以 IP 地址为基础进行通信的,而固定的 IP 地址 192.168.2.1 导致一台电脑无法使用多个 Pluto,因此 ...

  6. 手把手教你部署 DeepSeek 本地模型

    本文目标:部署 DeepSeek 本地模型,并通过 Ollama 提供 API 支持,Chatbox 提供 UI 界面. 原则:不搞那些高深的玩法,让小白也能理解并真正的上手实践. 1.下载Ollam ...

  7. DC/DC layout建议

    DCDC电路的重要性不言而喻,不合理的PCB Layout会造成芯片性能变差,甚至损坏芯片.如:线性度下降.带载能力下降.工作不稳定.EMI辐射增加.输出噪声增加等. 环路面积最小原则 DC/DC电路 ...

  8. Qt 枚举类型 值、字符串、枚举类型互转

    枚举类型 class Enum : public QObject{ Q_OBJECT public: enum Fruit{ APPLE = 0, BANANA, POTATO } Q_ENUM(Fr ...

  9. 【数值计算方法】蒙特卡洛方法积分的Python实现

    原理不做赘述,参见[数值计算方法]数值积分&微分-python实现 - FE-有限元鹰 - 博客园,直接上代码,只实现1d,2d积分,N维积分的蒙特卡洛方法也类似. 代码 from typin ...

  10. selenium 提示 Non-UTF-8 code starting with '\xc4'

    解决(1):在程序最上方加上语句,# coding=gbk 解决(2):在preference下进行修改