背景
最近編寫一個python程序的時候,需要去獲取python命令行的參數,因此這里記錄下如何獲取命令行參數的方法。
一、sys 模塊
在 Python 中,sys 模塊是一個非常常用且十分重要的模塊,通過模塊中的 sys.argv 就可以訪問到所有的命令行參數,它的返回值是包含所有命令行參數的列表(list),
參數個數: len(sys.argv)
腳本名: sys.argv[0]
參數1: sys.argv[1]
參數2: sys.argv[2]
下面我們通過程序來說明它的用法:
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys def main(): """ 通過sys模塊來識別參數demo, http://blog.csdn.net/ouyang_peng/ """ print('參數個數為:', len(sys.argv), '個參數。') print('參數列表:', str(sys.argv)) print('腳本名為:', sys.argv[0]) for i in range(1, len(sys.argv)): print('參數 %s 為:%s' % (i, sys.argv[i])) 這里還要注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程項目,還可以跟老司機交流討教! if __name__ == "__main__": main() 復制代碼
下面我們通過命令行來運行該python腳本
關注微信公眾號“ python社區營 ”干貨分享,免費獲取視頻資源
1.1、不傳遞參數
- 我們執行命令
python test.py
(venv) C:\Code Python\SMTP>python test.py
參數個數為: 1 個參數。
參數列表: ['test.py'] 腳本名為: test.py 復制代碼
識別到的參數只有一個,就是腳本名 test.py
1.2、傳遞多個參數
- 當我們傳遞參數的時候, 我們執行命令
python test.py ouyangpeng csdn
(venv) C:\Code Python\SMTP>python test.py ouyangpeng csdn
參數個數為: 3 個參數。
參數列表: ['test.py', 'ouyangpeng', 'csdn'] 腳本名為: test.py 參數 1 為:ouyangpeng 參數 2 為:csdn (venv) C:\Code Python\SMTP> 復制代碼
識別到的參數有3個,分別是腳本名 test.py,參數 1 為:ouyangpeng,參數 2 為:csdn
1.3、傳遞多個參數和命令行選項
- 當我們傳遞命令行選項和參數的時候, 我們執行命令
python test.py ouyangpeng csdn -u username -p password
(venv) C:\Code Python\SMTP>python test.py ouyangpeng csdn -u username -p password
參數個數為: 7 個參數。
參數列表: ['test.py', 'ouyangpeng', 'csdn', '-u', 'username', '-p', 'password'] 腳本名為: test.py 參數 1 為:ouyangpeng 參數 2 為:csdn 參數 3 為:-u 參數 4 為:username 參數 5 為:-p 參數 6 為:password 復制代碼
識別到的參數有6個,分別是腳本名 test.py,參數 1 為:ouyangpeng,參數 2 為:csdn,命令行選項 -u 和 -p 都被識別為參數了,這樣不合理,因此我們需要引入getopt模塊來識別命令行選項。
二、getopt模塊
getopt模塊是專門處理命令行參數的模塊,用於獲取命令行選項和參數,也就是sys.argv。命令行選項使得程序的參數更加靈活。支持短選項模式(-)和長選項模式(–)。
該模塊提供了兩個方法及一個異常處理來解析命令行參數。
2.1 getopt.getopt 方法
getopt.getopt 方法用於解析命令行參數列表,語法格式如下:
getopt.getopt(args, options[, long_options])
方法參數說明:
-
args: 要解析的命令行參數列表。
-
options: 以字符串的格式定義,options后的冒號(:)表示該選項必須有附加的參數,不帶冒號表示該選項不附加參數。
-
long_options: 以列表的格式定義,long_options 后的等號(=)表示如果設置該選項,必須有附加的參數,否則就不附加參數。
-
該方法返回值由兩個元素組成: 第一個是 (option, value) 元組的列表。 第二個是參數列表,包含那些沒有’-‘或’–’的參數。
2.1 Exception getopt.GetoptError
在沒有找到參數列表,或選項的需要的參數為空時會觸發該異常。
異常的參數是一個字符串,表示錯誤的原因。屬性 msg 和 opt 為相關選項的錯誤信息。
2.3 實例
了解了 sys 模塊和 getopt 模塊,我們就可以來自己編寫一個帶有命令行的程序並且在該程序中,我們還使用了 getopt.GetoptError 來進行異常處理。代碼如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys import getopt def main(argv): """ 通過 getopt模塊 來識別參數demo, http://blog.csdn.net/ouyang_peng/ """ username = "" password = "" try: """ options, args = getopt.getopt(args, shortopts, longopts=[]) 參數args:一般是sys.argv[1:]。過濾掉sys.argv[0],它是執行腳本的名字,不算做命令行參數。 參數shortopts:短格式分析串。例如:"hp:i:",h后面沒有冒號,表示后面不帶參數;p和i后面帶有冒號,表示后面帶參數。 參數longopts:長格式分析串列表。例如:["help", "ip=", "port="],help后面沒有等號,表示后面不帶參數;ip和port后面帶冒號,表示后面帶參數。 返回值options是以元組為元素的列表,每個元組的形式為:(選項串, 附加參數),如:('-i', '192.168.0.1') 返回值args是個列表,其中的元素是那些不含'-'或'--'的參數。 """ opts, args = getopt.getopt(argv, "hu:p:", ["help", "username=", "password="]) except getopt.GetoptError: print('Error: test_arg.py -u <username> -p <password>') print(' or: test_arg.py --username=<username> --password=<password>') sys.exit(2) # 處理 返回值options是以元組為元素的列表。 for opt, arg in opts: if opt in ("-h", "--help"): print('test_arg.py -u <username> -p <password>') print('or: test_arg.py --username=<username> --password=<password>') sys.exit() elif opt in ("-u", "--username"): username = arg elif opt in ("-p", "--password"): password = arg print('username為:', username) print('password為:', password) # 打印 返回值args列表,即其中的元素是那些不含'-'或'--'的參數。 for i in range(0, len(args)): print('參數 %s 為:%s' % (i + 1, args[i])) if __name__ == "__main__": # sys.argv[1:]為要處理的參數列表,sys.argv[0]為腳本名,所以用sys.argv[1:]過濾掉腳本名。 main(sys.argv[1:]) 復制代碼
2.4 運行結果
2.4.1、不傳遞參數
- 當我們不傳遞參數的時候, 我們執行命令
python test_arg.py
(venv) C:\Code Python\SMTP>python test_arg.py
username為:
password為:
(venv) C:\Code Python\SMTP>
復制代碼
2.4.2、使用短格式選項,不傳遞參數
- 當我們使用短格式選項,不傳遞參數的時候, 我們執行命令
python test_arg.py -h
(venv) C:\Code Python\SMTP>python test_arg.py -h
test_arg.py -u <username> -p <password>
or: test_arg.py --username=<username> --password=<password>
復制代碼
2.4.3、使用長格式選項,不傳遞參數
- 當我們使用長格式選項,不傳遞參數的時候, 我們執行命令
python test_arg.py --help
(venv) C:\Code Python\SMTP>python test_arg.py --help
test_arg.py -u <username> -p <password>
or: test_arg.py --username=<username> --password=<password>
(venv) C:\Code Python\SMTP>
復制代碼
2.4.4、使用短格式選項,傳遞參數
- 當我們使用短格式選項,傳遞參數的時候, 我們執行命令
python test_arg.py -u ouyangpeng -p csdn
(venv) C:\Code Python\SMTP>python test_arg.py -u ouyangpeng -p csdn
username為: ouyangpeng
password為: csdn
(venv) C:\Code Python\SMTP>
復制代碼
2.4.5、使用長格式選項,傳遞參數
- 當我們使用長格式選項,傳遞參數的時候, 我們執行命令
python test_arg.py --username=ouyangpeng --password=csdn
(venv) C:\Code Python\SMTP>python test_arg.py --username=ouyangpeng --password=csdn
username為: ouyangpeng
password為: csdn
(venv) C:\Code Python\SMTP>
復制代碼
2.4.6、使用長短混合格式選項,傳遞參數
- 當我們使用長短混合格式選項,傳遞參數的時候, 我們執行命令
python test_arg.py -u ouyangpeng --password=csdn
(venv) C:\Code Python\SMTP>python test_arg.py -u ouyangpeng --password=csdn
username為: ouyangpeng
password為: csdn
(venv) C:\Code Python\SMTP>
復制代碼
2.4.7、使用格式選項,傳遞部分參數
- 當我們使用長短混合格式選項,傳遞參數的時候, 我們執行命令
python test_arg.py -u ouyangpeng
(venv) C:\Code Python\SMTP>python test_arg.py -u ouyangpeng
username為: ouyangpeng
password為:
(venv) C:\Code Python\SMTP>
復制代碼
2.4.8、傳遞錯誤的選項參數
- 當我們使用錯誤的格式選項傳遞參數的時候, 我們執行命令
python test_arg.py -e
,-e選項不正確
(venv) C:\Code Python\SMTP>python test_arg.py -e Error: test_arg.py -u <username> -p <password> or: test_arg.py --username=<username> --password=<password> (venv) C:\Code Python\SMTP> 復制代碼
2.4.9、傳遞選項參數以及不帶選項的參數
- 當我們傳遞選項參數以及不帶選項的參數的時候, 我們執行命令
python test_arg.py -u ouyangpeng --password=csdn arg1 arg2 arg3 arg4
(venv) C:\Code Python\SMTP>python test_arg.py -u ouyangpeng --password=csdn arg1 arg2 arg3 arg4
username為: ouyangpeng
password為: csdn
參數 1 為:arg1
參數 2 為:arg2
參數 3 為:arg3
參數 4 為:arg4
(venv) C:\Code Python\SMTP>
復制代碼
最后注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程項目,還可以跟老司機交流討教!
本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。