如果您在 IT 部門擔任 UNIX® 系統管理員、軟件開發人員甚至是經理,掌握幾項技能將使您與眾不同。您是否對 OSI 模型有充分了解?您對子網劃分是否得心應手?您了解 UNXI 權限嗎?讓我為您的技能背景增添一個不起眼的命令行工具。在本文結束時,在 IT 部門擔任任何職位的讀者都應該至少能創建一個簡單的命令行工具。
引言
您是否能編寫命令行工具?也許您可以,但您能編寫出真正好用的命令行工具嗎?本文討論使用 Python 來創建一個強健的命令行工具,並帶有內置的幫助菜單、錯誤處理和選項處理。由於一些奇怪的原因,很多人並不了解 Python® 的標准庫具有制作功能極其強大的 *NIX 命令行工具所需的全部工具。
可以這樣說,Python 是制作 *NIX 命令行工具的最佳語言,因為它依照“batteries-included”的哲學方式工作,並且強調提供可讀性高的代碼。但僅作為提醒,當您發現使用 Python 創建命令行工具是一件多麼簡單的事情時,這些想法很危險,您的生活可能被攪得一團糟。據我所知,至今還沒有發表過詳細說明使用 Python 創建命令行工具的文章,因此我希望您喜歡這篇文章。
設置
Python 標准庫中的 optparse 模塊可完成創建命令行工具的大部分瑣碎工作。optparse 包含在 Python 2.3 中,因此該模塊將包括在許多 *NIX 操作系統中。如果由於某種原因,您使用的操作系統不包含所需要的模塊,那麼值得慶幸的是,Python 的最新版本已經過測試並編譯到幾乎任何 *NIX 操作系統中。Python 支持的系統包括 IBM® AIX®、HP-UX、Solaris、Free BSD、Red Hat Linux®、Ubuntu、OS X、IRIX,甚至包括幾種 Nokia 手機。
創建 Hello World 命令行工具
編寫優秀的命令行工具的第一步是定義要解決的問題。這對您工具的成功至關重要。這對於以盡可能簡單的方法解決問題也同樣重要。這裡明確地采用了 KISS(Keep It Simple Stupid,保持簡單)准則。只有在實現並測試了計劃內功能之後才添加選項和增加其他功能。
我們首先從創建 Hello World 命令行工具開始。按照上面的建議,我們使用盡可能簡單的術語來定義問題。
問題定義:我希望創建一個命令行工具,默認打印 Hello World,並提供用於打印不通人的姓名的選項。
基於上述說明,可以提供一個包含少量代碼的解決方案。
#!/usr/bin/env python import optparse def main(): p = optparse.OptionParser() p.add_option('--person', '-p', default="world") options, arguments = p.parse_args() print 'Hello %s' % options.person if __name__ == '__main__': main()
如果運行此代碼,預期的輸出如下:
Hello world
但是,我們通過少量代碼所能做到的遠不止於此。我們可以獲得自動生成的幫助菜單:
python hello_cli.py --help Usage: hello_cli.py [options] Options: -h, --help show this help message and exit -p PERSON, --person=PERSON
從幫助菜單中可以了解到,我們可以使用兩種方法來更改 Hello World 的輸出:
python hello_cli.py -p guidoHello guido
我們還實現了自動生成的錯誤處理:
python hello_cli.py --name matzUsage: hello_cli.py [options] hello_cli.py: error: no such option: --name
如果您還沒有使用過 Python 的 optparse 模塊,那麼您剛才可能會大吃一驚,並思忖使用 Python 可以編寫的所有這些不可思議的工具。如果您剛開始接觸 Python,那麼您可能會驚訝於 Python 讓一切變得如此簡單。“XKCD”網站發表了關於“Python 是如此簡單”主題的非常有趣的漫畫,已包括在參考資料中。