Noah的學習筆記之Python篇:命令行解析


 

Noah的學習筆記之Python篇:

  1.裝飾器

  2.函數“可變長參數”

  3.命令行解析

 

 

注:本文全原創,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/)

 

  在Python中,對命令行的解析方式不唯一,本文將介紹兩種方法:一種是用sys.argv手動設置,另一種是用argparse模塊。

 

一、sys.argv是什么

  首先看一個例子:

import sys

print(len(sys.argv))
for arg in sys.argv:
    print(arg)

  將以上代碼保存為argparse1.py,然后cmd下定位到這個文件所在目錄,輸入:

python argparse1.py arg1 arg2 arg3

  回車后,運行結果為:

4
argparse1.py
arg1
arg2
arg3

  sys.argv是一個list,保存命令行參數,其中第一個值是“該程序所在路徑”,我們可以觀察到:在cmd中輸入的參數被依次傳入這個列表中(以空格作為間隔)。

 

二、使用sys.argv解析命令行

  大致了解了sys.argv,我們可以手動寫命令行解析功能。代碼如下:

import sys

if sys.argv[1].startswith('--'):
    arg = sys.argv[1][2:]

    if arg == 'help':
        print("這里打印幫助信息")

    elif arg == 'sum':
        count = 0

        if len(sys.argv) < 3:
            print("想要使用sum功能,請輸入一些數字")
            sys.exit()

        for i in sys.argv[2:]:
            try:
                count += int(i)
            except ValueError as e:
                print("輸入的參數不正確")
                sys.exit()

        print(count)

  

  將以上代碼保存為argparse1.py,然后cmd下定位到這個文件所在目錄,輸入:

python argparse1.py --help

  回車后,輸出一行字:這里打印幫助信息

  繼續輸入:

python argparse1.py --sum 1 3 5 4

  回車后,輸出:13

 

  試試看輸入異常值:

python argparse1.py --sum 1 3 5 a

  回車后,輸出一行字:輸入的參數不正確

 

  繼續輸入:

python argparse1.py --sum

  回車后,輸出一行字:想要使用sum功能,請輸入一些數字

 

  上述代碼可以捕捉 "--help"和"--sum"兩個命令,如果用戶傳入"help",程序會打印一些幫助信息,如果用戶傳入"--sum",則會將之后的參數做累加計算並輸出結果,也能處理一些異常情況。

  下面介紹使用argparse模塊來解析命令行參數。

 

三、argparse模塊

  Python2.7版本開始自帶argparse模塊,這是一個用來解析命令行參數的模塊,可以自動生成幫助信息。

  首先,我們來看一下最簡單的使用:

import argparse

myParser = argparse.ArgumentParser(description='解析命令行演示')
myParser.parse_args()

  將以上代碼保存為argparse1.py,然后cmd下定位到這個文件所在目錄,輸入:

python argparse1.py --help

  回車后,輸出:

usage: argparse1.py [-h]

解析命令行演示

optional arguments:
  -h, --help  show this help message and exit

  我們可以看到,使用argparse模塊,會自動包含--help信息。

 

四、argparse定制解析

  接着,我們可以使用add_argument方法來增加參數。先來看一個簡單的實例:

import argparse
import math

myParser = argparse.ArgumentParser()

# 默認接收的參數都是str類型,因此這里要限定一下參數類型
myParser.add_argument('-f', '--factorial', type=int, help="給出一個正整數,可以求出該數的階乘")
myParser.add_argument('-a', '--accumulate', type=float, help="計算若干個浮點數的累加值", nargs='*')
args = myParser.parse_args()

if args.factorial:
    print(math.factorial(args.factorial))
if args.accumulate:
    print(sum(i for i in args.accumulate))

 

  將以上代碼保存為argparse1.py,然后cmd下定位到這個文件所在目錄,輸入:

python argparse1.py -f 4

  回車后,輸出:24

 

  繼續輸入:

python argparse1.py -a 1.2 3.2 0.2

  輸出:4.7

 

  以上的代碼定義了兩個參數,factorial可以求階乘,accumulate是累加計算。增加參數解析的方法如下:

  ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

  介紹其中幾個參數:

  name or flags - 定義參數的名字

  action - 定義了一些基本的處理方式:

      'store' - 默認值就是這個,保存命令行參數

      'store_const' - 設立並保存一個靜態值:parser.add_argument('--example', action='store_const', const=2)

      'store_true' 和 'store_false' - 設立並保存一個布爾值。

      'append' - 將同一個參數的值加入列表中

      'append_const' - 設立並保存靜態值到列表中

      'count' - 計算關鍵詞出現的次數

      'help' - 打印幫助信息,默認值也有這個

      'version' - 版本號:parser.add_argument('--example', action='version', version='1.0')

  nargs - 定義接收參數值的數量:

      N - 任意一個整數,以列表形式保存

      '*' - 接收任意數量的參數值,以列表形式保存

      '+' - 和'*'一樣可以接收任意數量的參數值,並且,如果沒有參數值,會拋出error

      'argparse.REMAINDER' - 所有剩余的參數值都會被放到一個list中

  type - 定義參數值的類型,默認參數值類型是string,也可以利用type來調用一個函數,將接收到的參數值傳給一個自定義函數!

  choices - 定義一個列表來限定用戶傳入的參數值。

      如:praser.add_argument('--example', type=int, choices=range(1,5)),這樣用戶只能傳入1,2,3,4這幾個數字,不然會拋出參數值不合法的error。

  required - 限定某個參數是不是必填項,值為True或False

  help - 參數的幫助信息~

  dest - 接收到的參數值賦給某個變量。

      如:praser.add_argument('--example', type=int),傳入2,則example=2;若改為:praser.add_argument('--example', type=int, dest='myValue'),傳入2,則myValue=2。

 

四、設定“互斥”參數

  上面那段示例代碼中的兩個參數,我們可以同時操作,就像這樣:python argparse1.py -a 1.2 3.2 0.3 -f 4,但是有時候,幾個參數我們想只讓用戶選其中一個進行操作,這時候就要用到“互斥”功能了~將代碼修改成如下:

import argparse
import math

myParser = argparse.ArgumentParser()

# 互斥方法
group = myParser.add_mutually_exclusive_group()

group.add_argument('-f', '--factorial', type=int, help="給出一個正整數,可以求出該數的階乘")
group.add_argument('-a', '--accumulate', type=float, help="計算若干個浮點數的累加值", nargs='*')
args = myParser.parse_args()

if args.factorial:
    print(math.factorial(args.factorial))
if args.accumulate:
    print(sum(i for i in args.accumulate))

  如果這時候,我們再一起傳值,輸入:python argparse1.py -a 1.2 3.2 0.3 -f 4,就會拋出錯誤:

usage: argparse1.py [-h] [-f FACTORIAL | -a [ACCUMULATE [ACCUMULATE ...]]]
argparse1.py: error: argument -f/--factorial: not allowed with argument -a/--accumulate

 

五、小結

  本文介紹了兩種Python解析命令行的方法,相比之下,使用argparse模塊,確實更方便一些。當然啦,argparse模塊的內容可不止這一點哦,如果大家有興趣的話,可以自己去看這個模塊的官方文檔~~

  

 注:本文全原創,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/)


免責聲明!

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



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