Python 命令行参数

Python 命令行参数

Python 命令行参数 提供了一种方便的方式,在运行程序时通过命令行接受一些信息。在Python脚本名称之后给出的参数被称为 命令行参数 ,它们被用于向程序传递一些信息。例如 –

$ python script.py arg1 arg2 arg3

这里的Python脚本名字是 script.py ,其他三个参数 – arg1 arg2 arg3是程序的命令行参数。有以下三个Python模块可以帮助解析和管理命令行参数:

  1. sys模块
  2. getopt模块
  3. 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程序,在命令行接受三个参数:

  1. 第一个命令行参数是 -h ,它将用于显示程序的用法帮助。
  2. 第二个参数是 -i--ifile ,我们将其视为输入文件。
  3. 第三个参数是 -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

当在参数列表中发现未识别的选项,或者给定的选项需要一个参数但没有提供时,将引发此异常。异常的参数是一个指示错误原因的字符串。属性 msgopt 给出了错误消息和相关选项。

示例

以下是一个正确的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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程