引言
今天工作第一天直播了,效果不是太好,但是勉强还是播完了,全程两小时,想笑但是没笑出来,哈哈哈,说实话这种活如果说是让我做暑假工或者体验生活,我求之不得,但是如果让我把他当作工作,我这种i人还是不来了。但是确实没有其他更好的去处,先将就着吧,先就业再择业。好了,今天学的是解析命令行参数,这个确实是我在java里面没有学过的,等我写完这一篇帖子,我可能还会找其他java帖子看看。废话不多说,现在是北京时间23:09.
一.什么是命令行参数
官方的话有很多帖子,你们都可以去看,但是我就直接说明白点,以前我们打包java的jar包,然后在cmd终端是使用 java -jar 的命令运行spring程序时,java -jar就是命令行执行,但是后面没有命令行参数。在学习python开始时,运行python文件除了用pycharm之外,还有一个就是命令行运行,例如: python demo.py,去运行python文件,此时后面没有参数。举个栗子,这是一个python文件Test_1.py
import sys
print("正在运行的脚本是{}".format(sys.argv[0]))
print("正在允许脚本参数有{}个".format(len(sys.argv)))
print("脚本参数是{}".format(sys.argv))
我要运行这个文件,在终端里需要使用命令python Test_1.py,得到结果如下
如果我在后面加参数,就是:python Test_1.py -i test.png -o demo.java,得到结果如下
在这里他把我的可选参数 -i 和 -o 都识别为单个参数了,所以不满足我们日常需求,所以引入了一些函数,getopt函数和argparse函数进行命令行参数解析。
二.getopt()函数
getopt()函数就是解决命令行中有长选项和短选项的问题,可以把可选参数分离出来
参数:
args:要解析的命令行的参数列表,一般用sys.argv[1:],表示解析从第二位以后的参数,因为第一位是解析文件名称
options:短选项,用“:”表示这个短选项是否必须有参数
long_options:长选项,用“=”表示这个长选项是否必须有参数
返回值:
opt:是一个(options,value)的元组,表示参数和值的对应集合
args:表示出去可选参数以外的正常参数,可选参数是带“-”或者“--”的参数
import sys
import getopt
def main(argv):
input_file = ""
output_file = ""
try:
opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])
except getopt.GetoptError as e:
print(e.msg)
print(e.opt)
sys.exit(2)
# opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])
for opt, arg in opts:
if opt in ("-h", "--help"):
print('script_2.py -i <input_file> -o <output_file>')
print('or: test_arg.py --input_file=<input_file> --output_file=<output_file>')
sys.exit()
elif opt in ("-i", "--input_file"):
input_file = arg
elif opt in ("-o", "--output_file"):
output_file = arg
print('输入文件为:', input_file)
print('输出文件为:', output_file)
# 打印不含'-'或'--'的参数
for i in range(0, len(args)):
# print('不含'-'或'--'的参数 %s 为:%s' % (i + 1, args[i]))
print('不含"-"或"--"的参数{}为{}'.format(i + 1, args[i]))
if __name__ == "__main__":
main(sys.argv)
输出结果如下:
问题总结:
刚刚出现一个问题,我输入上面那行命令时,demo.java被识别为不是可选参数,主要原因是上面短选项权限里面没给 o 操作 : 权限,不能携带参数导致的,这点需要大家注意
Exception getopt.GetoptError
当我们写的参数在上面那个函数里面没有备案,就会触发这个错误,意思是所选参数在参数列表中没有或者说值为空。因此需要捕获这个错误。
# ...
def main(argv):
input_file = ""
output_file = ""
try:
opts, args = getopt.getopt(argv[1:], "hi:o", ["help", "input_file=", "output_file="])
except getopt.GetoptError as e:
print(e.msg)
print(e.opt)
sys.exit(2)
# ...
三.argparse函数
这个函数比上面一个更牛逼,上面哪个控制参数比较单一,但如果参数比较复杂比较推荐argparse函数库,里面核心的三个方法
创建 ArgumentParser() 对象
调用 add_argument() 方法添加参数
使用 parse_args() 解析添加的参数
用几个栗子来讲解一下吧
import argparse
#创建argparse对象
parser = argparse.ArgumentParser()
#添加参数,定位参数f和0,这俩参数必须要有,并且类型为int ,没有默认值
parser.add_argument("f", help="file to read",type=int)
parser.add_argument("o", help="output file",type=int)
# 解析参数,获取到的是一个参数元组
args = parser.parse_args()
print("参数列表:", args)
#将参数改为字典
dict = vars(args)
print("我想看看这个字典是啥",dict)
命令行输入 python Scripy_3.py 123 123 第一个123是定位参数f的,第二个是定位参数o的
结语
今天这个虽然以前没学过,但是总体上还是不是很难,明天计划学一下正则表达式,听说这个很麻烦,现在是北京时间23:40,今天依然是python小白,梦想是月入过万,mai起!