| 導航:起始頁 > Dive Into Python > 腳本和流 > 處理命令行參數 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
Python 完全支持創建在命令行運行的程序,也支持通過命令行參數和短長樣式來指定各種選項。這些并非是 XML 特定的,但是這樣的腳本可以充分使用命令行處理,看來是時候提一下它了。
如果不理解命令行參數如何暴露給你的 Python 程序,討論命令行處理是很困難的,所以讓我們先寫個簡單點的程序來看一下。
如果您還沒有下載本書附帶的樣例程序, 可以 下載本程序和其他樣例程序。
#argecho.py import sys for arg in sys.argv:print arg
[you@localhost py]$ python argecho.pyargecho.py [you@localhost py]$ python argecho.py abc def
argecho.py abc def [you@localhost py]$ python argecho.py --help
argecho.py --help [you@localhost py]$ python argecho.py -m kant.xml
argecho.py -m kant.xml
| 關于 sys.argv 需要了解的第一件事情就是:它包含了你正在調用的腳本的名稱。你后面會實際使用這個知識,在第 16 章 函數編程中。現在不用擔心。 | |
| 命令行參數通過空格進行分隔。在 sys.argv 列表中,每個參數都是一個獨立的元素。 | |
| 命令行標志,像 --help,在 sys.argv 列表中還保存了它們自己的元素。 | |
| 為了讓事情更有趣,有些命令行標志本身就接收參數。比如,這里有一個標記 (-m) 接收一個參數 (kant.xml)。標記自身和標記參數只是 sys.argv 列表中的一串元素。并沒有試圖將元素與其它元素進行關聯;所有你得到的是一個列表。 |
所以正如你所看到的,你確實擁有了命令行傳入的所有信息,但是接下來要實際使用它似乎不那么容易。對于只是接收單個參數或者沒有標記的簡單程序,你可以簡單地使用 sys.argv[1] 來訪問參數。這沒有什么羞恥的;我一直都是這樣做的。對更復雜的程序,你需要 getopt 模塊。
def main(argv): grammar = "kant.xml"try: opts, args = getopt.getopt(argv, "hg:d", ["help", "grammar="])
except getopt.GetoptError:
usage()
sys.exit(2) ... if __name__ == "__main__": main(sys.argv[1:])
那么你傳給 getopt 函數的參數是什么呢?好的,第一個只不過是一個命令行標志和參數的原始列表 (不包括第一個元素――腳本名稱,你在調用 main 函數之前就已經將它砍掉了)。第二個是腳本接收的短命令行標志的一個列表。
第一個標志和第三個標志是簡單的獨立標志;你選擇是否指定它們,它們做某些事情 (打印幫助) 或者改變狀態 (打開調試)。但是,第二個標志 (-g) 必須 跟隨一個參數――進行讀取的語法文件的名稱。實際上,它可以是一個文件名或者一個 web 地址,這時還不知道 (后面會確定),但是你要知道必須要有些東西。所以,你可以通過在 getopt 函數的第二個參數的 g 后面放一個冒號,來向 getopt 說明這一點。
更復雜的是,這個腳本既接收短標志 (像 -h),也接受長標志 (像 --help),并且你要它們做相同的事。這就是 getopt 第三個參數存在的原因:它是指定長標志的一個列表,其中的長標志是和第二個參數中指定的短標志相對應的。
這里有三點要注意:
被搞昏沒?讓我們看一下真實的代碼,看看它在上下文中是否起作用。
def main(argv):grammar = "kant.xml" try: opts, args = getopt.getopt(argv, "hg:d", ["help", "grammar="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts:
if opt in ("-h", "--help"):
usage() sys.exit() elif opt == '-d':
global _debug _debug = 1 elif opt in ("-g", "--grammar"):
grammar = arg source = "".join(args)
k = KantGenerator(grammar, source) print k.output()
<< 根據節點類型創建不同的處理器 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
全部放在一起 >> |