Python 命令行参数
Python 命令行参数 提供了一种方便的方式,在运行程序时通过命令行接受一些信息。在Python脚本名称之后给出的参数被称为 命令行参数 ,它们被用于向程序传递一些信息。例如 –
$ python script.py arg1 arg2 arg3
这里的Python脚本名字是 script.py ,其他三个参数 – arg1 arg2 arg3是程序的命令行参数。有以下三个Python模块可以帮助解析和管理命令行参数:
- sys模块
- getopt模块
- argparse模块
sys模块 – 系统特定参数
Python sys 模块通过 sys.argv 提供对任何命令行参数的访问。它有两个目的 –
- sys.argv是命令行参数的列表。
-
len(sys.argv)是命令行参数的数量。
这里sys.argv[0]
是程序即脚本名字。
示例
考虑以下脚本test.py –
import sys
print 'Number of arguments:', len(sys.argv), 'arguments.'
print 'Argument List:', str(sys.argv)
请按照以下方式运行上述脚本。本教程中的所有程序都需要从命令行运行,因此我们无法提供在线编译和运行这些程序的选项。请尝试在您的计算机上运行这些程序。
$ python test.py arg1 arg2 arg3
这个结果如下:
Number of arguments: 4 arguments.
Argument List: ['test.py', 'arg1', 'arg2', 'arg3']
正如上面提到的,第一个参数总是脚本名称,而且也计入了参数的数量。
解析命令行参数
Python提供了一个 getopt 模块,帮助你解析命令行选项和参数。该模块提供了两个函数和一个异常来启用命令行参数解析。
getopt.getopt方法
该方法用于解析命令行选项和参数列表。以下是该方法的简单语法−
getopt.getopt(args, options, [long_options])
以下是参数的详细信息:
- args - 这是要解析的参数列表。
-
options - 这是脚本希望识别的选项字母的字符串,需要参数的选项后面应跟着一个冒号(:)。
-
long_options - 这是可选参数,如果指定了,必须是一个带有要支持的长选项名称的字符串列表。需要参数的长选项应跟着一个等号(=)。如果只接受长选项,则选项应为空字符串。
getopt.getopt()方法返回一个由两个元素组成的值:第一个元素是一个包含 (选项,值) 对的列表。第二个元素是在剥离选项列表后剩余的程序参数列表。返回的每个选项和值对都以选项作为其第一个元素,对于短选项,前面带有一个连字符(例如,’-x’),对于长选项,前面带有两个连字符(例如,’–long-option’)。
示例
以下是一个Python程序,在命令行接受三个参数:
- 第一个命令行参数是 -h ,它将用于显示程序的用法帮助。
- 第二个参数是 -i 或 --ifile ,我们将其视为输入文件。
- 第三个参数是 -o 或 --ofile ,我们将其视为输出文件。
以下是test.py脚本:
import sys, getopt
def main(argv):
inputfile = ''
outputfile = ''
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
for opt, arg in opts:
if opt == '-h':
print ('test.py -i <inputfile> -o <outputfile>')
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print ('Input file is ', inputfile)
print ('Output file is ', outputfile)
if __name__ == "__main__":
main(sys.argv[1:])
现在,按照以下方式运行上述脚本 −
$ python test.py -i IN -o OUT
这将产生以下结果:
Input file is IN
Output file is OUT
我们还可以按照以下方式运行上述程序:
$ python test.py --ifile IN --ofile OUT
这将产生与-i和-o相同的结果:
Input file is IN
Output file is OUT
我们可以使用 h 选项来检查程序的使用情况:
$ python test.py -h
这将产生以下结果:
test.py -i <inputfile> -o <outputfile>
异常 getopt.GetoptError
考虑一下如果我们使用一些程序中没有实现的其他选项。这将引发异常。例如,让我们尝试使用错误的选项再次运行相同的程序 -p ,如下所示:
$ python test.py -j IN -o OUT
这会引发以下异常:
Traceback (most recent call last):
File "test.py", line 21, in
main(sys.argv[1:])
File "test.py", line 8, in main
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
File "/usr/lib64/python3.6/getopt.py", line 95, in getopt
opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
File "/usr/lib64/python3.6/getopt.py", line 195, in do_shorts
if short_has_arg(opt, shortopts):
File "/usr/lib64/python3.6/getopt.py", line 211, in short_has_arg
raise GetoptError(_('option -%s not recognized') % opt, opt)
getopt.GetoptError: option -j not recognized
当在参数列表中发现未识别的选项,或者给定的选项需要一个参数但没有提供时,将引发此异常。异常的参数是一个指示错误原因的字符串。属性 msg 和 opt 给出了错误消息和相关选项。
示例
以下是一个正确的Python程序,使用了 try…except 块,并捕获 getopt.GetoptError 异常:
import sys, getopt
def main(argv):
inputfile = ''
outputfile = ''
try:
opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
except getopt.GetoptError:
print ('test.py -i <inputfile> -o <outputfile>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print ('test.py -i <inputfile> -o <outputfile>')
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print ('Input file is ', inputfile)
print ('Output file is ', outputfile)
if __name__ == "__main__":
main(sys.argv[1:])
现在,按照以下步骤运行以上脚本 −
$ python test.py -j IN -o OUT
这将以优雅的方式运行程序,与我们在异常部分实现的一样,将显示程序的使用方法:
test.py -i <inputfile> -o <outputfile>
Python argparse模块
Python argparse 模块使编写用户友好的命令行界面变得简单。程序定义了它需要的参数,argparse会解析出这些参数。argparse模块还会自动生成帮助和用法消息。当用户提供给程序无效的参数时,模块也会报错。
示例
以下是一个简单使用 argparse 接受一个name参数的示例:
import argparse
argParser = argparse.ArgumentParser()
argParser.add_argument("-n", "--name", help="your name")
args = argParser.parse_args()
print("args=%s" % args)
print("args.name=%s" % args.name)
可以使用 add_argument() 方法添加任意数量的参数,实际上,您还可以提供参数的必需数据类型,如下所示。
argParser.add_argument("-i", "--int", type=int, help="your numeric age ")
然而,让我们尝试以以下方式运行上述程序:
$ python test.py -h
这将显示以下帮助:
usage: test.py [-h] [-n NAME]
optional arguments:
-h, --help show this help message and exit
-n NAME, --name NAME your name
现在,如果我们提供我们的名字给程序,如下所示:
$ python test.py -n Zara
它将显示以下结果:
args=Namespace(name='Zara')
args.name=Zara