前言
平常我們在用別人寫好的python包的時候,在cmd輸入xx -h就能查看到幫助信息,輸入xx -p 8080就能把參數傳入程序裏,看起來非常酷。 本篇就來講下如何在python代碼里加入命令行參數,並且其它功能,能調用這個參數。
argv獲取參數
Python 中也可以所用 sys 的 sys.argv 來獲取命令行參數:
- sys.argv 是命令行參數列表。
- len(sys.argv) 是命令行參數個數。
注:sys.argv[0] 表示腳本名。
test.py代碼如下
# -*- coding: UTF-8 -*- import sys print '參數個數爲:', len(sys.argv), '個參數。' print '參數列表:', str(sys.argv)
執行以上代碼,輸出結果爲:
$ python test.py arg1 arg2 arg3 參數個數爲: 4 個參數。 參數列表: ['test.py', 'arg1', 'arg2', 'arg3']
getopt模塊
getopt模塊是專門處理命令行參數的模塊,用於獲取命令行選項和參數,也就是sys.argv。命令行選項使得程序的參數更加靈活。支持短選項模式(-)和長選項模式(—)。
該模塊提供了兩個方法及一個異常處理(Exception getopt.GetoptError)來解析命令行參數。
getopt.getopt 方法用於解析命令行參數列表,語法格式如下:
getopt.getopt(args, options[, long_options])
參數說明:
- args: 要解析的命令行參數列表。
- options: 以列表的格式定義,options後的冒號(:)表示該選項必須有附加的參數,不帶冒號表示該選項不附加參數。
- long_options: 以字符串的格式定義,long_options 後的等號(=)表示如果設置該選項,必須有附加的參數,否則就不附加參數。
- 該方法返回值由兩個元素組成: 第一個是 (option, value) 元組的列表。 第二個是參數列表,包含那些沒有’-‘或’—‘的參數。
實例
假定我們創建這樣一個腳本,可以通過命令行向腳本文件傳遞兩個文件名,同時我們通過另外一個選項查看腳本的使用。腳本使用方法如下:
$ test.py -i-o
test.py 文件代碼如下所示:
# -*- coding: UTF-8 -*- import sys, getopt def main(argv): inputfile = '' outputfile = '' try: opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="]) except getopt.GetoptError: print 'test.py -i <inputfile> -o <outputfile>' sys.exit(2) for opt, arg in opts: if opt == '-h': print 'test.py -i <inputfile> -o <outputfile>' sys.exit() elif opt in ("-i", "--ifile"): inputfile = arg elif opt in ("-o", "--ofile"): outputfile = arg print '輸入的文件爲:', inputfile print '輸出的文件爲:', outputfile if __name__ == "__main__": main(sys.argv[1:])
執行以上代碼,輸出結果爲:
$ python test.py -h usage: test.py -i <inputfile> -o <outputfile> $ python test.py -i inputfile -o outputfile 輸入的文件爲: inputfile 輸出的文件爲: outputfile
實際場景運用
結合selenium測試,比如我想測試chrome瀏覽器,那就在命令行輸入“chrome”參數,想測試firefox瀏覽器的時候,就在命令行輸入“firefox”參數,這樣就能靈活切換不同瀏覽器之間的測試了
# 保存爲run.py # coding:utf-8 import sys, getopt from selenium import webdriver import time def main(argv): ''' 命令行傳參 上海-悠悠博客:https://www.cnblogs.com/yoyoketang/ ''' name = "firefox" # 給個默認值 try: # 這裏的 h 就表示該選項無參數,n:表示 n 選項後需要有參數 opts, args = getopt.getopt(argv, "hn:", ["name="]) except getopt.GetoptError: print('Error: test_yoyo.py -n <browsername>') print(' or: test_yoyo.py --name=<browsername>') sys.exit(2) for opt, arg in opts: if opt == "-h": print('test_yoyo.py -n <browsername>') print('or: test_yoyo.py --name=<browsername>') sys.exit() elif opt in ("-n", "--name"): name = arg print('run browser name : %s' % name) return name def browser(n=None): ''' 啓動瀏覽器, n是瀏覽器名稱,支持瀏覽器:chrome ,firefox 上海-悠悠博客:https://www.cnblogs.com/yoyoketang/ ''' if n == None: name = main(sys.argv[1:]) else: name = n if name == "firefox": print("當前執行瀏覽器:%s" % name) return webdriver.Firefox() elif name == "chrome": print("當前執行瀏覽器:%s" % name) return webdriver.Chrome() else: print("支持瀏覽器:chrome,firefox") if __name__ == "__main__": driver = browser() driver.get("https://www.cnblogs.com/yoyoketang/") t = driver.title print(t) time.sleep(10) driver.quit()
cmd執行情況
C:\Users\admin>d: D:\>cd lianxi D:\lianxi>python run.py -n chrome Input name : chrome 當前執行瀏覽器:chrome DevTools listening on ws://127.0.0.1:54248/devtools/browser/595fe8cf-524d-4599-9 540-2502f6a6f2ca 上海-悠悠 - 博客園 D:\lianxi>python run.py -n firefox Input name : firefox 當前執行瀏覽器:firefox 上海-悠悠 - 博客園
備註:python2在cmd執行時,中文會顯示亂碼,用python3就不會有亂碼了