问题提出
最近开发Python程序需要使用命令行参数,于是查阅了以下标准库,发现了argparse。。。
argparse模块简介
argparse模块使得编写用户友好的命令行接口非常容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。
argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。
使用方法
import argparse # 首先导入该模块;
parser = argparse.ArgumentParser() # 然后创建一个解析对象
# 然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;
parser.add_argument()
;最后调用parse_args()方法进行解析;解析成功之后即可使用
args = parser.parse_args()
ArgumentParser 对象介绍
class argparse.ArgumentParser(
prog=None,
usage=None,
description=None,
epilog=None,
parents=[],
formatter_class=argparse.
HelpFormatter,
prefix_chars='-',
fromfile_prefix_chars=None,
argument_default=None,
conflict_handler='error',
add_help=True)
创建一个新的ArgumentParser对象。所有的参数应该以关键字参数传递。下面有对每个参数各自详细的描述
参数 描述
prog 程序的名字(默认:sys.argv[0])
usage 描述程序用法的字符串(默认:从解析器的参数生成)
description 参数帮助信息之前的文本(默认:空)
epilog 参数帮助信息之后的文本(默认:空)
parents ArgumentParser 对象的一个列表,这些对象的参数应该包括进去
formatter_class 定制化帮助信息的类
prefix_chars 可选参数的前缀字符集(默认:‘-‘)
fromfile_prefix_chars 额外的参数应该读取的文件的前缀字符集(默
argument_default 参数的全局默认值(默认:None)
conflict_handler 解决冲突的可选参数的策略(通常没有必要)
add_help 给解析器添加-h/–help 选项(默认:True)
add_argument函数介绍
ArgumentParser.add_argument(
name or flags...
[, action]
[, nargs]
[, const]
[, default]
[, type]
[, choices]
[, required]
[, help]
[, metavar]
[, dest])
add_argument函数介绍
ArgumentParser.add_argument(
name or flags...
[, action]
[, nargs]
[, const]
[, default]
[, type]
[, choices]
[, required]
[, help]
[, metavar]
[, dest])
定义应该如何解析一个命令行参数。下面每个参数有它们自己详细的描述,简单地讲它们是:
参数 描述
name or flags 选项字符串的名字或者列表,例如foo 或者-f, –foo
action 在命令行遇到该参数时采取的基本动作类型。
nargs 应该读取的命令行参数数目。
const 某些action和nargs选项要求的常数值。
default 如果命令行中没有出现该参数时的默认值。
type 命令行参数应该被转换成的类型。
choices 参数可允许的值的一个容器。
required - 该命令行选项是否可以省略(只针对可选参数)。
help 参数的简短描述。
metavar 参数在帮助信息中的名字。
dest 给parse_args()返回的对象要添加的属性名称。
sys模块中的argv输出命令行参数信息
#!/usr/bin/env python
# encoding: utf-8
# echo.py
import sys
if __name__ == "__main__":
print "您运行程序时输入的运行信息有 %s, 类型 %s" % (sys.argv, len(sys.argv))
print "命令行参数的长度", len(sys.argv)
print "输出每一个参数的信息"
for i, eachArg in enumerate(sys.argv):
print "[%d] = %s" % (i, eachArg)
运行结果如下!
示例
实现lixnua下echo的功能,显示参数信息
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
# 设置dest = "echo"以后
# 我们的parser可以从参数中读取出名为echo的参数
# 我们在使用parse_args( )读取参数信息后,可以直接用args.echo读取该参数
parser.add_argument(dest = "echo", help = "echo the string you use here")
args = parser.parse_args()
print "程序运行的所有参数信息"
print "参数信息", args
print "参数类型", type(args)
print "显示字符串echo = ", args.echo # 直接使用args.echo 即可读取参数的信息
上面的代码,我们的程序可以接收一个名为echo参数,然后我们读取了该参数以后,会在后面打印出该参数的信息,因此该程序的功能其实就是linux中echo命令的功能,只不过我们在之前打印了以下参数的信息而已
注意我们的python程序可以使用两种方式运行,python echo.py 或者./echo.py这里我们的需要知道的时,python是不作为参数的,argv[0]就是指向我们的文件名 / 程序名的。
其中help参数指定的是参数的帮助信息,运行-h 或者--help 我们可以看到运行参数的帮助信息。
实现计算一个数m的n次方
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(dest = "m", help = "pleaer enter the m...")
parser.add_argument(dest = "n", help = "pleaer enter the n...")
args = parser.parse_args()
print "%d ^ %d = %d" % (args.m, args.n, args.m ** args.n)
首先运行帮助,我们看看需要输入哪些参数
我们可以看到运行的示例是square.py m n
于是我们输入python square.py 5 2
我们从命令行中取出的参数默认是str类型的,不能进行数学运算,因此我们需要进行一个转换,可以使用int()函数将字符串转换为整形,但是我们的argparser提供了更好的方法,那就是add_argument函数的type参数
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(dest = "m", help = "pleaer enter the m...", type = int)
parser.add_argument(dest = "n", help = "pleaer enter the n...", type = int)
args = parser.parse_args()
print "%d ^ %d = %d" % (args.m, args.n, args.m ** args.n)
现在程序的运行结果如下所示
但是这仍然不够,我们见过很多命令行的程序,人家的参数不是这样指定的,是有选项-u -p -s 来指定的。
请看下面的程序
#!/usr/bin/env python
# encoding: utf-8
import sys
import argparse
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-m", "--m_number", dest = "m", help = "pleaer enter the m...", type = int)
parser.add_argument("-n", "--n_number", dest = "n", help = "pleaer enter the n...", type = int)
args = parser.parse_args()
print "%d ^ %d = %d" % (args.m, args.n, args.m ** args.n)