1. 程式人生 > >乾貨 | 使用Python輕鬆寫出漂亮的命令列程式

乾貨 | 使用Python輕鬆寫出漂亮的命令列程式

點選上方“中興開發者社群”,關注我們

每天讀一篇一線開發者原創好文

640?wx_fmt=png&wxfrom=5&wx_lazy=1

作者簡介

作者王輝,熱愛程式設計的程式設計師一枚,喜歡研究技術,樂於分享。致力於TDD、Clean Code、DDD等實踐的落實實施,是軟體設計和軟體架構方法的積極學習者和實踐者。

誕生之初用來作為配置管理語言的Python,現在已經成為最流行的程式語言之一,尤其是隨著AI應用的興起,變得無處不在。

640?wx_fmt=png&wxfrom=5&wx_lazy=1Python中的getopt,optparse模組都可以進行命令列程式的開發,不過它們已經被廢棄,在2.7和3.2版本中引入了argparse模組;這裡介紹使用argparser模組,只需要數十行程式碼,就可以做出漂亮的命令列程式。

1.基本的命令列

看看官方文件裡的一個示例:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

這幾行程式碼實現的功能為:
如果命令列輸入不帶--sum選項,則對輸入的多個整數執行max操作;否則,執行sum操作。例如:
在命令列中執行:
python prog.py 1 2 3 4
輸出為:4

在命令列中執行:
python prog.py 1 2 3 4 --sum
輸出為:10

上面的程式碼中,主要的過程分為三個步驟:

  • 呼叫argparse.ArgumentParser的構造器建立一個ArgumentParser物件。

  • 呼叫ArgumentParser的add_argument()方法新增命令列的引數,包括可選引數和必選引數。其中以--、 -開頭的表示可選引數,其它的表示必須輸入的引數。

  • 呼叫parser.parse_args()方法對傳入的sys.argv引數進行解析。

2.實現子命令

有時候,我們可以根據功能將命令列分組成一系列相關的子命令。例如,Git命令列可以分為以下幾組:

640?wx_fmt=png

在Python中,利用argparse模組也可以很容易做出這樣的子命令列程式。

例如,我們要做一個對使用者資訊進行管理的命令列程式,包括新增、刪除、查詢顯示等幾個功能。

我們可以根據功能將其分為三個子命令:add,delete,show。

相應的程式碼可以這樣寫:

640?wx_fmt=png

對上面的程式碼進行概要的解釋:ArgumentParser物件的add_subparsers()方法建立了一個特殊的action例項,對這個例項分別呼叫add_parser()方法來建立子命令對應的ArgumentParser,再呼叫這個ArgumentParser例項的add_argument()方法來新增子命令的引數。
一個比較方便的地方在於,可以通過ArgumentParser的set_defaults()方法來設定子命令對應的處理函式。上面的示例中,分別為三個子命令設定了處理函式:add_fn,delete_fn,show_fn。

在命令列程式中執行:
python cmd.py --help,將顯示出以下資訊:

640?wx_fmt=png

從幫助資訊中可以看到,命令列被組織為三個子命令,分別為add,delete,show。

在命令列中執行:
python cmd.py   add  --help,可以檢視add子命令的幫助資訊:

640?wx_fmt=png

對於add子命令,它有3個引數,分別為使用者名稱、聯絡地址、電話號碼;其中使用者名稱為必選引數,其它兩個為可選引數。

在命令列中執行:
python cmd.py add --name 'Eric' --addr 'California,USA' --phone '0076938377'`

新增一個User的處理邏輯將由add_fn()來完成。程式中將得到一個資訊為{name='Eric',addr='California,USA', phone='0076938377'}的User。

640?wx_fmt=png

其它的delete和show子命令與此類似,不再贅述。

3.小結

使用Python的argparse模組,短短的幾十行程式碼就可以搭建起來一個命令列程式的骨架。

argparse模組中最重要的是ArgumentParser物件,它包含了以下幾個方法:

  • add_argument()

  • add_subparsers()

  • parse_args()

關於這幾個方法的用法,以及引數的詳細的說明請參考官方文件。

640?wx_fmt=png