Python argparse 库使用教程
·
一、命令行参数
1、概述
在日常的Python编程中,我们经常需要编写一些可配置的脚本。这些脚本在运行时,可能需要传递一些参数,以实现不同的功能。命令行参数就是一种在启动脚本时,传递给脚本的数据。
例如,我们编写了一个可以实现文件复制功能的脚本,那么我们可能需要传递源文件路径和目标文件路径两个参数。这就需要解析命令行参数。
在 Python 中,你可以使用 argparse 模块来处理命令行参数——类似于shell脚本的占位符。通过这个模块,你可以轻松解析从命令行传递的参数并在脚本中使用它们。程序定义需要哪些参数,然后 argparse 将找出如何从 sys.argv 解析出这些参数。argparse模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
import argparse
# 创建命令行解析器对象
parser = argparse.ArgumentParser(description="处理命令行实例")
# 向解析器添加参数 "--name", "-n" 脚本输入入口 dest 使用脚本参数的名称 default 默认值 help 提示帮助
parser.add_argument("--name", "-n", dest="name", type=str, default="redis", help="输入名称")
parser.add_argument("--age", "-a", dest="age", type=int, default=18, help="输入年龄")
# 解析命令行参数
args = parser.parse_args()
# 获得参数 使用的是 dest 的值作为参数获取
name = args.name ——这里就能拿到预输入值进行储存及进一步操作
age = args.age
# 输出结果
print(f"name: {name}, age: {age}")

