Python 命令行之旅 —— 初探 argparse

『講解開源項目系列』啓動——讓對開源項目感興趣的人再也不畏懼、讓開源項目的發起者再也不孤單。跟着咱們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎聯繫咱們給咱們投稿,讓更多人愛上開源、貢獻開源~python

前言

你是否好奇過在命令行中敲入一段命令後,它是如何被解析執行的?是否考慮過由本身實現一個命令行工具,幫你執行和處理任務?是否瞭解過陪伴在你身邊的 Python 有着豐富的庫,來幫你輕鬆打造命令行工具?編程

彆着急,本文做爲 Python 命令行之旅的第一篇將帶你逐步揭開命令行解析的面紗,介紹如何使用 Python 內置的 argparse 標準庫解析命令行,並在後續的系列文章中介紹各具特點的第三方命令行庫,講講它們的異同,進而全面地體驗此次探索的旅程。數組

本系列文章默認使用 Python 3 做爲解釋器進行講解。
若你仍在使用 Python 2,請注意二者之間語法和庫的使用差別哦~
複製代碼

介紹

argparse 做爲 Python 內置的標準庫,提供了較爲簡單的方式來編寫命令行接口。當你在程序中定義須要哪些參數,argparse 便會從 sys.argv 中獲取命令行輸入進行解析,對正確或非法輸入作出響應,也能夠自動生成幫助信息和使用說明。bash

快速開始

設置解析器

第一步要作的就是設置解析器,後續對命令行的解析就依賴於這個解析器,它可以將命令行字符串轉換爲 Python 對象。 經過實例化 argparse.ArgumentParser,給定一些選填參數,咱們就能夠設置一個解析器:函數

import argparse
parser = argparse.ArgumentParser(
    description='My Cmd Line Program',
)
複製代碼

定義參數

經過 ArgumentParser.add_argument 方法來爲解析器設置參數信息,以告訴解析器命令行字符串中的哪些內容應解析爲哪些類型的 Python 對象,如:工具

# 添加 nums 參數,在使用信息中顯示爲 num
# 其類型爲 int,且支持輸入多個,且至少須要提供一個
parser.add_argument('nums',  metavar='num', type=int, nargs='+',
                    help='a num for the accumulator')
# 添加 --sum 參數,該參數被 parser 解析後所對應的屬性名爲 accumulate
# 若不提供 --sum,默認值爲 max 函數,不然爲 sum 函數
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the nums (default: find the max)')
複製代碼

解析命令行

定義好參數後,就可使用 ArgumenteParser.parse_args 方法來解析一組命令行參數字符串了。ui

默認狀況下,參數取自 sys.argv[1:],它就是你在命令行敲入的一段命令(不含文件名)所對應的一個字符串列表。 好比,若你輸入 python3 cmd.py --sum 1 2 3,那麼 sys.argsv[1:] 就是 ['--sum', '1', '2', '3']this

固然,也能夠經過 parse_args 入參來指定一組命令行參數字符串:spa

args = parser.parse_args(['--sum', '-1', '0', '1'])
print(args) # 結果:Namespace(accumulate=<built-in function sum>, nums=[-1, 0, 1])
複製代碼

業務邏輯

解析好命令行後,咱們就能夠從解析結果中獲取每一個參數的值,進而根據本身的業務需求作進一步的處理。 好比,對於上文中所定義的 nums 參數,咱們能夠經過解析後的結果中的 accumulate 方法對其進行求最大值或求和(取決因而否提供 --sum 參數)。命令行

result = args.accumulate(args.nums)
print(result)  # 基於上文的 ['--sum', '-1', '0', '1'] 參數,accumulate 爲 sum 函數,其結果爲 0
複製代碼

代碼梳理

經過上文的講解,完成一個命令行工具的步驟是否是挺簡單易懂呢?咱們將上文的代碼彙總下,以有一個更清晰的認識:

# cmd.py
import argparse

# 1. 設置解析器
parser = argparse.ArgumentParser(
    description='My Cmd Line Program',
)

# 2. 定義參數
parser.add_argument('nums',  metavar='num', type=int, nargs='+',
                    help='a num for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the nums (default: find the max)')

# 3. 解析命令行
args = parser.parse_args()

# 4. 業務邏輯
result = args.accumulate(args.nums)
print(result)
複製代碼

若咱們須要對一組數字求和,只需執行:

$ python3 cmd.py --sum -1 0 1
0
複製代碼

若咱們須要對一組數字求最大值,只需執行:

$ python3 cmd.py -1 0 1
1
複製代碼

若是給定的參數不是數字,則會報錯提示:

$ python3 cmd.py a b c
usage: cmd.py [-h] [--sum] num [num ...]
cmd.py: error: argument num: invalid int value: 'a'
複製代碼

咱們還能夠經過 -h--help 參數查看其自動生成的使用說明和幫助:

usage: cmd.py [-h] [--sum] num [num ...]

My Cmd Line Program

positional arguments:
  num         a num for the accumulator

optional arguments:
  -h, --help  show this help message and exit
  --sum       sum the nums (default: find the max)
複製代碼

小結

怎麼樣?揭開命令行工具的神祕面紗後,是否是發現它並無想象中的困難?反卻是感覺到一種簡單而又強大的優雅呢?

不過這還遠遠不是 argparse 的所有面貌。對於一些複雜的狀況,好比各類類型參數、參數前綴、參數組、互斥選項、嵌套解析、自定義幫助等等,咱們都還沒涉及探討。

在下一篇文章中,讓咱們來一塊兒深刻了解 argparse,感覺它的魅力吧!

歡迎關注 HelloGitHub 公衆號,獲取更多開源項目的資料和內容
相關文章
相關標籤/搜索