一、概述
python获取命令行参数有两种方法,一种是使用sys模块直接获取到所有的命令行参数,另一种是使用getopt来获取指定标记的参数,后者更灵活一点,但是也复杂一点。
二、sys模块获取参数
通过sys
模块获取命令行参数的方法很简单,直接调用sys.argv
就可以了,sys.argv
是一个命令行参数的列表
,保存了所有命令行的参数,其中第一参数固定为脚本的名字。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/usr/bin/env python # encoding:utf8 import sys def args_test(): print "All arg is:%s" % sys.argv # 打印所有的参数 for arg in sys.argv: # 循环遍历参数 print arg if __name__ == "__main__": args_test() |
然后输入./args.py Hello World
运行,结果如下:
1 2 3 4 |
All arg is:["./args.py", "Hello", "World"] # 第一个为脚本名 二三个是输入参数 ./args.py Hello World |
三、使用getopt模块来获取带标记参数
平常的程序中,经常会遇到这样带标记的参数输入,例如:mysql -u root -p
、ls --help
。当用户的标记输入错误时能出现usage
提醒。
python
中可以利用getopt
模块来完成这一功能,getopt
的用法为:
1 |
getopt.getopt(sys.argv[1:], "u:p:h", ["user=", "password=", "help"]) |
第一个参数是获取系统的命令行传参,sys.argv[1:]
表示从系统二个参数开始获取,因为sys.argv[0]
是脚本名字,对我们来说意义不大。
第二个参数是短标记集合,放在一个字符串中,每个字母表示一个短标记名字,使用的时候在前面加上-
就可以了,上面的就表示设置三个短标记名字-i
-u
-h
。其中如果标记后面有:
,表示该标记为参数值,会提取后面的数据作为值,例如mysql -u root
会把root
作为-u
标记的值;如果没有则表示这个标记为一个开关,触发相应事件,像ls --help
直接打印出命令用法。
第三个是长标记名字,例如ls --help
就是一个长标记参数,和第二个参数中的标记一一对应,标记后面有等号表示为参数标记。
返回值有两个,第一个是opt
,一个列表,每个元素是一个元组,分别表示参数名和值。第二个是args
,表示所有没有被标记的参数值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#!/usr/bin/env python # encoding:utf8 import sys import getopt def usage(): print "-u, --user your mysql user" print "-p, --password your password" print "-h, --hlep print usage" if __name__ == "__main__": try: opts, args = getopt.getopt(sys.argv[1:], "hu:p:", ["help", "user=", "password="]) print opts, args # 打印opts和args参数 except getopt.GetoptError as e: print e sys.exit(1) print "---this is opts---" for name, value in opts: if name in ("-u", "--user"): # user标记 print "User is ", value elif name in ("-p", "--password"): # password标记 print "Password is ", value elif name in ("-h", "--help"): # help标记,显示usage usage() print "---this is args---" for arg in args: print arg |
运行:
1 2 3 4 5 6 7 8 9 10 11 |
ma@ma:/data/code/python/args$ ./args.py -u root -p 123456 -h Hello World [("-u", "root"), ("-p", "123456"), ("-h", "")] ["Hello", "World"] # opts和args,分别是两个列表 ---this is opts--- User is root # -u 标记 Password is 123456 # -p 标记 -u, --user your mysql user # -h 标记 -p, --password your password -h, --hlep print usage ---this is args--- # 未定义的参数标记 Hello World |
要注意的一些点是:
- 短标记和长标记后可以跟空格和等号再接参数,短标记也可以省略这两个符号直接加参数。
- 不管长标记短标记后面都不能跟多个值
评论