用 argparse 给 Python 小脚本加命令行参数:不用改代码就能换输入
新手写 Python 小脚本时,经常会把要处理的文件名、要重复的次数直接写进代码里。比如统计一个文本文件有多少行,路径写成 notes.txt,下次想统计别的文件,就要打开代码改一行、再保存、再运行。改得多了,还容易顺手改错别的地方。
更省事的办法是把这些会变的东西变成“命令行参数”:运行脚本时在后面带上,脚本读到什么就处理什么,代码本身不用动。Python 标准库自带的 argparse 就是做这件事的工具,不需要额外安装,适合给手头的小脚本加一层“开关”。
先看一个写死的例子
假设我们有一个统计行数的小脚本 count_lines.py,一开始可能是这样写的:
with open("notes.txt", encoding="utf-8") as f:
lines = f.readlines()
print("一共", len(lines), "行")
它只能统计 notes.txt。想统计 report.txt,就得改代码。把文件名变成参数,脚本立刻通用起来。
三步给脚本加上参数
argparse 的用法可以概括为三步:创建解析器、说明要哪些参数、解析后拿来用。
import argparse
parser = argparse.ArgumentParser(description="统计文本文件的行数")
parser.add_argument("--file", required=True, help="要统计的文本文件")
parser.add_argument("--encoding", default="utf-8", help="文件编码,默认 utf-8")
args = parser.parse_args()
with open(args.file, encoding=args.encoding) as f:
lines = f.readlines()
print("一共", len(lines), "行")
运行方式也跟着变了:
python count_lines.py --file notes.txt
python count_lines.py --file report.txt --encoding utf-8
–file 是必选参数,没给就会报错并提示用法;–encoding 给了默认值,不写就按 utf-8 处理。参数名一旦定下来,运行命令就有了固定格式,别人拿到脚本也能照着用。
再加两个实用的参数
只加一个文件参数还不够直观,再补两个常见类型,就能覆盖新手小脚本的大多数场景。
parser.add_argument("--top", type=int, default=0, help="只统计前 N 行,0 表示全部")
parser.add_argument("--verbose", action="store_true", help="打印更多过程信息")
–top 用 type=int 告诉解析器要把输入转成整数,这样后面才能直接和数字比较;–verbose 是开关型参数,写上就表示开启,不写就关闭,不需要再传一个 true 或 false。
使用的时候可以组合起来:
python count_lines.py --file notes.txt --top 5 --verbose
一个小建议:参数多了之后,先运行一次 --help 看看。argparse 会自动生成帮助信息,把每个参数的含义和默认值列出来,相当于脚本自带一份简短说明书:
python count_lines.py --help
三个新手容易踩的坑
第一,忘记写 type=int。命令行传进来的东西默认都是字符串,不转类型就直接做数字比较,程序要么报错,要么算出奇怪的结果。需要数字的地方,定义参数时就写清楚类型。
第二,可选参数没有默认值。参数没给值时,程序拿到的就是 None,后面一旦直接使用就会出问题。能给默认值的地方就给一个,哪怕只是 0 或者空字符串,脚本的容错能力会好很多。
第三,参数名起得太随意。–f、–x 这种名字过两天自己也看不懂,尽量用 --file、–top 这样一看就明白的词。如果常用某个参数,还可以加一个短名字,比如 “-n” 和 “–top” 同时支持,写起来更顺手。
给自己留一个小练习
找一个你以前写过的小脚本,比如定时提醒、整理文件或者读配置的脚本,给它加一个命令行参数:可以是要处理的文件,也可以是重复次数或者开关。先只加一个,跑通 --help 和一次真实运行,再慢慢加第二个。
把“会变的东西”从代码里抽出来,是新手写脚本时很值得养成的一个小习惯。脚本还是那个脚本,但它开始能适应不同的输入了;以后换个文件、换个次数,不用再翻代码,改一行命令就够了。
- 点赞
- 收藏
- 关注作者
评论(0)