一、概述

python获取命令行参数有两种方法,一种是使用sys模块直接获取到所有的命令行参数,另一种是使用getopt来获取指定标记的参数,后者更灵活一点,但是也复杂一点。

二、sys模块获取参数

通过sys模块获取命令行参数的方法很简单,直接调用sys.argv 就可以了,sys.argv 是一个命令行参数的列表 ,保存了所有命令行的参数,其中第一参数固定为脚本的名字。

#!/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()
#!/usr/bin/env python
# encoding:utf8
importsys
defargs_test():
print"All arg is:%s"%sys.argv# 打印所有的参数
forarginsys.argv:# 循环遍历参数
printarg
if__name__=="__main__":
args_test()

然后输入./args.py Hello World运行,结果如下:

All arg is:["./args.py", "Hello", "World"] # 第一个为脚本名 二三个是输入参数
./args.py
Hello
World


Allargis:["./args.py","Hello","World"]# 第一个为脚本名 二三个是输入参数
./args.py
Hello
World

三、使用getopt模块来获取带标记参数

平常的程序中,经常会遇到这样带标记的参数输入,例如:mysql -u root -p 、ls --help。当用户的标记输入错误时能出现usage提醒。

python中可以利用getopt模块来完成这一功能,getopt的用法为:

getopt.getopt(sys.argv[1:], "u:p:h", ["user=", "password=", "help"])
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,表示所有没有被标记的参数值。

#!/usr/bin/env python
# encoding:utf8
import sys
import getopt
def usage():
print "-u, --useryour mysql user"
print "-p, --passwordyour password"
print "-h, --hlepprint 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
#!/usr/bin/env python
# encoding:utf8
importsys
importgetopt
defusage():
print"-u, --useryour mysql user"
print"-p, --passwordyour password"
print"-h, --hlepprint usage"
if__name__=="__main__":
try:
opts,args=getopt.getopt(sys.argv[1:],"hu:p:",["help","user=","password="])
printopts,args# 打印opts和args参数
exceptgetopt.GetoptErrorase:
printe
sys.exit(1)
print"---this is opts---"
forname,valueinopts:
ifnamein("-u","--user"):# user标记
print"User is ",value
elifnamein("-p","--password"):# password标记
print"Password is ",value
elifnamein("-h","--help"):# help标记,显示usage
usage()
print"---this is args---"
forarginargs:
printarg
运行:
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, --useryour mysql user # -h 标记
-p, --passwordyour password
-h, --hlepprint usage
---this is args--- # 未定义的参数标记
Hello
World


ma@ma:/data/code/python/args$./args.py-uroot-p123456-hHelloWorld
[("-u","root"),("-p","123456"),("-h","")]["Hello","World"]# opts和args,分别是两个列表
---thisisopts---
Userisroot# -u 标记
Passwordis123456# -p 标记
-u,--useryourmysqluser# -h 标记
-p,--passwordyourpassword
-h,--hlepprintusage
---thisisargs---# 未定义的参数标记
Hello
World

要注意的一些点是:

短标记和长标记后可以跟空格和等号再接参数,短标记也可以省略这两个符号直接加参数。

不管长标记短标记后面都不能跟多个值

Python3获取命令行参数 python怎么获取命令行参数_python