Python命令行参数解析
Python命令行参数解析
平时用Python写一些小工具,解析命令行参数是非常有必要的。
获取命令行参数
在Python中命令行参数通过 sys.argv
传递,它是一个list,其中的元素为字符串。
import sys def cli_parser(): print(f"参数个数: {len(sys.argv)}") print(f"参数列表:{str(sys.argv)}") print(f"脚本名:{sys.argv[0]}") for i in range(1, len(sys.argv)): print(f"参数{i}:{sys.argv[i]}") if __name__ == "__main__": cli_parser()
(base)PS D:\桌面\test\python\test1> python console.py --username tom -p haha123 参数个数: 5 参数列表:['console.py', '--username', 'tom', '-p', 'haha123'] 脚本名:console.py 参数1:--username 参数2:tom 参数3:-p 参数4:haha123
解析命令行参数
Python标准库提供了2个模块可用于解析命令行参数,getopt
和argparse
。
getopt
是C函数getopt()
的移植,适合C程序员argparse
更加智能,推荐使用
getopt模块
getopt.getopt
方法用于解析命令行参数列表,语法格式如下:
getopt.getopt(args, options[, long_options])
方法参数说明:
- args: 要解析的命令行参数列表。
- options: 以字符串的格式定义,options后的冒号(
:
)表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。 - long_options: 以列表的格式定义,long_options 后的等号(
=
)表示如果设置该选项,必须有附加的参数,否则就不附加参数。 - 该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有
-
或--
的参数。
抛出异常Exception getopt.GetoptError
-
在没有找到参数列表,或选项的需要的参数为空时会触发该异常。
-
异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。
import getopt def cli_parser(): """ 命令行参数解析 """ username = "" password = "" try: """ options, args = getopt.getopt(args, shortopts, longopts=[]) 参数args:一般是sys.argv[1:]。过滤掉sys.argv[0],它是执行脚本的名字,不算做命令行参数。 参数shortopts:短格式分析串。例如:"hp:i:",h后面没有冒号,表示后面不带参数;p和i后面带有冒号,表示后面带参数。 参数longopts:长格式分析串列表。例如:["help", "ip=", "port="],help后面没有等号,表示后面不带参数;ip和port后面带冒号,表示后面带参数。 返回值options是以元组为元素的列表,每个元组的形式为:(选项串, 附加参数),如:('-i', '192.168.0.1') 返回值args是个列表,其中的元素是那些不含'-'或'--'的参数。 """ opts, args = getopt.getopt(sys.argv[1:], "hu:p:", ["help", "username=", "password="]) except getopt.GetoptError: print('Error: console.py -u <username> -p <password>') print(' or: console.py --username=<username> --password=<password>') sys.exit(2) # 处理 返回值options是以元组为元素的列表。 for opt, arg in opts: if opt in ("-h", "--help"): print('console.py -u <username> -p <password>') print('or: console.py --username=<username> --password=<password>') sys.exit() elif opt in ("-u", "--username"): username = arg elif opt in ("-p", "--password"): password = arg print('username为:', username) print('password为:', password) # 打印 返回值args列表,即其中的元素是那些不含'-'或'--'的参数。 for i in range(0, len(args)): print('参数 %s 为:%s' % (i + 1, args[i])) if __name__ == "__main__": cli_parser()
argparse模块
argparse模块提供了ArgumentParser
类来构造命令行参数解析器对象,并提供add_argument()
成员方法来向这个解析器添加可识别的参数信息格式。解析后的结果通过Namespace
类型(一种类似于字典的类型)来返回,使用.参数名
的反射方式来提取特定的参数。
arparse模块中用到了
Namespace
容器类型,用于存储对象和属性。类似于字典,但是可以使用.
来访问和设置属性。在实际应用中,常常使用命名空间对象来管理和传递配置参数、命令行参数等。
from argparse import Namespace # 创建一个命名空间对象 person = Namespace() # 设置属性值 person.name = "Alice" person.age = 25 # 访问属性值 print(person.name) # Alice print(person.age) # 25
基本使用示例代码如下:
import argparse # 构造ArgumentParser对象,该对象完成本模块的全部功能。默认会提供一个-h,--help选项,显示的信息就是description parser = argparse.ArgumentParser(description='演示命令行参数解析') # 往parser添加命令行选项 parser.add_argument('-i','--ip', type=str, default='localhost', help='IP地址') parser.add_argument('-p','--port', type=int, default='8090', help='端口号') parser.add_argument('user', required=True, help='用户名') parser.add_argument('passwd', help='密码') # 解析命令行参数得到Namespace对象,此步会阻塞等待命令行输入 args = parser.parse_args() # 从Namespace对象中提取各命令行选项对应的参数值 print(args) print(args.ip) print(args.port) print(args.user) print(args.passwd)
(base)PS G:\Code\Python> python arg.py xiaoming -i 127.0.0.1 --port 9090 mima123 Namespace(ip='127.0.0.1', port=9090, user='xiaoming', passwd='mima123') 127.0.0.1 9090 xiaoming mima123
上述代码中:
-
ip
和port
是命名参数,可以乱序输入,因为输入时指定了-i
、--port
这样的长短选项 -
而
user
和passwd
是位置参数,只能顺序输入,因为输入时没有指定任何信息 -
同时
user
是必需参数,而其他参数默认是非必需参数,没有值时会赋值为None
本文作者:3的4次方
本文链接:https://www.cnblogs.com/3to4/p/17937043
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步