optparse模塊解析命令行參數的說明及優化


  一、關於解析命令行參數的方法

  關於“解析命令行參數”的方法我們一般都會用到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()

  效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM