-
需求:在命令行中通過參數(shù)控制日志的輸出級別
-
思路分析:
1.如果想要通過命令行傳入?yún)?shù)睁枕,那么就要在被執(zhí)行文件中寫入方法能夠獲取到命令行中的參數(shù)
2.如果能獲取到參數(shù)宵晚,那么我們就能通過參數(shù)進行簡單的if 。立轧。。else 判斷給出不同的選項
3.既然有命令行了舍哄,那么-h (help)就一定不能少
4.還有一個比較重要的問題就是怎樣將參數(shù)傳入其它相關(guān)引用模塊中
-
明確這四個功能點后,那就分頭行動誊锭,尋找解決方案
answer python中內(nèi)置函數(shù)模塊 sys 就能實現(xiàn)命令行的抓取
- 方法一:
eg:
文件名為:test.py
import sys
print "腳本名:", sys.argv[0]
for i in range(1, len(sys.argv)):
print "參數(shù)", i, sys.argv[i]
命令行輸出:
python test.py hello world
輸出結(jié)果:
腳本名:test.py
參數(shù) 1 hello
參數(shù) 2 world
這種方法可以實現(xiàn)簡單的參數(shù)傳入表悬,但是無法實現(xiàn){key:value}的形式
例如這樣的更加靈活些:
python test.py -l info - 方法二:
eg:
test.py
import getopt,sys
def usage():
"""使用說明"""
print """
參數(shù)使用說明: -l [info][debug][error][warning]
(分別控制日志輸出級別為:info/debug/error/warning)
!默認日志輸出級別為:warning
eg: python Run.py -l info
"""
opts, args = getopt.getopt(sys.argv[1:], 'hl:')
"""說明:參數(shù)h為開關(guān)丧靡,l:為可識別輸出參數(shù)蟆沫;如果新增p參數(shù),則可以'hl:p:'這樣寫 """
level = 'w'
for op, value in opts:
if op == '-l':
level = value
elif op == '-h':
#幫助文檔
usage()
sys.exit()
命令行:
python test.py -h
python test.py -l info
a) sys.argv[1:]為要處理的參數(shù)列表温治,sys.argv[0]為腳本名饭庞,所以用sys.argv[1:]過濾掉腳本名。
b) "hi:o:": 當一個選項只是表示開關(guān)狀態(tài)時罐盔,即后面不帶附加參數(shù)時但绕,在分析串中寫入選項字符。當選項后面是帶一個附加參數(shù)時惶看,在分析串中寫入選項字符同時后面加一個":"號。所以"hi:o:"就表示"h"是一個開關(guān)選項六孵;"i:"和"o:"則表示后面應該帶一個參數(shù)纬黎。
c) 調(diào)用getopt函數(shù)。函數(shù)返回兩個列表:opts和args劫窒。opts為分析出的格式信息本今。args為不屬于格式信息的剩余的命令行參數(shù)。opts是一個兩元組的列表主巍。每個元素為:(選項串,附加參數(shù))冠息。如果沒有附加參數(shù)則為空串''。
getopt函數(shù)的第三個參數(shù)[, long_options]為可選的長選項參數(shù)孕索,上面例子中的都為短選項(如-i -o)長選項格式舉例:
--version
--file=error.txt
讓一個腳本同時支持短選項和長選項
getopt.getopt(sys.argv[1:], "hi:o:", ["version", "file="])
- 最后一個問題
- 通過全局模塊方法傳遞參數(shù)
eg:
在test2.py中引用test中傳入的參數(shù)level
test2.py
import test.py
parameter = test.level
print parameter
@晴天--2016-09-13 10:48:34