Python - 命令行参数



Python 命令行参数

Python 命令行参数提供了一种在运行程序时在命令行中接受某些信息的便捷方法。我们通常将这些值与 Python 脚本的名称一起传递。

要运行 Python 程序,我们在操作系统的命令提示符终端中执行以下命令。例如,在 Windows 中,在 Windows 命令提示符终端中输入以下命令。

$ python script.py arg1 arg2 arg3

这里 Python 脚本名称是 script.py,其余三个参数 - arg1、arg2、arg3 是程序的命令行参数。

如果程序需要接受用户的输入,则使用 Python 的 input() 函数。从命令行执行程序时,将从命令终端接受用户输入。


name = input("Enter your name: ")
print ("Hello {}. How are you?".format(name))

该程序从命令提示符终端运行,如下所示 -

命令提示符

在执行时传递参数

很多时候,您可能需要将程序要使用的数据放在命令行本身中,并在程序内部使用它。在命令行中提供数据的一个例子可以是 Windows 或 Linux 中的任何 DOS 命令。

在 Windows 中,您可以使用以下 DOS 命令将文件重命名为 hello.py hi.py。

C:\Python311>ren hello.py hi.py

在 Linux 中,您可以使用 mv 命令 -

$ mv hello.py hi.py

这里 ren 或 mv 是需要旧文件名和新文件名的命令。由于它们与命令一致,因此它们称为命令行参数。

您可以从命令行将值传递给 Python 程序。Python 将参数收集到 list 对象中。Python 的 sys 模块通过 sys.argv 变量提供对任何命令行参数的访问。sys.argv 是命令行参数列表,sys.argv[0] 是程序,即脚本名称。

hello.py 脚本使用 input() 函数在脚本运行后接受用户输入。让我们更改它以接受来自命令行的输入。


import sys
print ('argument list', sys.argv)
name = sys.argv[1]
print ("Hello {}. How are you?".format(name))

从命令行运行程序,如下图所示 -

命令行

输出如下所示 -

C:\Python311>python hello.py Rajan
argument list ['hello.py', 'Rajan']
Hello Rajan. How are you?

命令行参数始终存储在字符串变量中。要将它们用作数字,您可以通过类型转换函数适当地使用它们。

在下面的示例中,输入两个数字作为命令行参数。在程序内部,我们使用 int() 函数将它们解析为整数变量。


import sys
print ('argument list', sys.argv)
first = int(sys.argv[1])
second = int(sys.argv[2])
print ("sum = {}".format(first+second))

它将产生以下输出 -


C:\Python311>python hello.py 10 20
argument list ['hello.py', '10', '20']
sum = 30

Python 的标准库包括几个有用的模块来解析命令行参数和选项 -

  • getopt − 命令行选项的 C 样式解析器。
  • argparse − 命令行选项、参数和子命令的解析器。

Python getopt 模块

Python 提供了一个 getopt 模块,可帮助您解析命令行选项和参数。此模块提供了两个函数和一个异常,用于启用命令行参数解析。

getOpt.getOpt() 方法

该方法解析命令行选项和参数列表。以下是此方法的简单语法 -


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

以下是参数的详细信息 -

  • args − 这是要解析的参数列表。
  • options − 这是脚本要识别的选项字母字符串,需要参数的选项应后跟冒号 (:).
  • long_options − 这是一个可选参数,如果指定,则必须是 strings 替换为 long 选项的名称,这应该受支持。需要参数的长选项应后跟等号 ('=')。要仅接受长选项,options 应为空字符串。

此方法返回一个由两个元素组成的值 - 第一个是 (option, value) 对的列表,第二个是去除选项列表后留下的程序参数列表。

返回的每个选项和值对都将选项作为其第一个元素,前缀为短选项的连字符(例如,'-x')或长选项的两个连字符(例如,'--long-option')。

异常 getopt.GetoptError

当在参数列表中找到无法识别的选项或需要参数的选项未给出任何选项时,将引发此错误。

异常的参数是一个字符串,指示错误的原因。属性 msg 和 opt 提供错误消息和相关选项。

假设我们想通过命令行传递两个文件名,我们还想提供一个选项来检查脚本的使用情况。脚本的用法如下 -


 usage: test.py -i <inputfile> -o <outputfile>

以下是用于 test.py -


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:])

