问:linux系统命令如ls,它有几十个参数,可带一个或多个参数,可不分先后,用起来是非常的专业。但是自己写的传参脚本,一般只传一个参数,如果传多个,也是固定的顺序,那么如何用python写出更专业的传参脚本呢?
答:使用python自带的getopt模块。
1、语法:
import getopt
getopt.getopt(args,shortopts, longopts=[])
#函数示例:getopt.getopt(sys.argv[1:],'u:p:P:h',["username=","password=","port=","help"])
#输出格式:[('-p', '123'),('-u', 'root')] [] #后面中括号包含没有"-"或"--"的参数
2、参数说明:
args 所有传参参数,一般用sys.argv[1:]表示,即所有传参内容;
shortopts短格式,一般参数如-u,-p,-h等(一个"-"的)就是短格式;那写在函数中就是"u:p:P:h",有冒号代表有参数,没冒号代表没参数。
longopts 长格式,一般参数如--username,--password,--help等(两个"-"的)就是长格式;那写在函数中就是["usrname=",'password=","help"],其中--help是没有值的,所以没有等于号。其它有等于号,表示后面需要参数。
3、演示效果:
短格式传参:
[root@yang scripts]# python getopt_test.py -u yangyun -p 123456 -P 2222
username: yangyun
password: 123456
port: 2222
长格式传参:(也可以加=号)
[root@yang scripts]# python getopt_test.py --username yangyun --password 123456 --port 2222
长短格式都用:
[root@yang scripts]# python getopt_test.py --username=yangyun -p 123456 --port 2222
只传单个参数,其它是默认值:
[root@yang scripts]# python getopt_test.py -p 123456
username: root
port: 22
#此处port与user都用的默认值,默认值在函数里指定
4、python传参脚本实例:
# cat getopt_test.py
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
<code>#!/usr/bin/python</code>
<code>#by yangyun 2015-1-11</code>
<code> </code>
<code>import</code> <code>getopt </code>
<code>import</code> <code>sys</code>
<code>#导入getopt,sys模块</code>
<code>#定义帮助函数</code>
<code>def</code> <code>help</code><code>():</code>
<code> </code><code>print</code> <code>"Usage error!"</code>
<code> </code><code>sys.exit()</code>
<code>#输出用户名</code>
<code>def</code> <code>username(username):</code>
<code> </code><code>print</code> <code>'username:'</code><code>,username</code>
<code>#输出密码</code>
<code>def</code> <code>password(password):</code>
<code> </code><code>if</code> <code>not</code> <code>password:</code>
<code> </code><code>help</code><code>()</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code> <code>'password:'</code><code>,password</code>
<code>#输出端口</code>
<code>def</code> <code>port(port):</code>
<code> </code><code>print</code> <code>'port:'</code><code>,port</code>
<code>#获取传参内容,短格式为-u,-p,-P,-h,其中-h不需要传值。</code>
<code>#长格式为--username,--password,--port,--help,长格式--help不需要传值。</code>
<code>opts,args</code><code>=</code><code>getopt.getopt(sys.argv[</code><code>1</code><code>:],</code><code>'u:p:P:h'</code><code>,[</code><code>"username="</code><code>,</code><code>"password="</code><code>,</code><code>"port="</code><code>,</code><code>"help"</code><code>])</code>
<code>#print opts,' ' ,args</code>
<code>#设置默认值变量,当没有传参时就会使用默认值。</code>
<code>username_value</code><code>=</code><code>"root"</code>
<code>port_value</code><code>=</code><code>'22'</code>
<code>password_value</code><code>=</code><code>'' </code><code>#密码不使用默认值,所以定义空。</code>
<code>#循环参数列表,输出格式为:[('-p','123'), ('-u', 'root')] []</code>
<code>for</code> <code>opt,value </code><code>in</code> <code>opts:</code>
<code> </code><code>if</code> <code>opt </code><code>in</code><code>(</code><code>"-u"</code><code>,</code><code>"--username"</code><code>):</code>
<code> </code><code>username_value</code><code>=</code><code>value</code>
<code> </code><code>#如果有传参,则重新赋值。</code>
<code> </code><code>if</code> <code>opt </code><code>in</code><code>(</code><code>"-p"</code><code>,</code><code>"--password"</code><code>):</code>
<code> </code><code>password_value</code><code>=</code><code>value</code>
<code> </code><code>if</code> <code>opt </code><code>in</code><code>(</code><code>"-P"</code><code>,</code><code>"--port"</code><code>):</code>
<code> </code><code>port_value</code><code>=</code><code>value</code>
<code> </code><code>if</code> <code>opt </code><code>in</code><code>(</code><code>"-h"</code><code>,</code><code>"--help"</code><code>):</code>
<code>#执行输出用户名、密码、端口的函数,如果有变量没有传值,则使用默认值。</code>
<code>username(username_value)</code>
<code>password(password_value)</code>
<code>port(port_value)</code>
本文转自杨云1028 51CTO博客,原文链接:http://blog.51cto.com/yangrong/1603634,如需转载请自行联系原作者