命令行参数解析——测试工程师Python开发实战(13)

发表于:2023-8-22 09:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:胡通    来源:51Testing软件测试网原创

#
Python
  4.9  命令行参数解析
  4.9.1  命令行参数含义
  通常,我们运行Python项目或者脚本采用直接执行脚本的方式,但是Python作为一个脚本语言,在Linux中经常会结合Shell脚本使用,这个时候执行的Python脚本多半需要使用命令行参数传入一些变量,以更加灵活、动态地传递一些数据。例如,运行命令python argv.py 1 2 3,其中1、2、3就是传递给argv.py的命令行参数,也就是说命令行参数是调用某个程序时除程序名外的其他参数。
  命令行参数工具是常用的工具,它给使用者提供了友好的交互体验。例如,当我们需要经常调节参数的时候,如果参数都是通过硬编码写在程序中的话,我们每次修改参数都需要修改对应的代码和逻辑,这显然不太方便。比较好的方法是把必要的待修改的参数设置成通过命令行参数传入的形式,这样我们只需要在运行的时候修改参数即可。因此,在使用Python开发脚本,并需要接受用户参数运行时,我们可以使用命令行传参的方式。
  4.9.2  命令行参数解析库
  Python的命令行参数解析模块主要分为两类,一种是Python内置的模块,主要包括sys.argv、argparse和getopt,另一种是第三方模块,比较有名的是click模块,如图4-2所示。
图4-2  命令行参数解析模块
  下面我们将简要阐述对比各模块,如表4-25所示,然后简单解释解析命令行参数的原理,方便大家进一步理解。
表4-25  命令行参数解析模块
  本节将着重讲解如何使用argparse模块进行命令行参数解析,argparse模块是Python自带的命令行参数解析模块。在程序中定义我们需要的参数,argparse模块会从sys.argv模块解析出这些参数。使用argparse模块的步骤如下。
  (1)构建一个参数实例,生成一个命令行参数的对象。
  (2)给对象添加一些参数。
  (3)从属性中提取传入的参数并使用。
  1.创建一个解析器
  通过argparse模块中的ArgumentParser()方法创建一个ArgumentParser对象,ArgumentParser对象包含将命令行解析成Python数据类型所需的全部信息。示例如下:
parse = argparse.ArgumentParser(prog='argument.py',description='编写命令行的示例文件')
  ArgumentParser()方法其他参数如表4-26所示其中大部分参数不常用到。
表4-26  ArgumentParser()方法的参数
  2.添加参数
  给ArgumentParser对象添加参数是通过调用add_argument()方法完成的。示例如下:
parse.add_argument('name',type=str,help='名字') # 添加位置参数(必选)
parse.add_argument('age',type=int,help='年龄') # 添加位置参数(必选)
parse.add_argument('-s',dest='--sex',type=str,help='性别') # 添加可选参数?
  其中,add_argument()方法更多的可选参数如表4-27所示。
表4-27  add_argument()方法的参数
  此处,我们重点讲解下必选参数、可选参数、默认值、参数类型、可选值、参数数量、参数传递等几个常用功能的设置方法。
  (1)必选参数。它的定义和函数中的必填参数是一样的,即运行程序必须要的参数。如果不传入,那么程序会报错并提示。定义必选参数的方法非常简单,我们只需要通过add_argument()方法传入参数的名称即可。示例如下:
parser.add_argument('param')
  这样就定义了一个名为param的参数,我们可以通过args.param来访问它。假设需要运行的程序名称为test.py,那么我们直接执行命令python test.py?×××即可,其中必选参数直接传入,不需要加上前缀。
  (2)可选参数。有必选参数当然就有可选参数,可选参数因为可选可不选,所以我们在使用的时候需要在参数前加上标识-或--。例如,我们的参数名为param,可以定义成-param或者--param,这两种方式都可以使用,也可以同时使用两种方式。示例如下:
parser.add_argument('-param', '--param')
  如果要给这个可选参数一个解释或提示,方便其他人理解这个参数,那么我们可以加help,示例如下:
parser.add_argument('-param', '--param', help='this is a param of name')
  (3)默认值。如果参数很多,我们可能不希望每一个都指定一个值,而是希望可以在不指定值的时候有一个默认值。我们可以通过default参数实现这个需求。示例如下:
parser.add_argument('-param', '--param', default=3, help='this is a param of num')
  (4)参数类型。我们可以定义参数的默认值,也可以定义它的类型。因为命令行传入的参数默认都是字符串类型,如果我们要进行数学计算,使用字符串类型还需要先转换,这很不方便。我们可以在传入参数的时候就完成类型的匹配,这样传入参数的类型不对将直接报错,不继续运行程序。我们可以通过type参数实现这个需求。示例如下:
parser.add_argument('-param', '--param', default=3,type=int, help='this is a param of num')
  (5)可选值。可选值很好理解,就是我们希望限制传入参数的范围仅在几个值当中。例如,我们希望传入的值不是0就是1,或者是在某几个具体的值当中,那么可以通过choices参数实现这个需求。choices参数传入的是一个列表,也就是我们的限制范围。示例如下:
parser.add_argument('-param', '--param', default=3, choices=[2,3,4], type=int, help='this is a param of num')
  (6)参数数量。nargs是一个非常有用的参数,可以用来说明传入的参数个数。例如,'+'表示传入至少1个参数;'2'表示必须传入2个参数,在程序运行时,这2个参数的值会以列表的形式赋给param。
parser.add_argument('-param', '--param', nargs=2, type=int, help='this is a param of num')
  (7)参数传递。dest参数用于指定后面的参数传递给谁,在dest参数定义后的程序中,我们可以使用dest指定的参数名获取对应的值。示例如下:
parser.add_argument('-param', '--param', dest = 'port')
args = parser.parse_args()
server_port = args.port # 通过dest参数指定的port获取。
  3.解析参数
  通过parse_args()方法将参数字符串转换为对象,并将其设为命名空间的属性,返回带有成员的命名空间:
ArgumentParser.parse_args(args=None, namespace=None)
  其中,args表示要解析的字符串列表,默认值从sys.argv获取;namespace用于获取属性的对象,默认值是一个新的空Namespace对象。
  注意,可选参数的参数和参数值可以作为两个单独参数传入。对于长参数,参数和参数值可以作为单个命令行参数传入,使用=分隔它们;对于短参数,参数和参数值可以拼接在一起。示例如下:
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x')
parser.add_argument('--foo')
parser.add_argument('bar')
print(parser.parse_args(['--foo=FOO', '-xX', 'bar']))
  另外,当短参数看起来像负数时,解析器会将命令行中所有的负数参数解析为短参数。位置参数只有在是负数并且解析器中没有任何参数看起来像负数时,才能以-开头。如果必须使用以-开头的位置参数,我们可以插入伪参数'--'告诉parse_args()在那之后的内容是位置参数。示例如下:
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-1', dest='one')
parser.add_argument('foo', nargs=1)
parser.add_argument('bar', nargs=1)
print(parser.parse_args(['-1', 'X', '--', '-2', '-3']))
  图4-3中展示的是一个综合示例,演示了一个简单登录的验证和提示语。
图4-3  综合示例
版权声明:51Testing软件测试网获得作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号