Python实现解析命令行参数的常见方法总结

 更新时间:2022年10月23日 10:44:26   作者:玩转测试开发  
除ide的执行方式外,命令行的方式执行Python脚本是参数化程序执行的一种常见且简单的方法。本文总结了三个常见的获取和解析命令行参数的方法,需要的可以参考一下

简介

除ide的执行方式外,命令行的方式执行Python脚本是参数化程序执行的一种常见且简单的方法,正确处理命令行参数,可以提供给包含某种参数化信息的程序或脚本的参数。例如处理目录或者文件通常作为命令行参数传递给脚本,用于使程序可以处理不同图片或者不同类型文件。

基本形式

python main.py -a v1 -b v2 ...

3种常见的获取和解析命令行参数的方法

1、sys.argv

2、getopt

3、argparse

sys.argv案例

1、sys.argv返回一个列表,第一个值为脚本名称,列表的值类型为string。

2、参数数量:len(sys.argv)

3、获取全部参数:sys.argv

案例源码1

# -*- coding: utf-8 -*-
# time: 2022/9/1 0:10
# file: args_demo.py
# 公众号: 玩转测试开发
import sys


def f1():
    print(f"正在运行的脚本名称: {sys.argv[0]}")
    print(f"脚本的参数数量: {len(sys.argv)}")
    print(f"脚本的参数: {sys.argv}")


if __name__ == '__main__':
    f1()

执行结果:

getopt案例:getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数。命令行选项使得程序的参数更加灵活,其支持短选项模式(-)和双-选项模式(--)。该模块提供了两个方法及一个异常处理来解析命令行参数。

语法格式:

getopt.getopt(args, options[, long_options])

参数说明:

args:要解析的命令行参数列表,一般是sys.argv[1:],需要过滤掉脚本名(sys.argv[0])

options:以字符串的格式定义,options 后的冒号 “:” ,表示如果设置该选项,必须有附加的参数,否则就不附加参数

long_options:以列表的格式定义,long_options 后的等号 “=” ,表示该选项必须有附加的参数,不带冒号表示该选项不附加参数

案例源码2

# -*- coding: utf-8 -*-
# time: 2022/9/1 0:10
# file: args_demo.py
# 公众号: 玩转测试开发
import sys
import getopt


def f1():
    print(f"正在运行的脚本名称: {sys.argv[0]}")
    print(f"脚本的参数数量: {len(sys.argv)}")
    print(f"脚本的参数: {sys.argv}")


