网站首页 > 技术文章 正文
Python 命令行参数详解
在实际开发中,很多 Python 脚本是通过命令行运行的。你可以传入若干参数(arguments)来控制程序行为。这就需要 Python 提供的方式去解析这些参数。
Python 提供多种方式处理命令行参数,本文将一一介绍:
- sys.argv
- argparse
- click
- docopt
每种方法附带示例代码+优缺点对比,帮助您根据需求选择最适合的方法。
示例输入
python script.py example.txt -v --limit 20
在这种结构中:
- script.py 是当前执行的脚本;
- example.txt 是传入的文件;
- -v 和 --limit 20 是用于控制程序行为的可选参数。
1. 使用 sys.argv 获取参数(基础篇)
特点:
- Python 内置模块 sys 提供。
- 每一个命令行参数都保存在 sys.argv 这个列表中。
- 简单直接,适合脚本初阶段编写。
示例:
import sys
print("脚本名:", sys.argv[0])
print("所有参数:", sys.argv)
if len(sys.argv) > 1:
print("第一个参数:", sys.argv[1])
输出示例:
$ python script.py hello world
脚本名: script.py
所有参数: ['script.py', 'hello', 'world']
第一个参数: hello
缺点:
- 无自动帮助功能。
- 不支持 --option value 或短选项 -o。
- 需手动判断和解析参数。
2. 使用 argparse(推荐方式)—— 官方高级接口
特点:
- Python 内置模块,无需安装。
- 自动处理参数类型、默认值、帮助说明。
- 支持可选参数(--verbose)、短参数(-v)、位置参数等。
示例代码:
import argparse
parser = argparse.ArgumentParser(description='一个简单的示例脚本')
# 添加位置参数(必须传)
parser.add_argument("filename", help="需要处理的文件名")
# 添加可选参数
parser.add_argument("--verbose", "-v", action="store_true", help="是否启用详细模式")
parser.add_argument("--limit", type=int, default=10, help="限制输出的条目数(默认10)")
# 解析参数
args = parser.parse_args()
print("文件名:", args.filename)
if args.verbose:
print("详细模式已启用")
print("限制输出:", args.limit)
使用示例:
python script.py example.txt -v --limit 20
输出:
文件名: example.txt
详细模式已启用
限制输出: 20
支持:
- 自动生成 --help 支持。
- 类型检查(如 type=int)。
- 默认值设置。
3. 使用 click(装饰器风格 CLI 工具)
特点:
- 第三方库,需使用 pip install click 安装。
- 支持命名命令、函数绑定命令、子命令。
- 风格类似于 Flask,适合开发功能较完整的 CLI 工具。
示例代码:
import click
@click.command()
@click.argument('filename')
@click.option('--verbose', '-v', is_flag=True, help='启用详细模式')
@click.option('--limit', default=10, help='输出条目数(默认 10)')
def main(filename, verbose, limit):
"""一个用于处理文本文件的 CLI 程序"""
print(f"文件名: {filename}")
if verbose:
print("详细模式已启用")
print(f"限制输出: {limit}")
if __name__ == "__main__":
main()
示例运行:
python script.py example.txt -v --limit 30
输出:
文件名: example.txt
详细模式已启用
限制输出: 30
适合场景:
- 构建 CLI 工具(如 flask、docker 风格命令系统)。
- 多命令功能支持(add、commit、push 等)。
4. 使用 docopt(基于文档说明书自动解析)
特点:
- 第三方库,需 pip install docopt。
- 基于 docstring 内容自动解析命令。
- 非常适合与文档格式对齐的脚本。
示例代码:
"""Usage:
script.py <filename> [--verbose] [--limit=<num>]
Options:
-h --help 显示帮助
--verbose 详细模式
--limit=<num> 限制输出条目数 [default: 10]
"""
from docopt import docopt
if __name__ == "__main__":
args = docopt(__doc__)
print(args)
示例运行:
python script.py example.txt --verbose --limit=20
输出:
{
'<filename>': 'example.txt',
'--verbose': True,
'--limit': '20'
}
工具对比一览表
工具 | 来源 | 是否内置 | 特点 | 适用场景 |
sys.argv | 内置 | 最基础,手动处理一切 | 简单脚本 | |
argparse | 内置 | 高度灵活、支持帮助文档 | 一般 CLI 工具 | |
click | 第三方 | 高级命令框架,装潢风格美 | 复杂 CLI、多命令脚本 | |
docopt | 第三方 | 所见即所得,基于 help写 | API 文档与功能绑定脚本 |
总结建议
场景 | 建议使用模块 |
初学手动处理参数 | sys.argv |
制作可用命令行工具 | argparse |
开发功能齐全的 CLI 程序 | click |
需要绑定命令与帮助文档说明 | docopt |
拓展练习题
写一个 Python 命令行程序,实现以下功能:
- 必须传入一个文件名;
- 可选参数 --verbose 或 -v,启用输出提示信息;
- 可选参数 --lines N,读取并输出前 N 行;
- 不使用第三方库,基于 argparse 实现。
猜你喜欢
- 2025-08-31 HashMap详解_hashmap lru
- 2025-08-31 孩子们的游戏(圆圈中最后剩下的数)
- 2025-08-31 一招教你搞定西门子博图SCL编程语句中FOR循环指令,so easy
- 2025-08-31 JAVA序列化那些事儿_java序列化方式和作用
- 2025-08-31 雨刮器的INT功能你真的会用吗?别再当摆设了,老司机手把手教你
- 2025-08-31 认识变量与常量_变量与常量的定义
- 2025-08-31 PLC数学函数有哪些呢_plc常用的数学计算
- 2025-08-31 python中字典详解及使用_python里字典怎么用
- 2025-08-31 算法“动态规划”最佳实践——背包问题
- 2025-05-27 Python进阶 - day1:深入理解数据结构
- 09-04综艺做成这样都上不了热搜?_综艺节目热播原因
- 09-04webRTC中音频相关的netEQ(二):数据结构
- 09-04每日一词“era”_每日一页歌词
- 09-04css 布局简述_简述css布局技术的特点
- 09-049个专业级别的CSS技巧区分了解和精通的鸿沟
- 09-04BeautifulSoup如何将含有data-tag标签的元素提取出来?
- 09-04CSS 中实现动画效果的方法_css动画制作
- 09-045个CSS新功能,简单好用还超省时间
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)