一、關於解析命令行參數的方法
關於“解析命令行參數”的方法我們一般都會用到sys.argv跟optparse模塊。關於sys.argv,網上有一篇非常優秀的博客已經介紹的很詳細了,大家可以去這里參考:https://www.cnblogs.com/aland-1415/p/6613449.html
這里為大家介紹一個比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獲取參數的話需要做很多麻煩的邏輯判斷,這給我們開發程序帶來了很大的不便。
但是如果我們利用optparse會十分便捷的解決這樣的問題。
二、optparse介紹
2.1 optparse的用法如下:
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()來解析命令行。
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.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()
效果如下: