目录
一、使用sys.argv
二、使用argparse模块
更多功能:
三、使用getopt模块
四、使用argparse模块来处理布尔型参数
1.使用store_true和store_false动作
2.自定义布尔型参数的处理
一、使用sys.argv
在python中sys.argv是一个包含命令行参数的列表。其中sys.argv[0]是脚本自身的名称,从sys.args[1]开始之后的是传递给脚本的参数。这种方式比较简单直接,但是对于复杂的参数解析可能不太方便。
假如我们有一个名为test.py的脚本
import sys
print('脚本名称:', sys.argv[0])
print('参数列表:',sys.atgv[1:])
如果在命令行中运行python test.py arg1 arg2,输出的结果为:
脚本名称: test.py参数列表: ['arg1', 'arg2']
二、使用argparse模块
argparse模块是python标准库中一个用于命令行参数解析的高级工具。它可以帮助你轻松地定义程序所需的参数,包括参数的名称、类型、帮助信息、默认值等,并且会自动生成帮助文档
1.首先需要创建一个ArgumentParser对象
import argparse
parse=argparse.ArgumentParser(description='这是一个示例程序')
2.添加参数:可以通过add_argument方法添加各种参数,例如添加一个整形的参数和一个字符串类型的可选参数
parser.add_argument('num', type=int, help='添加一个整形参数')
parser.add_argument('-s', '--string', type=str, defult='默认字符串', help='一个可选的字符串参数')
3.解析参数
使用parse_args()方法来解析命令行参数
args=parser.parse_args()
print('整形参数:', args.num)
print('字符串参数:', args.string)
假设这个脚本名为argparse_demo.py
,在命令行中运行python argparse_demo.py 5 -s custom_string
,输出将会是:
整数参数: 5字符串参数: custom_string
更多功能:
1.互斥参数:可以定义互斥的参数组。例如,定义一个程序,要么接受--input-file
参数,要么接受--input-url
参数,但不能同时接受两者
input_group = parser.add_mutually_exclusive_group(required=True)input_group.add_argument("--input-file", type=str, help="输入文件路径")input_group.add_argument("--input-url", type=str, help="输入URL")
子命令:argparse
还支持子命令。例如,一个命令行工具可能有不同的子命令,如init
、start
、stop
等,每个子命令可以有自己的一组参数。
subparsers = parser.add_subparsers(dest="command")init_parser = subparsers.add_parser("init", help="初始化操作")init_parser.add_argument("--config", type=str, help="配置文件路径")start_parser = subparsers.add_parser("start", help="启动操作")start_parser.add_argument("--port", type=int, help="端口号")
三、使用getopt模块
getopt模块提供了一种类似于c语言getopt函数的方式来处理命令行参数。它主要通过解析命令行参数列表中的选项(以短选项或者长选项的形式)来工作
import getoptimport sysdef main(argv):try:opts, args = getopt.getopt(argv, "hi:o:", ["ifile=", "ofile="])except getopt.GetoptError:print('test.py -i <inputfile> -o <outputfile>')sys.exit(2)input_file = Noneoutput_file = Nonefor opt, arg in opts:if opt == '-h':print('test.py -i <inputfile> -o <outputfile>')sys.exit()elif opt in ("-i", "--ifile"):input_file = argelif opt in ("-o", "--ofile"):output_file = argprint('输入文件:', input_file)print('输出文件:', output_file)if __name__ == "__main__":main(sys.argv[1:])
这个脚本接受-i
(或--ifile
)和-o
(或--ofile
)两个选项,用于指定输入文件和输出文件。运行方式类似python test.py -i input.txt -o output.txt
。不过,argparse
在大多数情况下更推荐使用,因为getopt
相对来说更复杂且功能没有argparse
强大。
四、使用argparse模块来处理布尔型参数
1.使用store_true和store_false动作
在argparse
模块中,当添加参数时,可以通过action
参数指定参数的行为。对于布尔型参数,store_true
和store_false
是最常用的动作。store_true
表示如果该参数在命令行中出现,对应的变量将被设置为True
;store_false
则相反,若参数出现,变量被设置为False
。
import argparseparser = argparse.ArgumentParser(description="布尔型参数示例")# 添加一个布尔型参数,默认为False,当参数出现时为Trueparser.add_argument("--verbose", action="store_true", default=False, help="是否开启详细输出")args = parser.parse_args()if args.verbose:print("详细输出已开启")else:print("详细输出未开启")
- 当在命令行中运行
python script.py
(没有--verbose
参数)时,输出为详细输出未开启
。 - 当运行
python script.py --verbose
时,输出为详细输出已开启
。
2.自定义布尔型参数的处理
可以通过自定义类型转换函数来处理布尔型参数。这种方式更灵活,适用于需要对参数数值进行更复杂验证或者转换的情况
import argparsedef str2bool(v):if isinstance(v, bool):return vif v.lower() in ('yes', 'true', 't', 'y', '1'):return Trueelif v.lower() in ('no', 'false', 'f', 'n', '0'):return Falseelse:raise argparse.ArgumentTypeError('布尔值预期')parser = argparse.ArgumentParser(description="自定义布尔型参数示例")# 添加一个自定义类型转换的布尔型参数parser.add_argument("--active", type=str2bool, default=False, help="是否激活")args = parser.parse_args()if args.active:print("已激活")else:print("未激活")
- 当在命令行中运行
python script.py
(没有--active
参数)时,输出为未激活
。 - 当运行
python script.py --active true
或者python script.py --active yes
等合法的真值形式时,输出为已激活
。 - 当运行带有非法布尔值的命令行参数时,如
python script.py --active maybe
,会抛出argparse.ArgumentTypeError
异常,提示布尔值预期
。