背景
最近撰寫一個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教程專案,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/155309.html
標籤:Python
