1. 程式人生 > >python命令列解析模組--argparse

python命令列解析模組--argparse

 

python命令列解析模組--argparse

目錄

簡介
詳解ArgumentParser方法
詳解add_argument方法

 

參考文件:

 https://www.jianshu.com/p/aac9f8079a53

https://www.2cto.com/kf/201412/363654.html

 

 

簡介

介紹:
argparse是python用於解析命令列引數和選項的標準模組,用於代替已經過時的optparse模組。 argparse模組的作用是用於解析命令列引數,例如python parseTest.py input.txt output.txt --user=name --port=8080。 Argparse的作用就是為py檔案封裝好可以選擇的引數,使他們更加靈活,豐富。而且argparse會自動生成幫助資訊和錯誤資訊。



argparse模組一般的使用步驟:
(1)import argparse #匯入模組
(2)parser = argparse.ArgumentParser() #建立一個ArgumentParser物件。
(3)parser.add_argument() #新增引數,通過呼叫add_argument()方法將命令列中的引數儲存到ArgumentParser物件中。
(4)args=parser.parse_args() #呼叫parse_args(),獲得輸入的引數
(5)return args
(6)args = parse_args()
首先匯入該模組;然後建立一個解析物件;然後向該物件中新增你要關注的命令列引數和選項,每一個add_argument方法對應一個你要關注的引數或選項;最後呼叫parse_args()方法進行解析;解析成功後需要獲取輸入的引數即
可使用。

 

 

 

詳解ArgumentParser方法

 

ArgumentParser方法

ArgumentParser(prog=None, usage=None,description=None, epilog=None, parents=[],formatter_class=argparse.HelpFormatter, prefix_chars='-',fromfile_prefix_chars=None, argument_d
efault=None,conflict_handler='error', add_help=True)

 

注意:

這些引數都有預設值,當呼叫parser.print_help()或者執行程式時由於引數不正確(此時python直譯器其實也是呼叫了pring_help()方法)時,會列印這些描述資訊,一般只需要傳遞description引數。

 

 

 引數解讀

description:help引數之前顯示的資訊,描述這個程式的功能

epilog:help引數之後顯示的資訊。

add_help:給解析器新增-h/--help選項(預設為True)

argument_default:設定引數的預設值(預設為None)

parents:ArgumentParser物件組成列表,這些物件中的引數也要包含進來。

prefix_chars:可選引數之前的字首(預設為-)

fromfile_prefix_chars:如果是從檔案中讀取引數,這個檔名引數的字首(預設為None)

formatter_class:一個自定義幫助資訊格式化輸出的類

conflict_handler:通常不需要,定義了處理衝突選項的策略

prog:程式名(預設為sys.argv[0])

usage:程式的使用用例,預設情況下會自動生成。

  

 

 常用引數使用

 1.description

大多數呼叫ArgumentParser建構函式的例子中都會使用description引數,這個引數會簡短的描述這個程式的用途。

 

示例程式:

import argparse

parser = argparse.ArgumentParser(description='FTP  Scanner')
print(parser.print_help())
parser.parse_args()

 

執行結果:

(venv) C:\Pycham>python 漏洞掃描器/測試2.py
usage: 測試2.py [-h]

FTP Scanner

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

 

注意:

預設情況下,這個描述資訊前後都會有一個空行,如果想改變這種顯示,可以使用formatter_class引數

 

 

 

2.epilog

有些程式可能想在描述資訊之後再繼續展示別的資訊,這個時候可以使用epilog引數設定。

 

示例程式:

import argparse

parser = argparse.ArgumentParser(description='FTP  Scanner',epilog="支援匿名登入掃描與暴力破解")
print(parser.print_help())
parser.parse_args()

 

 

執行結果:

(venv) C:\Pycham>python 漏洞掃描器/測試2.py
usage: 測試2.py [-h]

FTP Scanner

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

支援匿名登入掃描與暴力破解

 

注意:

跟description引數一樣,這個信心前後都有一個空行,同樣可以通過formatter-class引數設定。

 

 

 


3.add_help

預設情況下,ArgumentParser物件對自動新增-h/--help選項,以展示幫助資訊。
就是上面一直輸出的:
  -h, --help  show this help message and exit

通過設定add_help=False可以取消幫助資訊的顯示

 

 

 

4.prefix_chars

定義optional引數的字首,預設是'-'和'--', 如果我們設定 prefix_char='-+', 那麼我們可以定義以'+'或'++'為字首的optional引數.

 

示例程式:

parser.add_argument('+P')
parser.add_argument('++F')

 

 

 

 

5.formatter_class