现在,按如下方式运行上述脚本 -

$ test.py -h
usage: test.py -i <inputfile> -o <outputfile>
$ test.py -i BMP -o
usage: test.py -i <inputfile> -o <outputfile>
$ test.py -i inputfile -o outputfile
Input file is " inputfile
Output file is " outputfile

Python argparse 模块

argparse 模块提供了编写非常易于使用的命令行界面的工具。它处理如何解析 sys.argv 列表中收集的参数,自动生成帮助,并在给出无效选项时发出错误消息。

设计命令行界面的第一步是设置 parser 对象。这是由 argparse 模块中的 ArgumentParser() 函数完成的。可以为函数提供解释字符串作为 description 参数。

首先,我们的脚本将从命令行执行,不带任何参数。还 使用 parser 对象的 parse_args() 方法,该方法不执行任何操作,因为没有给出任何参数。


import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
args=parser.parse_args()

运行上述脚本时 -


C:\Python311>python parser1.py
C:\Python311>python parser1.py -h
usage: parser1.py [-h]
sample argument parser
options:
	 	-h, --help show this help message and exit

第二个命令行用法提供 −help 选项,该选项生成帮助消息,如下所示。默认情况下,−help 参数可用。

现在让我们定义一个参数,该参数对于脚本运行是必需的,如果没有给出,脚本应该会抛出错误。这里我们通过 add_argument() 方法定义参数 'user'。


import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user")
args=parser.parse_args()
if args.user=="Admin":
	 	print ("Hello Admin")
else:
	 	print ("Hello Guest")

此脚本的帮助现在以 'user' 的形式显示一个位置参数。程序检查其值是否为 'Admin' 并打印相应的消息。


C:\Python311>python parser2.py --help
usage: parser2.py [-h] user
sample argument parser
positional arguments:
	 	user
options:
	 	-h, --help show this help message and exit

使用以下命令 -

C:\Python311>python parser2.py Admin
Hello Admin

但以下用法会显示 Hello Guest 消息。

C:\Python311>python parser2.py Rajan
Hello Guest

add_argument() 方法

我们可以在 add_argument() 方法中为参数分配默认值。


import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user", nargs='?',default="Admin")
args=parser.parse_args()
if args.user=="Admin":
	 	print ("Hello Admin")
else:
	 	print ("Hello Guest")

这里 nargs 是应该使用的命令行参数的数量。'?'.如果可能,将从命令行使用一个参数,并作为单个项目生成。如果不存在命令行参数,则将生成 default 的值。

默认情况下,所有参数都被视为字符串。要显式提及参数的类型,请在 add_argument() 方法中使用 type 参数。所有 Python 数据类型都是 type 的有效值。


import argparse
parser=argparse.ArgumentParser(description="add numbers")
parser.add_argument("first", type=int)
parser.add_argument("second", type=int)
args=parser.parse_args()
x=args.first
y=args.second
z=x+y
print ('addition of {} and {} = {}'.format(x,y,z))

它将产生以下输出 -

C:\Python311>python parser3.py 10 20
addition of 10 and 20 = 30

在上面的示例中,参数是必需的。要添加可选参数,请在其名称前加上双短划线--.在以下情况下,surname 参数是可选的,因为它以双破折号 (--surname) 为前缀。


import argparse
parser=argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument("--surname")
args=parser.parse_args()
print ("My name is ", args.name, end=' ')
if args.surname:
	 	print (args.surname)

以单短划线为前缀的参数的单字母名称用作短名称选项。

C:\Python311>python parser3.py Anup
My name is Anup
C:\Python311>python parser3.py Anup --surname Gupta
My name is Anup Gupta

如果希望参数应仅从定义的列表中取值,则将其定义为 choices 参数。


import argparse
parser=argparse.ArgumentParser()
parser.add_argument("sub", choices=['Physics', 'Maths', 'Biology'])
args=parser.parse_args()
print ("My subject is ", args.sub)

请注意,如果参数值不在列表中,则会显示 invalid choice 错误。

C:\Python311>python parser3.py Physics
My subject is Physics
C:\Python311>python parser3.py History
usage: parser3.py [-h] {Physics,Maths,Biology}
parser3.py: error: argument sub: invalid choice: 'History' (choose from
'Physics', 'Maths', 'Biology')