Python 命令行参数
要运行Python程序,我们在操作系统的命令提示终端中执行以下命令。例如,在Windows中,以下命令在Windows命令提示终端中输入。
位于C:>(或Linux操作系统中的$)之前的命令提示符行被称为命令行。
如果程序需要接受用户的输入,则使用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将这些参数收集在一个列表对象中。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 − 命令行选项、参数和子命令的解析器。
getopt 模块
Python提供了一个 getopt 模块,帮助你解析命令行选项和参数。该模块提供了两个函数和一个异常来实现命令行参数解析。
getopt.getopt 方法
该方法用于解析命令行选项和参数列表。以下是该方法的简单语法 −
getopt.getopt(args, options, [long_options])
这是参数的详细信息 –
- args - 这是要解析的参数列表。
-
options - 这是脚本希望识别的选项字母的字符串,带有需要参数的选项应该在冒号(:)后面。
-
long_options - 这是一个可选参数,如果指定,则必须是一组包含应该支持的长选项名称的字符串的列表。需要参数的长选项应该在等号(“=”)后面。要只接受长选项,选项应该是一个空字符串。
该方法返回一个由两个元素组成的值 – 第一个元素是一个 (选项, 值) 对的列表,第二个元素是选项列表被剥离后的程序参数列表。
每个返回的选项和值对都有选项作为其第一个元素,对于短选项来说,以连字符(-)作为前缀(例如,’-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
argparse模块
argparse模块提供了编写非常易于使用的命令行界面的工具。它处理如何解析 sys.argv 列表中收集的参数,并在给出无效选项时自动生成帮助和发出错误消息。
设计命令行界面的第一步是设置解析器对象。这可以通过argparse模块中的ArgumentParser()函数来完成。该函数可接受解释性字符串作为描述参数。
为了开始,我们的脚本将在命令行中不带任何参数执行。仍然使用解析器对象的 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")
此脚本的帮助现在以’用户’的形式显示一个位置参数。程序检查它的值是否为’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
但以下用法显示“您好,访客”消息。
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是应该被消耗的命令行参数的数量。’?’。如果可能的话,将从命令行中消耗一个参数,并将其作为单个项产生。如果不存在命令行参数,则将生成默认值。
默认情况下,所有参数都被视为字符串。要明确指定参数的类型,请在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)。
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)
请注意,如果参数的值不在列表中,则显示无效选择错误。
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')