Python中的参数解析
每种编程语言都有创建脚本并从终端运行它们或被其他程序调用的功能。在运行此类脚本时,我们经常需要传递脚本所需的参数,以便在脚本内执行各种功能。在本文中,我们将介绍将参数传递到python脚本的各种方法。
使用sys.argv
这是一个内置模块sys.argv可以处理随脚本传递的参数。默认情况下,在sys.argv[0]处考虑的第一个参数是文件名。其余参数的索引为1,2,依此类推。在下面的示例中,我们看到脚本如何使用传递给它的参数。
import sys print(sys.argv[0]) print("Hello ",sys.argv[1],", welcome!")
我们采取以下步骤来运行上述脚本并获得以下结果:
要运行上面的代码,我们进入终端窗口并编写如下所示的命令。这里的脚本名称是args_demo.py。我们将值Samantha的参数传递给此脚本。
D:\Pythons\py3projects>python3 args_demo.py Samantha args_demo.py Hello Samantha welcome!
使用getopt
与前一种方法相比,这是另一种具有更大灵活性的方法。在这里,我们可以收集参数的值并将其与错误处理和异常一起处理。在下面的程序中,我们通过接受参数并跳过第一个参数即文件名来找到两个数字的乘积。当然,这里也使用sys模块。
示例
import getopt import sys # Remove the first argument( the filename) all_args = sys.argv[1:] prod = 1 try: # Gather the arguments opts, arg = getopt.getopt(all_args, 'x:y:') # Should have exactly two options if len(opts) != 2: print ('usage: args_demo.py -x <first_value> -b <second_value>') else: # Iterate over the options and values for opt, arg_val in opts: prod *= int(arg_val) print('Product of the two numbers is {}'.format(prod)) except getopt.GetoptError: print ('usage: args_demo.py -a <first_value> -b <second_value>') sys.exit(2)
输出结果
运行上面的代码给我们以下结果-
D:\Pythons\py3projects >python3 args_demo.py -x 3 -y 12 Product of the two numbers is 36 # Next Run D:\Pythons\py3projects >python3 args_demo.py usage: args_demo.py -x <first_value> -b <second_value>
使用argparse
实际上,这是处理参数传递的最优选模块,因为错误和异常由模块本身处理,而无需其他代码行。我们必须提到将要使用的每个参数所需要的名称帮助文本,然后在代码的其他部分中使用参数的名称。
示例
import argparse # Construct an argument parser all_args = argparse.ArgumentParser() # Add arguments to the parser all_args.add_argument("-x", "--Value1", required=True, help="first Value") all_args.add_argument("-y", "--Value2", required=True, help="second Value") args = vars(all_args.parse_args()) # Find the product print("Product is {}".format(int(args['Value1']) * int(args['Value2'])))
输出结果
运行上面的代码给我们以下结果-
D:\Pythons\py3projects>python3 args_demo.py -x 3 -y 21 Product is 63 # Next Run D:\Pythons\py3projects>python3 args_demo.py -x 3 -y usage: args_demo.py [-h] -x VALUE1 -y VALUE2 args_demo.py: error: argument -y/--Value2: expected one argument