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.