Python解析命令行参数

发布时间 2023-12-30 23:21:45作者: 3的4次方

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个模块可用于解析命令行参数,getoptargparse

  • getopt是C函数getopt()的移植,适合C程序员
  • argparse更加智能

使用getopt

getopt --- C 风格的命令行选项解析器 — Python 3.12.1 文档

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模块用法实例详解 - 知乎 (zhihu.com)

argparse模块提供了ArgumentParser类来构造命令行参数解析器对象,并提供add_argument()成员方法来向这个解析器添加可识别的参数信息格式。解析后的结果通过Namespace类型(一种类似于字典的类型)来返回。

Python中Namespace()函数的作用及例子_from argparse import namespace-CSDN博客