1、關於解析命令行參數的方法html
關於「解析命令行參數」的方法咱們通常都會用到sys.argv跟optparse模塊。關於sys.argv,網上有一篇很是優秀的博客已經介紹的很詳細了,你們能夠去這裏參考:https://www.cnblogs.com/aland-1415/p/6613449.html python
這裏爲你們介紹一個比sys.argv更強大的optparse模塊。工具
這裏說一句題外話,點開optparse的源碼,第一行註釋是這樣的:A powerful, extensible, and easy-to-use option parser。是否感覺到了做者強有力的......優化
說回正題。當咱們要利用server與client進行FTP文件傳輸的時候,在client端每每須要輸入諸如 -s 10.10.10.1 -p 9001 這樣的信息,固然咱們不能控制用戶的輸入,若是用戶隨意的輸入錯誤的命令,好比不寫IP地址,只是寫-s -p 9001,或者只寫 -s -p。咱們若是還用sys.argv獲取參數的話須要作不少麻煩的邏輯判斷,這給咱們開發程序帶來了很大的不便。spa
可是若是咱們利用optparse會十分便捷的解決這樣的問題。命令行
2、optparse介紹code
2.1 optparse的用法以下:server
import optparse
parser = optparse.OptionParser() parser.add_option("-s", "--server", dest="server", help="ftp server ip_address") parser.add_option("-P", "--port", type="int", dest="port", help="ftp server port") parser.add_option("-u", "--username", dest="username", help="username info") parser.add_option("-p", "--password", dest="password", help="password info")
首先import optparse類,而後建立optparse對象parser,再使用add_option()來定義命令行參數,最後使用parse_args()來解析命令行。htm
2.2 舉例說明:對象
咱們先新建一個test.py文件,代碼以下
import optparse class Wang_opt: def __init__(self): #初始化 parser = optparse.OptionParser() parser.add_option("-s", "--server", dest="server", help="ftp server ip_address") parser.add_option("-P", "--port", type="int", dest="port", help="ftp server port") parser.add_option("-u", "--username", dest="username", help="username info") parser.add_option("-p", "--password", dest="password", help="password info") #解析參數 self.options, self.args = parser.parse_args() print(self.options,self.args) if __name__ == '__main__': whw_opt = Wang_opt()
而後在test.py文件的目錄下運行python test.py,後面不跟任何參數,看看效果:
運行的結果一個是」字典」,裏面存放的是咱們須要的信息,後面有一個「空列表」,咱們再試試加上符合條件的參數以及不符合條件的參數:
這就說明,」字典」中存放的是咱們須要的信息,若是用戶沒有輸入默認設置爲None;而「列表」’中存放的是「錯誤」信息。再返回頭看看源代碼,其實這個」字典」就是上面的self.options變量,「列表」就是self.args。optparse模塊解析的結果就是「咱們想獲得的信息」以及「用戶誤操做的輸入信息」——的確很強大!
固然,若是用戶不知道他須要輸入什麼命令,咱們能夠在後面輸入 -h,尋求幫助:
其實你們能夠對照着源代碼,這些信息的關鍵字都是咱們在add_option()方法中設置的——嗯,確實~A powerful, extensible, and easy-to-use option parser
3、重點說明
3.1 關於獲得的「字典」與「列表」的說明:
其實咱們解析獲得的參數self.options與 self.args並非真正意義上的字典與列表,只是「字典與列表的形象」而已!實際上,這兩個參數是「對象」,咱們能夠進行以下驗證:在程序最後打印:
print(whw_opt.options.server)
咱們能夠看到:用操做符‘.’能夠取得server的值 0.0.0.0。
可是,咱們若是利用字典的key-value的取值方式會報錯:
3.2 一個小優化:
固然,再厲害的工具也必然會有缺點。若是要求用戶必須有輸入的話,咱們能夠這樣來優化一下程序:
import optparse class Wang_opt: def __init__(self): #初始化 parser = optparse.OptionParser() parser.add_option("-s", "--server", dest="server", help="ftp server ip_address") parser.add_option("-P", "--port", type="int", dest="port", help="ftp server port") parser.add_option("-u", "--username", dest="username", help="username info") parser.add_option("-p", "--password", dest="password", help="password info") #解析參數 self.options, self.args = parser.parse_args() print(self.options,self.args) def verification(self): if not self.options.server or not self.options.port: exit('ERROR!must support server and port parameters!') if __name__ == '__main__': whw_opt = Wang_opt() whw_opt.verification()
效果以下: