资讯动态

Python 命令行参数:从 sys.argv 到 argparse

发布时间:2026/10/3 7:26:21 来源:尧图企业网站定制
命令行参数指的是程序启动时、在命令里一起传给它的那串字符串python 脚本.py 你好 123这里的脚本.py、你好、123就是命令行参数。它解决的核心问题只有一个让程序在无人值守的情况下拿到外部数据。不用改代码对比把数据写死在代码里不用人盯着对比input()1. 参数从哪来shell 与 PATH命令不是python 直接看到的中间有个中间人——shell命令解释器就是 PyCharm 里的终端。它做两步通过环境变量PATH找到python这个程序python3.6/python3.12把命令里剩下的内容原封不动丢给python。你敲的 python 脚本.py 你好 123 │ └────────┴──────┘ │ ↓ shell 通过 PATH 这几个词 找到这个程序 原封不动塞给 python关键对 shell 来说脚本.py、你好、123只是一串字符串。这串被丢给 python 的字符串就是命令行参数。所以命令行参数里的参数是传给 python 解释器的参数。2. 从 sys.argv 到 argparsesys.argv能用但别这么写Python 用标准库sys里的sys.argv接收参数它是一个列表import sys print(sys.argv)$ python test.py 你好 123 [test.py, 你好, 123]两个要注意的点sys.argv[0]是脚本名本身真正的参数从sys.argv[1]开始。列表里全是字符串123不是数字。所以想做运算必须手动转换import sys result int(sys.argv[1]) 1 # 不转就 TypeError更阴险的坑123 1不会报错而是拼接成1231。这种不报错的错误最难查。一旦参数变多、变复杂sys.argv的三个死穴就暴露了死穴表现位置靠记第几个参数是什么全靠记忆传多传少要自己写if判断类型手动每个参数都得手动int()还得记住哪个该转没有说明书用户不知道有哪些参数、什么顺序、哪些必填敲错也没有友好提示argparse直接用这个参数一复杂就别再用sys.argv裸写了直接用标准库argparseimport argparse parser argparse.ArgumentParser(description备份脚本) parser.add_argument(--src, requiredTrue, help源目录) parser.add_argument(--dst, requiredTrue, help目标目录) parser.add_argument(--days, typeint, default7, help保留天数) parser.add_argument(--verbose, actionstore_true, help打印详细日志) args parser.parse_args() print(args.src, args.dst, args.days, args.verbose)它一次解决了sys.argv的所有痛点能力写法作用名字--src用args.src取值不用记位置类型typeint自动做int()转换默认值default7用户不传就用默认值开关actionstore_true敲了是True不敲是False帮助help...自动生成-h帮助信息校验requiredTrue缺参数或类型不对自动报错3. 两类参数位置参数 vs 可选参数argparse里的参数分两类看add_argument的第一个参数带不带--就能区分不带--位置参数带--可选参数怎么识别靠位置第几个靠名字--days能不能不传通常必须传可以不传有默认值顺序不能乱随便适合装什么程序最核心、不给就没法干活的输入配置项、开关这类次要信息parser.add_argument(filename) # 不带 -- → 位置参数必填 parser.add_argument(--days, typeint, default7) # 带 -- → 可选参数有默认值 parser.add_argument(--verbose, actionstore_true) # 带 -- → 可选参数开关$ python test.py 报告.txt → 报告.txt 7 False $ python test.py 报告.txt --days 30 → 报告.txt 30 False $ python test.py → 报错the following arguments are required: filename4. 延伸单横杠 vs 双横杠写法叫法特点-h短选项一个横杠 通常一个字母打字快--help长选项两个横杠 一个单词看得懂它们常常是同一个参数的两种写法一次就能把两个名字绑给同一个参数parser.add_argument(-v, --verbose, actionstore_true)于是下面三种敲法效果完全一样python test.py -v python test.py --verbose python test.py -v --verbose注意判断位置参数 vs 可选参数看的是有没有横杠不是有几个横杠。-v和--verbose都是可选参数。另外短选项可以合并-abc等价于-a -b -c。不是 Python 独有的git / docker 同理命令行参数是所有命令行程序共用的通用约定来自 Unix / POSIX。git是 C 写的、docker是 Go 写的但命令行长相一样git commit -m 修复登录bug │ │ │ │ │ │ │ └── 可选参数 -m 的值 │ │ └── 可选参数短选项 │ └── 位置参数子命令 └── 程序名语言不同约定相同——每个语言只是各有一个解析这套参数的工具Python 用argparseGo 用flag/cobraC 用getopt。学会一套就能拆解任何命令行程序。怎么快速读一份-h帮助先记符号符号含义[]可选()分组通常配合|表示这组里必须选一个|或者大写单词QUERY占位符要填真实的值别照抄这个词读法三步读usage行找出必填的没有方括号的、圆括号里的看参数列表判断每个参数要不要给值——名字后面跟大写占位符就要值光秃秃一个名字就是开关拼命令必填先凑齐可选按需加。保命技巧拿不准就只给必填先跑一次。argparse 的报错会直接告诉你缺了哪个参数、哪个值不合法——报错信息本身就是第二份 help。互斥组(a | b | c)从哪来帮助里那种(--http | --service | --mock MOCK)圆括号和竖线不是手写的是用add_mutually_exclusive_group()定义后自动渲染的group parser.add_mutually_exclusive_group(requiredTrue) group.add_argument(--http, actionstore_true) group.add_argument(--service, actionstore_true) group.add_argument(--mock)关键差别普通参数挂在parser上互斥参数挂在group上。requiredTrue时 usage 显示(a | b | c)必选其一改成False就变成[a | b | c]可选但选了也只能选一个。5. 总结一条问题链问题① 怎么让程序无人值守地拿到外部数据 └─► 方案命令行参数 └─► 新问题② 参数怎么交到脚本手里 └─► 方案sys.argv列表 / 全是字符串 └─► 新问题③ 类型要手动转、位置靠记、没说明书 └─► 方案argparse └─► 新概念④ 两类参数位置参数 / 可选参数速查表需求sys.argvargparse取参数sys.argv[1]靠位置args.src靠名字类型转换手动int()typeint自动默认值自己写ifdefault7开关--verbose in sys.argvactionstore_true帮助信息无自动-h参数校验无容易IndexError自动报错命令行参数不是 Python 独有的 API而是一套看懂任何命令行程序的通用能力程序名 → 位置参数子命令→ 可选参数-x/--xxx→ 参数的值。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