最近編寫一個python程序的時候,須要去獲取python命令行的參數,所以這裏記錄下如何獲取命令行參數的方法。css
在 Python 中,sys 模塊是一個很是經常使用且十分重要的模塊,經過模塊中的 sys.argv 就能夠訪問到全部的命令行參數,它的返回值是包含全部命令行參數的列表(list),python
參數個數: len(sys.argv)
腳本名: sys.argv[0]
參數1: sys.argv[1]
參數2: sys.argv[2]shell
下面咱們經過程序來講明它的用法:微信
#!/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]))
if __name__ == "__main__":
main()
下面咱們經過命令行來運行該python腳本markdown
python test.py
(venv) C:\Code Python\SMTP>python test.py
參數個數爲: 1 個參數。
參數列表: ['test.py']
腳本名爲: test.py
識別到的參數只有一個,就是腳本名 test.py微信支付
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 爲:csdnui
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模塊來識別命令行選項。spa
getopt模塊是專門處理命令行參數的模塊,用於獲取命令行選項和參數,也就是sys.argv。命令行選項使得程序的參數更加靈活。支持短選項模式(-)和長選項模式(–)。.net
該模塊提供了兩個方法及一個異常處理來解析命令行參數。命令行
getopt.getopt 方法用於解析命令行參數列表,語法格式以下:
getopt.getopt(args, options[, long_options])
方法參數說明:
args: 要解析的命令行參數列表。
options: 以字符串的格式定義,options後的冒號(:)表示該選項必須有附加的參數,不帶冒號表示該選項不附加參數。
long_options: 以列表的格式定義,long_options 後的等號(=)表示若是設置該選項,必須有附加的參數,不然就不附加參數。
該方法返回值由兩個元素組成: 第一個是 (option, value) 元組的列表。 第二個是參數列表,包含那些沒有’-‘或’–’的參數。
在沒有找到參數列表,或選項的須要的參數爲空時會觸發該異常。
異常的參數是一個字符串,表示錯誤的緣由。屬性 msg 和 opt 爲相關選項的錯誤信息。
瞭解了 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:])
python test_arg.py
(venv) C:\Code Python\SMTP>python test_arg.py
username爲:
password爲:
(venv) C:\Code Python\SMTP>
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>
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>
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>
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>
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>
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>
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>
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>
做者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!
轉載請保留原文地址:http://blog.csdn.net/ouyang_peng/article/details/79390920若是以爲本文對您有所幫助,歡迎您掃碼下圖所示的支付寶和微信支付二維碼對本文進行隨意打賞。您的支持將鼓勵我繼續創做!