Bootstrap

Python基础学习Day_09

引言

        今天工作第一天直播了,效果不是太好,但是勉强还是播完了,全程两小时,想笑但是没笑出来,哈哈哈,说实话这种活如果说是让我做暑假工或者体验生活,我求之不得,但是如果让我把他当作工作,我这种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起!

;