python的typer写cli脚本如此简单
# 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脚本如此简单的更多相关文章
- python——复制目录结构小脚本
引言 有个需要,需要把某个目录下的目录结构进行复制,不要文件,当目录结构很少的时候可以手工去建立,当目录结构复杂,目录层次很深,目录很多的时候,这个时候要是还是手动去建立的话,实在不是一种好的方法,弄 ...
- C#调用Python脚本的简单示例
C#调用Python脚本的简单示例 分类:Python (2311) (0) 举报 收藏 IronPython是一种在 .NET及 Mono上的 Python实现,由微软的 Jim Huguni ...
- Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!
Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!
- ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas
? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...
- python用于web题里写解密脚本
题源自bugku里的WEB3 选择选项让他停止,F12后出现如下代码,一看数字就知道是ASC: 复制出来,写pyhton脚本如下,在编译器里跑一下 s='KEY{J2sa42ahJK-HS11III} ...
- Python Telnet弱口令爆破脚本及遇到的错误与问题
写得时候遇到了一个很大的问题,就是我在发送用户名,接受用户名就会一直卡住.然后等了好久后提示 recv ‘\r\nSession timed out.\r\n\r\nTelnet Server has ...
- 不要问我有多懒,写个脚本跑django
写django的都知道,要跑起django测试环境,只需要 python manage.py runserver 就可以了,但是时间一长,就觉得敲这个命令太浪费时间了,而我又是个懒人. 同事用的是ct ...
- 用Python和Pygame写游戏-从入门到精通(py2exe篇)
这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...
- 写一个脚本,自动启动tomcat
我的服务器是使用tomcat的,时不时tomcat的进程会突然结束掉,不知道为什么,从日志上看也没有任何可疑之处,貌似就这样突然没了,接下来的日志都是重新启动tomcat之后打印的了.原因找不到,但要 ...
- 使用C#给Linux写Shell脚本(下篇)
在上篇的<使用C#给Linux写Shell脚本>结尾中,我们留下了一个关于C#如何调用BashShell的问题.在文章发布之后,我留意到有读者留言推荐使用“Pash”(一款类PowerSh ...
随机推荐
- canal源码分析简介-2
3.0 server模块 server模块的核心接口是CanalServer,其有2个实现类CanalServerWithNetty.CanalServerWithEmbeded.关于CanalSer ...
- CentOS扩容boot分区并升级内核
本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon 前言 由于安装k8s需要升级内核,但我自己的的boot分区只有200M大小,无法安装新内核,所以干脆把swa ...
- SourceTree SSH第一次登录需要交互确认的问题
问题 在SourceTree SSH配置完ssh之后向上提交代码的时候发现: The server's host key is not cached in the registry. You have ...
- solon-flow 你好世界!
solon-flow 是一个基础级的流处理引擎(可用于业务规则.决策处理.计算编排.流程审批等......).提供有 "开放式" 驱动定制支持,像 jdbc 有 mysql 或 p ...
- 又来新活了!AI电商搜索,或是下一个90亿美元独角兽?
图源:https://www.shopencore.ai/ 全新体验,大模型驱动的对话式购物搜索. Encore, 由2024年10月成立的美国初创公司开发.定位于二手商品对话式购物搜索,最终目标为个 ...
- 天翼云VPC支持专线健康检查介绍
本文分享自天翼云开发者社区<天翼云VPC支持专线健康检查介绍>,作者:汪****波 天翼云支持本地数据中心IDC(Internet Data Center)通过冗余专线连接到天翼云云上专有 ...
- SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
在SQL Server数据库中,统计信息更新(UPDATE STATISTICS)会被其它会话阻塞吗?统计信息更新(UPDATE STATISTICS)会引起其它会话阻塞吗?在回答这两个问题前,我们必 ...
- nacos(三): 创建第一个生产者producer(单体)
因为springcloud各个版本之间适配非常神经质,所以事件明确,在本实验环节中:使用的是JDK8,选择的springboot版本是2.7.6. 可以借助阿里云的脚手架(点此进入)帮我们创建第一个s ...
- datawhale-leetcode打卡:第026~037题
反转链表(leetcode 206) 这个题目我就比较流氓了,干脆新建链表翻转过来算了.但是完蛋,超出内存限制,那我就只能两两换了.这里比较大的技巧就是可以用一个空节点进行置换. # Definiti ...
- 深度学习:测试是否含有gpu的环境
在我们跑深度学习的时候,绕不开的一定是gpu显卡,但是如何检测是否使用gpu那?下面我讲提供一段代码,可以检测自己是否开启了gpu或含有gpu. import torch # 检查是否支持 CUDA( ...