有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的)。在C语言里,main函数的原型为int main(int argc, char **argv),这里主要指Linux平台, argv指的是命令行传入的参数个数(程序的name为第一个参数),而argv则是一个指针数组,每一个元素为指向一个命令行参数的指针。在Python里的命令行参数是存储在sys.argv里,argv是一个列表,第一个元素也为程序名称。
看下面的例子:
1
2
3
4
5
6
7
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import
sys
if
__name__
==
'__main__'
:
for
item
in
sys
.argv
:
print
item
|
在命令行运行./test.py 1 2 3,结果如下:
1
2
3
4
5
|
$
python
test
.py
1
2
3
test
.py
1
2
3
|
用这种方式可以进行命令行参数的判断从而进行不同的动作。而Python的标准库里实际上有专门处理命令行参数的getopt模块,getopt模块用于抽出命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式和长选项模式。getopt里面的提供了2个函数和一个类,我们主要使用getopt函数,先看下函数原型:
1
|
def
getopt
(
args
,
shortopts
,
longopts
=
[
]
):
|
( [命令行参数列表], “短选项”, [长选项列表] )
先看一个例子,这样会便于理解。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import
sys
import
getopt
try
:
opts
,
args
=
getopt
.getopt
(
sys
.argv
[
1
:
]
,
"ho:v"
,
[
"help"
,
"output="
]
)
except
getopt
.GetoptError
:
print
str
(
err
)
sys
.exit
(
2
)
for
o
,
a
in
opts
:
print
o
,
a
for
i
in
args
:
print
i
|
1. 处理所使用的函数叫getopt() ,因为是直接使用import导入的getopt模块,所以要加上限定getopt才可以。
2. 使用sys.argv[1:]过滤掉第一个参数(它是执行脚本的名字,不应算作参数的一部分)。
3. 使用短格式分析串”ho:”,当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个”:” 号 。所以”ho:v” 就表示”h”是一个开关选项;”o:” 则表示后面应该带一个参数,”v”也是一个开关选项。
4. 使用长格式分析串列表:[“help”, “output=”],长格式串也可以有开关状态,即后面不跟”=” 号。如果跟一个等号则表示后面还应有一个参数,这个长格式表示”help”是一个开关选项;”output=” 则表示后面应该带一个参数。
5. 调用getopt函数,函数返回两个列表:opts和args,opts为分析出的格式信息,args为不属于格式信息的剩余的命令行参数。opts是一个两元组的列表,每个元素为:( 选项串, 附加参数) ,如果没有附加参数则为空串” 。
6. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。
如上面解释的一个命令行例子为:
1
|
'-h -o file -v --help --output=out file1 file2'
|
在分析完成后,opts应该是:
1
|
[
(
'-h'
,
''
)
,
(
'-o'
,
'file'
)
,
(
'-v'
,
''
)
,
(
'--help'
,
''
)
,
(
'--output'
,
'out'
)
]
|
而args则为:
1
|
[
'file1'
,
'file2'
]
|
下面就是根据不同参数处理:
1
2
3
4
5
6
7
8
|
$
python
test
.py
-
h
-
o
file
-
v
--
help
--
output
=
out
file1
file2
-
h
-
o
file
-
v
--
help
--
output
out
file1
file2
|
注意,如果你输入的短选项或者长选项不在getopt.getopt定义的参数内,执行时就会报错的哦。
模拟一个登陆脚本:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import
sys
import
getopt
def
usage
(
)
:
print
'''
python
sys
.srgv
[
0
]
[
options
]
[
value
]
.
.
.
[
options
]
--
help
-
h
,
--
host
[
string
]
-
P
,
--
port
[
int
]
-
u
,
--
user
[
string
]
-
p
,
--
passwd
[
string
]
'''
def
main
(
)
:
shortargs
=
'h:P:u:p:'
longargs
=
[
"help"
,
"host"
,
"port"
,
"user="
,
"passwd="
]
try
:
opts
,
args
=
getopt
.getopt
(
sys
.argv
[
1
:
]
,
shortargs
,
longargs
)
except
getopt
.GetoptError
:
usage
(
)
sys
.exit
(
1
)
for
o
,
a
in
opts
:
if
o
==
"--help"
:
usage
(
)
elif
o
in
(
"-h"
,
"--host"
)
:
if
a
==
"127.0.0.1"
:
print
"Host=127.0.0.1"
else
:
usage
(
)
elif
o
in
(
"-P"
,
"--port"
)
:
if
a
==
"3306"
:
print
"port=3306"
else
:
usage
(
)
elif
o
in
(
"-u"
,
"--user"
)
:
if
a
==
"root"
:
print
"user=root"
else
:
usage
(
)
elif
o
in
(
"-p"
,
"--passwd"
)
:
if
a
==
"123456"
:
print
"password=123456"
else
:
usage
(
)
else
:
usage
(
)
if
__name__
==
"__main__"
:
if
(
len
(
sys
.argv
)
==
1
)
:
usage
(
)
print
len
(
(
sys
.argv
)
)
sys
.exit
(
1
)
else
:
main
(
)
|
执行脚本
1
2
3
4
5
|
$
python
test
.py
-
h
127.0.0.1
-
P
3306
--
user
=
root
--
passwd
123456
Host
=
127.0.0.1
port
=
3306
user
=
root
password
=
123456
|
可以看出,这个脚本非常死,任何一个选项或参数不正常就会异常输出。当然,一个登陆选项还有很多东西要做,这里只是使用一个getopt模块而已。
转自:http://www.ywnds.com/?p=10361