天天看點

用python寫一個專業的傳參腳本

問: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,如需轉載請自行聯系原作者