文章目录
- 1.argparse
- 2.subparses
- 3.优化
后续我也会将我在学习过程中写的脚本放出来。
在开发命令行工具时需要对不同类型的参数进行处理。比如下面这种,我们需要处理用户输入的不同参数。
python">python main.py --help
python main.py domain xxxx
python main.py cms xxx
1.argparse
使用命令行传入指令时,需要自定义各个命令和命令对应的参数,需要用到库argparse
代码:
python">#python main.py --print 123
#输出:test_one_print+123
import argparsedef test_one():parser = argparse.ArgumentParser(description="test_one")parser.add_argument("--print", help="print", type=str)args = parser.parse_args()if args.print:print(f"test_one_print+{args.print}")else:print("no")if __name__ == '__main__':test_one()
解析:
argparse.ArgumentParser:创建一个argparse对象,后续才可以调用
add_argument:添加一个参数,help是提示信息,type是参数类型
args = parser.parse_args():对命令行的参数解析
args.print:表示–print选项的参数,输入python main.py --print 123,则args.print是123
2.subparses
当程序功能比较复杂时,使用子命令可以使程序命令更加简洁,同时程序的结构更加清晰,维护也更加方便。
首先,一条命令中的参数是可以加可以不加的。比如:
python">完整的命令:
python main.py --print 123 --url www.baidu.com --out-put /etc/test.txt
我们在使用时可以输入:
python main.py --url www.baidu.com
于是我们可以理解为一条主命令有很多个可以选择的参数。
假设现在,我们要做一个程序,需要有两个模块,一个得到用户的id、phone等信息,一个执行其它的问题,同时主命令也要可以打印出信息。写成一条命令就是:
python">python main.py --print 123 --user_num xxx --user_phone xxx .....
这样不仅命令杂乱,程序也会杂乱,这个时候就可以使用子命令。
python">首先我们引入子命令:(可以理解为这里是user模块,还可以添加其它模块)
user_parser = subparsers.add_parser("user",help="info")
然后对每个模块我们需要添加参数处理数据。比如用户有num,phone_num:
user_parser.add_argument("--user_num",help="num",type=str)
user_parser.add_argument("--user_phone",help="user_phone",type=str)
这样我们代码的结构就更加清晰,程序分为不同的功能块,然后每个功能块又有各自的不同参数。
python">#python main.py --print 123 user --user_num 111 --user_phone 123456789
#python main.py --print 123
#python main.py user --user_num 111
import argparsedef test_one():parser = argparse.ArgumentParser(description="test_one")parser.add_argument("--print", help="print", type=str)subparsers = parser.add_subparsers(help='help')user_parser = subparsers.add_parser("user",help="info")user_parser.add_argument("--user_num",help="num",type=str)user_parser.add_argument("--user_phone",help="user_phone",type=str)args = parser.parse_args()if args.print:print(f"test_one_print+{args.print}")if args.user_num:print(f"test_one_print+{args.user_num}")if args.user_phone:print(f"test_one_print+{args.user_phone}")else:print("no")if __name__ == '__main__':test_one()
3.优化
args:
当程序很复杂时,我们可以把程序代码分块,每个文件放一个模块,比如主界面只存放定义的参数,然后参数对应什么功能,放在另一个文件,于是我们可以将args作为参数传递给函数。
python">import argparse
from xxx import opdef test_one():parser = argparse.ArgumentParser(description="test_one")parser.add_argument("--print", help="print", type=str)subparsers = parser.add_subparsers(help='help')user_parser = subparsers.add_parser("user",help="info")user_parser.add_argument("--user_num",help="num",type=str)user_parser.add_argument("--user_phone",help="user_phone",type=str)args = parser.parse_args()op(args)if __name__ == '__main__':test_one()