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 ...
随机推荐
- SpringBoot 集成腾讯云(对象存储、短信)
https://developer.aliyun.com/article/831473 https://blog.csdn.net/weixin_45626288/article/details/11 ...
- weixueyuan-Nginx日志管理与监控8
https://www.weixueyuan.net/nginx/log/ Nginx访问日志配置 Nginx 的访问日志主要记录用户客户端的请求信息(见下表).用户的每次请求都会记录在访问日志中,a ...
- C# webapi 允许跨域(.NET Framework)
实际项目中,对于WebApi的访问不一定都在同一域名下,所以进行跨域访问的时候,可能会出现如下提示:请求的资源不支持 http 方法"OPTIONS".需要对WebApi进行设置. ...
- Centos7搭建mailx邮件应用
邮件发送原理图 邮件用户代理(MUA,Mail User Agent)邮件传送代理(MTA,Mail Transport Agent)邮件分发代理(MDA,Mail Deliver Agent) 邮件 ...
- NIT GREAT NITYACKE DESTROYS THE UNIVERSE
线段树 一般线段树维护的东西是什么?设其维护的信息的半群 \((A,+)\),维护标记的半群 \((T,\times)\) 和一种运算 \(*\mapsto A*T\to A\). 要求 \((b+c ...
- .NET最佳实践:避免同步读取HttpRequest
为什么要避免同步读取 ASP.NET Core 中的所有 I/O 操作都是异步的.服务器实现了 Stream 接口,该接口同时具备同步和异步的方法. 在进行 I/O 操作时,应优先使用异步方法,以避免 ...
- Hive表误删恢复
一.简介 因hive表删除后,hdfs文件会先放入回收站,定期清理回收站.在回收之前可以进行清理数据 二.恢复步骤 2.1 看表存储是否损坏select type from dw.ods_test1 ...
- 用python做时间序列预测四:*稳/非*稳时间序列
上篇文章简单提到了应该用*稳时间序列做预测,本文将介绍具体概念和原因. Stationary Series *稳序列 *稳序列有三个基本标准: 1.序列的均值(mean)不应该是时间的函数(意思是不应 ...
- 在 Visual Studio 上体验腾讯云 AI 代码助手
本文以以 Visual Studio 2022 为例. 第一步 安装[腾讯云 AI 代码助手] 打开以 Visual Studio 2022,依次点击工具栏中的-** 扩展 - ** 管理扩展 ,在 ...
- excel 数字转中文大写金额
1.在单元格中输入公式: =SUBSTITUTE(SUBSTITUTE(IF(-RMB(A1,2),TEXT(A1,";负")&TEXT(INT(ABS(A1)+0.5%) ...