我們知道預設情況下,description以及epilog資訊前後都有一個空行,甚至多行資訊會盡量在一行輸出。
通過指定formatter_class可以對幫助資訊進行格式化輸出。
這樣的類有三個:
argparse.RawDescriptionHelpFormatter
argparse.RawTextHelpFormatter
argparse.ArgumentDefaultsHelp

 

 

RawDescriptionHelpFormatter,則description和epilog將會按原樣輸出,但是前後還會有空行。

RawTextHelpFormatter則會保留預定義的幫助資訊中的空格。

ArgumentDefaultsHelpFormatter則會給所有的有預設值的引數新增預設值資訊。

 

 

 

 

 

 

詳解add_argument方法

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

 

 

引數解讀

nargs:命令列引數的個數,一般使用萬用字元表示,其中,'?'表示只用一個,'*'表示0到多個,'+'表示至少一個

default:預設值

type:引數的型別,預設是字串string型別,還有float、int等型別

help:和ArgumentParser方法中的引數作用相似,出現的場合也一致

choices:用於為位置引數或可選引數設限定一個範圍,例如:choices=['mark', 'Eric', 'Jonan']

metavar:用於自定義幫助資訊(-h得到的輸出)中的位置引數和可選引數的引數值的展示樣例.預設help輸出中的位置引數的引數值示例直接使用位置引數名稱, 可選引數的引數值樣例則是把可選引數大寫

dest:dest是一個argpars.ArgumentParser物件被解析以後, args引用引數值的變數名稱,如果你不指定也沒有關係。
預設:
    • 位置引數的dest為位置引數的引數名
    • 可選引數的dest為:
  • 合規長引數去掉字首'--', 如: --foo的dest為foo
  • 不合規長參(引數名包含'-')數去掉字首'--', 並且把引數名中的'-'變為' _ ', 例如: --food-name的dest為food_name.
  • 如果沒有長引數, 那麼短引數去掉字首'-', 如: -p的dest為p

  

 

重點引數使用

1.Name or Flags

位置引數(positional arguments)

程式碼示例

parser.add_argument('hostname', help='server host name', type=str)

  

可選引數(optional arguments)

程式碼示例

parser.add_argument('-p', '--port', help='the port number', type=int)

 

 

2.nargs

用於指定某位置引數或可選引數能接受引數值的個數.

nargs=N (N為引數個數)

nargs='?' (只接收一個引數)

args='*' (接受所有引數)

args='+' (接受所有引數,要求至少有一個引數)

 

 

 

3.help

對引數的一個功能描述, 當用戶使用-h時, 會顯示該描述.

 

 

 

 

官方文件

import argparse
 
def parse_args():
    description = usage: %prog [options] poetry-file
 
This is the Slow Poetry Server, blocking edition.
Run it like this:
 
  python slowpoetry.py <path-to-poetry-file>
 
If you are in the base directory of the twisted-intro package,
you could run it like this:
 
  python blocking-server/slowpoetry.py poetry/ecstasy.txt
 
to serve up John Donne's Ecstasy, which I know you want to do.
 
 
    parser = argparse.ArgumentParser(description = description)
     
    help = The addresses to connect.
    parser.add_argument('addresses',nargs = '*',help = help)  #位置引數
 
    help = The filename to operate on.Default is poetry/ecstasy.txt
    parser.add_argument('filename',help=help)
 
    help = The port to listen on. Default to a random available port.
    parser.add_argument('-p',--port', type=int, help=help) #可選引數
 
    help = The interface to listen on. Default is localhost.
    parser.add_argument('--iface', help=help, default='localhost')
 
    help = The number of seconds between sending bytes.
    parser.add_argument('--delay', type=float, help=help, default=.7)
 
    help = The number of bytes to send at a time.
    parser.add_argument('--bytes', type=int, help=help, default=10)
 
    args = parser.parse_args();
    return args
 
if __name__ == '__main__':
    args = parse_args()
     
    for address in args.addresses:
        print 'The address is : %s .' % address
     
    print 'The filename is : %s .' % args.filename
    print 'The port is : %d.' % args.port
    print 'The interface is : %s.' % args.iface
    print 'The number of seconds between sending bytes : %f'% args.delay
    print 'The number of bytes to send at a time : %d.' % args.bytes</path-to-poetry-file>

  

 

執行該指令碼:python test.py --port 10000 --delay 1.2 127.0.0.1 172.16.55.67 poetry/ecstasy.txt
 

輸出為:

The address is : 127.0.0.1 .
The address is : 172.16.55.67 .
The filename is : poetry/ecstasy.txt .
The port is : 10000.
The interface is : localhost.
The number of seconds between sending bytes : 1.200000
The number of bytes to send at a time : 10.