def f2(argv):
    input_file = ""
    output_file = ""
    opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])

    # "hi:o:": 短格式分析串, h 后面没有冒号, 表示后面不带参数; i 和 o 后面带有冒号, 表示后面带参数
    # ["help", "input_file=", "output_file="]: 长格式分析串列表, help后面没有等号, 表示后面不带参数; input_file和output_file后面带冒号, 表示后面带参数
    # 返回值包括 `opts` 和 `args`, opts 是以元组为元素的列表, 每个元组的形式为: (选项, 附加参数),如: ('-i', 'test.png');
    # args是个列表,其中的元素是那些不含'-'或'--'的参数

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            # 即:处理 -h参数的案例说明,帮助文档等
            print('args_demo.py -i <input_file> -o <output_file>')
            print('or: args_demo.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(f'输入文件为:{input_file}')
    print(f'输出文件为:{output_file}')

    # 打印不含'-'或'--'的参数
    for i in range(0, len(args)):
        print(f'不含 - 或 -- 的参数 {i + 1} 为:{args[i]}')


if __name__ == '__main__':
    # f1()
    f2(sys.argv)

命令行依次执行:

python args_demo.py -h
python args_demo.py -i a.txt
python args_demo.py -o b.txt
python args_demo.py -i a.txt  -o b.txt c.txt

执行结果:

Exception getopt.GetoptError:在参数列表中没有找到所传递参数,或选项的需要的参数为空时会触发该异常。异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。在上述代码中添加异常处理,检查此错误信息。

使用错误的格式选项传递参数执行脚本:python args_demo.py -q

argparse案例:当程序中使用采用复杂参数或多个文件名时,推荐使用 Python 的 argparse 库,它以系统的方式处理命令行参数,从而可以编写用户友好的命令行程序。Python 标准库 argparse 同样也是用于解析命令行参数的模块。首先,由程序确定所需的参数,然后 argparse 将这些参数解析为 sys.argv。此外,argparse 会生成帮助和使用信息提示,并在提供无效参数时发出错误。为了介绍此模块,编写 argparse_demo1.py,如下所示:

为了介绍此模块,编写 argparse_demo1.py,如下所示:

案例1

不带参数运行此脚本不会向 stdout 显示任何内容。但是,如果使用 --help 或 -h 选项,将得到脚本的使用信息提示

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

执行结果:

(venv)>python argparse_demo.py -h
usage: argparse_demo.py [-h]

optional arguments:
  -h, --help  show this help message and exit

(venv)>python argparse_demo.py --help
usage: argparse_demo.py [-h]

optional arguments:
  -h, --help  show this help message and exit

案例2

指定其他参数会导致错误python argparse_demo.py -q

python argparse_demo.py -q
usage: argparse_demo.py [-h]
argparse_demo.py: error: unrecognized arguments: -q

案例3

添加一个参数需要调用方法 parser.add_argument

# -*- coding: utf-8 -*-
# time: 2022/8/31 16:20
# file: argparse_demo1.py
# author: tom
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("name", help="添加的第1个参数name,姓名。")
args = parser.parse_args()
print(f"args.name:{args.name}")
print(f"type:{type(args.name)}")

使用范例:

python argparse_demo1.py tom
python argparse_demo1.py -h
python argparse_demo1.py

执行结果:此时不带参数运行脚本则抛出缺少参数name

(venv) >python argparse_demo.py tom
args.name:tom
type:<class 'str'>

(venv) >python argparse_demo.py -h
usage: argparse_demo.py [-h] name

positional arguments:
  name        添加的第1个参数name,姓名。

optional arguments:
  -h, --help  show this help message and exit

(venv) >python argparse_demo.py
usage: argparse_demo.py [-h] name
argparse_demo.py: error: the following arguments are required: name

使用--的形式:使用-的形式则--name改成 -name即可。

案例4

argparse 将提供的选项默认视为字符串,新增int类型的案例

# -*- coding: utf-8 -*-
# time: 2022/8/31 16:20
# file: argparse_demo1.py
# author: tom
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--name", help="添加的第1个参数name,姓名。")
parser.add_argument("--age", help="添加的第2个参数age,年龄。", type=int)
args = parser.parse_args()
print(f"args.name:{args.name}")
print(f"type:{type(args.name)}")

print("*" * 50)

print(f"args.age:{args.age}")
print(f"type:{type(args.age)}")

使用范例:可使用两种形式 --key=value  /  --key value

python argparse_demo.py --name=tom --age=30
python argparse_demo.py --name tom --age 30

执行结果:

(venv) >python argparse_demo.py --name=tom --age=30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>

(venv) >python argparse_demo.py --name tom --age 30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>

到此这篇关于Python实现解析命令行参数的常见方法总结的文章就介绍到这了,更多相关Python解析命令行参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Python Socket编程的要点详解

    关于Python Socket编程的要点详解

    Socket是网络编程的一个抽象概念,通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可,这篇文章主要给大家介绍了关于Python Socket编程的相关资料,需要的朋友可以参考下
    2021-08-08
  • Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式

    Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式

    这篇文章主要介绍了Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 分享11个Python自动化操作Excel的方法

    分享11个Python自动化操作Excel的方法

    这篇文章主要给大家分享的是11个Python自动化操作Excel的方法,自动化办公,我相信很多人都有强烈的需求,今天我教大家如何利用Python自动化操作Excel,需要的朋友可以参考一下
    2022-02-02
  • python中h5py开源库的使用样例详解

    python中h5py开源库的使用样例详解

    这篇文章主要介绍了python中的h5py开源库的使用,本文只是简单的对h5py库的基本创建文件,数据集和读取数据的方式进行介绍,需要的朋友可以参考下
    2022-05-05
  • django如何通过类视图使用装饰器

    django如何通过类视图使用装饰器

    这篇文章主要介绍了django如何设计装饰器过滤黑名单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python生成指定尺寸缩略图的示例

    python生成指定尺寸缩略图的示例

    这篇文章主要介绍了python生成指定尺寸缩略图的示例,需要的朋友可以参考下
    2014-05-05
  • 使用matlab读取含表头csv文件

    使用matlab读取含表头csv文件

    这篇文章主要介绍了使用matlab读取含表头csv文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例

    python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例

    这篇文章主要介绍了python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例,需要的朋友可以参考下
    2020-02-02
  • Python中的getopt函数使用详解

    Python中的getopt函数使用详解

    这篇文章主要介绍了Python中的getopt函数使用详解,是Python进阶学习中的重要知识,需要的朋友可以参考下
    2015-07-07
  • python+OpenCV实现图像拼接

    python+OpenCV实现图像拼接

    这篇文章主要为大家详细介绍了python+OpenCV实现图像拼接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论