2、流程解析
创建一个解析器对象,用于管理命令行参数的解析 description参数是描述
argparse.ArgumentParser()
定义了一个 --name 参数,并指定它的类型为 str(字符串) type 是类型 help是提示帮助 default是配置默认值
parser.add_argument("--name", type=str, help="输入名字")
定义了一个 --age 参数,并指定它的类型为 int(整数)
parser.add_argument("--age", type=int, help="输入年龄")
解析所有传入的命令行参数,并将其存储在 args 对象中
args = parser.parse_args()
用于访问命令行中传递的--name和 --age 参数的值 如果有dest 则使用dest的值
args.name 和 args.age
二、argparse进阶
参数详解
ArgumentParser.add_argument(name or flags...[,action], nargs],const][,default][,type][,choices][,required][,help][,metavar][,dest])
基础参数
name or flags: 选项字符串的名字或者列表,例如 name 或者 -n, --name 两个同时需要用逗号分隔,且调用的时候使用长名称
type: 命令行参数应该被转换成的类型。默认是字符串类型 int str bool
dest: 默认的变量名是--或-后面的字符串,但是你也可以通过dest=xxx来设置参数的变量名,然后在代码中用args.xxx来获取参数的值。
default: 指定参数的默认值 parser.add_argument('--some-int', type=int, default=42)
required: 指定参数是否必需 True 为必须
help: 提供参数的帮助文本,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息
metavar: 没有实际作用,只是用来提示用户参数应该输入什么东西
nargs: 指定参数接收的值的数量,可以是固定的数量,也可以是可变数量。其中,'+'表示至少需要一个参数,'*'表示可以接受任意数量的参数,数字表示只接受固定数量的参数,'?'可选参数,1或者0
choices: 限制参数的取值范围就是mysql里面定义数据的集合 parser.add_argument('--color', choices=['red', 'blue', 'green'])
参数类型
argparse支持多种参数类型,包括字符串、整数、浮点数、布尔值等。你还可以通过自定义类型来处理更复杂的参数。
parser.add_argument('--count', type=int, help='a simple integer')
parser.add_argument('--file', type=argparse.FileType('r'), help='a readable file')
action
action选项用来定义当命令行选项被触发时的行为
store:默认值。当命令行选项被触发时,将选项后面的参数值存储下来
store_const:当命令行选项被触发时,将一个常量值存储下来。比如:add_argument('--foo', action='store_const', const=42)会将42存储为args.foo。
store_true 和 store_false:当命令行选项被触发时,将一个布尔值存储下来。
append:当命令行选项被触发时,将一个值添加到列表中。比如:add_argument('--foo', action='append', default=[])会将任何遇到的--foo选项的值添加到args.foo列表中。
append_const:当命令行选项被触发时,将一个常量值添加到列表中。比如:add_argument('--foo', action='append_const', const=42)会将42添加到args.foo列表中。
典型案例args和actions搭配使用时:
parse.add_argument("-name","-n",dest="name",help="请输入姓名",type=str,required=True,metavar="名字",args="*",action="append") 当输入多个参数: args和actions都存在时: [['sp'], ['zmf'], ['lhq']] n 只有actions存在时 ['sp', 'zmf', 'lhq'] n 得出:有args,传入多个参数时每个参数视为独立的个体,所以append追加第一个到第三个都会生成单独的列表,最后又要返回一个列表 而没有args,输入多个参数视为一个,最后返回一个列表
互斥参数
使用mutually_exclusive_group来创建一组互斥的参数,这些参数中只能选择一个
import argparse
# 创建命令行解析器对象
parser = argparse.ArgumentParser(description="处理命令行实例")
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--option1", "-o1", dest="option1", action="store_true")
group.add_argument("--option2", "-o2", dest="option2", action="store_false")
args = parser.parse_args()
# 获得参数
option = args.option1 if args.option1 else args.option2
print(f"Option: {option}")
子命令
有时候,我们的程序可能需要根据不同的命令执行不同的操作,这里就涉及到子命令
add_parser("mysql", help="MySQL 漏洞利用")import argparse
#创建解析器对象
parser = argparse.ArgumentParser(description="多命令实例")
#创建子命令容器
subparsers = parser.add_subparsers(dest="sub_command")——选了哪个子命令就会返回值到这里进行进一步判断
#创建子命令1对象
子命令1 = subparsers.add_parser("名称", help="...")
#创建子命令1的参数
子命令1.add_argument()
#创建子命令2对象
子命令2 = subparsers.add_parser("名称", help="...")
#创建子命令2的参数
子命令2.add_argument()
...
案例
import argparse
# 创建命令行解析器对象
parser = argparse.ArgumentParser(description="多命令实例")
# 创建子命令容器
subparsers = parser.add_subparsers(dest="sub_command")
# 创建 MySQL 子命令解释器与参数列表
mysql_parser = subparsers.add_parser("mysql", help="MySQL 漏洞利用")
mysql_parser.add_argument("--host", "-H", dest="host", type=str, default="127.0.0.1", help="MySQL 主机 (默认 127.0.0.1)")
mysql_parser.add_argument("--port", "-p", dest="port", type=int, default=3306, help="MySQL 端口 (默认 3306)")
mysql_parser.add_argument("--user", "-u", dest="user", type=str, default="root", help="MySQL 用户名 (默认 root)")
mysql_parser.add_argument("--file", "-F", dest="file", type=str, default="./pass.txt", help="爆破密码本路径 (默认 ./pass.txt)")
# 创建 Redis 子命令解释器与参数列表
redis_parser = subparsers.add_parser("redis", help="Redis 漏洞利用")
redis_parser.add_argument("--host", "-H", dest="host", type=str, default="127.0.0.1", help="Redis 主机 (默认 127.0.0.1)")
redis_parser.add_argument("--port", "-p", dest="port", type=int, default=6379, help="Redis 端口 (默认 6379)")
redis_parser.add_argument("--file", "-F", dest="file", type=str, default="./pass.txt", help="爆破密码本路径 (默认 ./pass.txt)")
# 解析命令行参数
args = parser.parse_args()
if args.sub_command == "mysql":
print(f"MySQL 爆破: 主机 {args.host}, 端口 {args.port}, 用户 {args.user}, 密码本 {args.file}")
elif args.sub_command == "redis":
print(f"Redis 爆破: 主机 {args.host}, 端口 {args.port}, 密码本 {args.file}")
else:
print("输入子命令有误,请检查后重新输入...")
更多推荐



所有评论(0)