argv获取命令行参数?
Python中,argv是一个命令行参数数组,它包含了用户传入脚本的所有参数。argv是通过sys模块来获取的,可以通过如下方式导入sys模块:
import sys
一般情况下,argv中包含的 个元素是脚本的名称,剩余的元素则是用户传递的参数。例如,如果我们执行以下命令:
python script.py arg1 arg2 arg3
那么,sys.argv将包含如下元素:
['script.py', 'arg1', 'arg2', 'arg3']
我们可以通过访问argv列表来获取命令行参数。下面是一个简单的例子,展示如何使用argv获取命令行参数:
import sys
if len(sys.argv) > 1:
print("The first parameter is {0}".format(sys.argv[1]))
else:
print("No parameters")
在这个例子中,我们首先检查argv列表中是否有参数。如果有,我们打印出 个参数值。如果没有参数,我们打印出“No parameters”。
在大多数情况下,您需要将argv的元素分解为具有特定意义的值,从而更有效地处理命令行参数。您可以使用Python解析器提供的argparse模块来完成此操作。
Argparse是Python标准库中的一部分,它提供了一种简单的方式来处理命令行参数。Argparse是一种灵活的工具,可以帮助你处理用户的所有需求,你可以使用argparse来解析任意数量和类型的参数。
Argparse的主要构造块有ArgumentParser、ArgumentGroup、ArgumentParser以及其他函数。在下面,我们将解释如何使用这些构造块来处理命令行参数。
1. 创建ArgumentParser
Argparse的核心是ArgumentParser类,它允许你定义程序的参数选项和参数解析行为。使用ArgumentParser创建解析器对象,然后添加程序需要的参数选项。在下面的例子中,我们使用ArgumentParser创建了一个简单的解析器,添加了一个“--parameter”参数选项。
import argparse
# 创建解析器
parser = argparse.ArgumentParser()
# 添加参数
parser.add_argument('--parameter', action='store_true', help='description of parameter')
# 解析参数
args = parser.parse_args()
# 获取参数值
if args.parameter:
print('Parameter passed!')
2. 添加参数选项
Argparse可以解析多种类型的参数选项,例如:布尔型、字符串、数字等。对于每个参数选项,我们都提供了一组关键字参数选项来定义其详细信息。下面是一些可用的关键字参数选项:
- dest:在Namespace对象中存储参数的属性名称;
- action:指定参数如何改变解析器的行为;
- nargs:表示参数应该解析的数量;
- const:为“store_const”和“append_const”等行为存储值;
- default:如果参数没有被给出,则使用此值;
- type:指定参数需要被解析成的类型;
- choices:可用的参数值;
下面是一个添加多个参数选项的例子:
import argparse
# 创建解析器
parser = argparse.ArgumentParser()
# 添加多个参数
parser.add_argument('-v', action='store_true', help='verbose mode')
parser.add_argument('-i', '--input', type=str, help='input file')
parser.add_argument('-o', '--output', type=str, help='output file')
parser.add_argument('--version', action='version', version='%(prog)s 1.0')
# 获取参数值
args = parser.parse_args()
if args.v:
print('Verbose mode')
if args.input:
print('Input file: {0}'.format(args.input))
if args.output:
print('Output file: {0}'.format(args.output))
在这个例子中,我们使用字母参数(例如-v,-i和-o)来指定选项。我们还使用长参数名(--input和--output)指定选项。值得一提的是,我们在--version中使用用于打印程序名称的特殊字符。
3. 添加参数组
argumentGroup对象允许您将参数分组,以便对它们进行控制。在这个组中,您可以添加新的参数选项或子组。ArgumentGroup类和ArgumentParser类的用法相似。下面是一个指定输入和输出文件路径的例子:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_argument_group('I/O files')
group.add_argument('-i', '--input', type=str, help='input file')
group.add_argument('-o', '--output', type=str, help='output file')
args = parser.parse_args()
if args.input:
print('Input file: {0}'.format(args.input))
if args.output:
print('Output file: {0}'.format(args.output))
在这个示例中,我们使用add_argument_group()方法创建了一个新的参数组,用于指定输入和输出文件路径。我们在这个组中添加了-i和-o选项,并解析了user传递进来的参数。
4. 添加位置参数
位置参数是不带前缀的参数,它们紧随在命令名称后面。Argparse提供了add_argument()方法来添加位置参数。当您提供多个位置参数时,Argparse会按顺序解析它们,并将它们存储在args命名空间中。下面是一个使用位置参数的简单例子:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('value', type=str, help='enter a value')
args = parser.parse_args()
if args.value:
print('Value entered: {0}'.format(args.value))
在这个例子中,我们只添加了一个位置参数,用于输入值。当用户传入值时,我们将其打印到控制台上。
5. 添加子命令
subparsers()方法允许您为程序添加一个或多个子命令。每个子命令都有自己的参数选项。为了让Argparse正确读取子命令,您必须在ArgumentParser上调用add_subparsers()方法,然后将每个命令作为一个新的ArgumentParser添加到解析器对象的子命令中。
下面是一个具有多个子命令的例子:
import argparse
def add(args):
print('Result:', args.x + args.y)
def sub(args):
print('Result:', args.x - args.y)
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
# 子命令add
parser_add = subparsers.add_parser('add')
parser_add.add_argument('-x', type=int)
parser_add.add_argument('-y', type=int)
parser_add.set_defaults(func=add)
# 子命令sub
parser_sub = subparsers.add_parser('sub')
parser_sub.add_argument('-x', type=int)
parser_sub.add_argument('-y', type=int)
parser_sub.set_defaults(func=sub)
args = parser.parse_args()
args.func(args)
在这个示例中,我们首先创建了两个函数:add()和sub()。每个函数都接受两个参数并打印结果。然后,我们创建了一个新的ArgumentParser对象,并使用它添加两个子命令:add和sub。对于每个子命令,我们添加了-x和-y选项,并使用set_defaults()方法将命令关联到函数。最后,我们使用parse_args()方法解析user传递的参数,并使用func属性调用关联的命令函数。
6. 参数值类型转换
Argparse可以解析许多不同的数据类型,例如int、float和bool。如果您想使用自己的数据类型,您可以定义自己的类型转换函数。这可以通过定义一个自定义函数来实现,然后将其传递给type参数制定。例如:
`
import argparse
def my_type(string):
if string.isdigit():
return int(string)
else:
raise argparse.ArgumentTypeError('{0} is not a valid type'.format(string))
parser = argparse.ArgumentParser()
parser.add_argument('-a', type=my_type)
args = parser.parse_args()
if args.a:
print('Value entered:
