在Python中,argparse是标准库中的一个强大的命令行解析模块。 它的主要目的是从命令行中读取一个或多个参数,并将这些参数用于程序中,使程序更加灵活和易于使用。 在本文中,我们将专注于如何在Python 2.x中使用argparse模块解析命令行参数。
1. argparse模块简介
argparse模块是Python标准库中的一个模块,它提供了一种易于使用和可扩展的机制来解析命令行选项和参数。它允许您定义您的脚本应当如何处理命令行中传入的参数,并自动生成帮助信息。
argparse的主要优势在于它处理参数的方式非常灵活,可以自适应不同的用法和需求。
2. argparse模块的基本用法
argparse模块是Python 2.x的标准库,因此无需安装即可使用。我们可以按照如下方式导入argparse模块:
import argparse
在定义argparse之前,我们需要首先定义我们的脚本需要哪些参数。这些参数通常会被分为两种类型:位置参数和可选参数。
2.1 位置参数
位置参数是指那些必须按照特定顺序传递的参数。例如,如果我们有一个程序,需要接收文件名和一个整型数字作为参数,并分别打印出它们的值,我们可以使用argparse定义位置参数。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('filename', help='name of input file')
parser.add_argument('num', type=int, help='an integer')
args = parser.parse_args()
print('filename:', args.filename)
print('num:', args.num)
在上面的例子中,我们首先导入argparse模块,创建一个ArgumentParser对象。然后,我们使用add_argument()方法添加两个位置参数:filename和num。我们指定filename参数应该是必需的,因为没有默认值,同时还定义num参数为整型(int)。
执行上面的代码,可以看到下面的输出:
usage: example.py [-h] filename num
example.py: error: too few arguments
我们看到输出信息告诉我们我们没有提供足够的参数。 运行方式如下:
$ python example.py testfile.txt 42
filename: testfile.txt
num: 42
这里我们提供了两个参数,一个文件名和一个数字,我们的程序现在以正确的方式使用这些参数进行处理。
2.2 可选参数
可选参数是指那些在脚本调用时可以选择性地传入的参数。例如,我们可能有一个程序,需要使用一个可选参数来指定输出的详细程度。我们可以使用argparse添加可选参数。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true')
args = parser.parse_args()
if args.verbose:
print('verbosity turned on')
在上述代码中,我们定义了一个名为“verbose”的可选参数(-v或--verbose),它可以通过添加“-v”或“--verbose”在命令行中调用。使用store_true作为参数,可以将verbose的值设置为True或False。
如果我们现在运行程序并通过添加“-v”调用它,我们将会看到以下输出:
$ python example.py -v
verbosity turned on
我们看到输出告诉我们verbose选项已启用。
2.3 多个位置参数和可选参数的组合
argparse允许组合多个位置参数和可选参数。为了说明这一点,我们可以创建一个简单的程序,该程序接收一个文件名作为位置参数,并允许用户通过使用-v或--verbose选项来增加输出的详细程度。 我们还可以添加一个--output的可选参数,以指定输出文件名。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('filename', help='name of input file')
parser.add_argument('-o', '--output', help='name of output file')
parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true')
args = parser.parse_args()
if args.verbose:
print('reading input from', args.filename)
with open(args.filename, 'r') as input_file:
content = input_file.read()
if args.output:
with open(args.output, 'w') as output_file:
output_file.write(content)
else:
print(content)
在上述代码中,我们首先定义了一个名为filename的位置参数, 并添加了一个--output的可选参数和一个--verbose选项,使我们能够动态选择输出详细数据,以及指定输出文件名。
如果我们现在运行程序,不添加任何可选参数,我们将会看到程序在标准输出中打印出文件内容。
$ python example.py input.txt
Hello World
我们看到,它只打印了文件中的内容。 加入-v选项,我们会得到以下输出:
$ python example.py input.txt -v
reading input from input.txt
Hello World
现在,我们看到带有-v选项的输出,告诉我们verbose选项已启用,并且应从文件中读取。 如果我们还要将输出写入文件greetings.txt,则可以添加-o和greetings.txt:
$ python example.py input.txt -v -o greetings.txt
3. argparse模块的高级用法
在此之前,我们讨论了argparse模块的基本用法,包括位置参数和可选参数。现在,我们来看看一些更高级的用法。
3.1 使用默认值
在某些情况下,我们可能希望将某个参数的默认值设置为某个值,以便在未指定参数时使用该值。在argparse中,我们可以使用default参数来设置默认值。例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output', default='output.txt', help='output file name')
args = parser.parse_args()
print('output file:', args.output)
在上述代码中,我们定义了一个名为output的可选参数,使用default参数将其默认值设置为output.txt。
如果我们运行这个程序,并不指定任何参数,argparse将使用输出文件的默认名称,默认为output.txt:
$ python example.py
output file: output.txt
如果我们指定输出文件的名称,将会使用我们指定的文件名:
$ python example.py -o greetings.txt
output file: greetings.txt
3.2 参数类型
我们之前在示例中已经看到过一些使用不同参数类型,例如-int和-store_true。argparse为我们提供了一个简单的方法来定义我们需要的特定参数类型。例如,我们可能需要将一个浮点数类型的参数传递给我们的程序:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('temperature', type=float, help='temperature value')
args = parser.parse_args()
print('temperature:', args.temperature)
在上的代码中,我们定义了一个名为temperature的位置参数,我们可以使用type=float参数将它的数据类型设置为浮点数。这样,如果我们通过终端调用程序并传递一个浮点数,则可以得到以下输出:
$ python example.py 0.6
temperature: 0.6
3.3 定义参数范围
在某些情况下,我们希望限制参数的可接受范围。例如,我们可能只想接受整数类型的位置参数,或在特定范围内的数字。在argparse中,我们可以使用choices参数来限制参数的接受值范围。
例如,我们可以限制接受的数字范围为0到100:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('num', type=int, choices=range(0,101), help='an integer between 0 and 100')
args = parser.parse_args()
print('num:', args.num)
在这种情况下,如果我们尝试使用的数字超出了0到100的范围,则会得到错误提示:
$ python example.py 200
usage: example.py [-h] {0..100}
example.py: error: argument num: invalid choice: 200 (choose from 0 to 100)
3.4 其他参数配置
除了上述示例中所讨论的,argparse模块还可以进行更多的参数配置。例如,我们可以使用help参数为每个参数添加描述信息:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('filename', help='name of input file')
parser.add_argument('-o', '--output', help='name of output file')
parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true')
args = parser.parse_args()
if args.verbose:
print('reading input from', args.filename)
with open(args.filename, 'r') as input_file:
content = input_file.read()
if args.output:
with open(args.output, 'w') as output_file:
output_file.write(content)
else:
print(content)
此外,我们还可以为参数添加多个短选项和长选项,如下所示:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', help='increase output verbosity', action='store_true')
parser.add_argument('-f', '--file', '--input_file', help='input file name', required=True)
args = parser.parse_args()
if args.verbose:
print('Reading input from ', args.filename)
with open(args.file, 'r') as input_file:
content = input_file.read()
print(content)
在这个例子中,我们将长选项-f和--file映射到同一参数(file)上,并强制指定这个参数。这样,如果我们不指定该选项时,argparse将从命令行打印出一个带有错误信息的帮助消息。
4. 结论
通过argparse模块,我们可以轻松定义各种类型的位置参数和可选参数,并为这些参数指定各种选项。 简而言之,argparse可以帮助我们构建更加灵活且易于使用的Python命令行应用程序。如果你还没有尝试过argparse模块,希望这篇文章可以为你提供一些基础知识和灵感!