自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

開(kāi)發(fā) 后端
我們知道在Linux下有優(yōu)雅的shell終端命令行界面,shell腳本都可以優(yōu)雅用命令行的方式來(lái)運(yùn)行。而且shell也再帶優(yōu)化命令行參數(shù)解析的bash內(nèi)部命令getopts和大多數(shù)發(fā)行版附帶的外部命令getops。

 我們知道在Linux下有優(yōu)雅的shell終端命令行界面,shell腳本都可以優(yōu)雅用命令行的方式來(lái)運(yùn)行。而且shell也再帶優(yōu)化命令行參數(shù)解析的bash內(nèi)部命令getopts和大多數(shù)發(fā)行版附帶的外部命令getops。Perl語(yǔ)言也有Getopt::XX系列模塊來(lái)實(shí)現(xiàn)類似功能;Golang也有flag標(biāo)準(zhǔn)庫(kù)以及更加強(qiáng)大的第三庫(kù)cobra。

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

說(shuō)了這么多你肯定要問(wèn),那么Python呢?Python不像shell,perl一樣有便捷強(qiáng)大的oneline腳本,雖然Python有強(qiáng)大的web界面下的腳本執(zhí)行環(huán)境Jupyter Note,但是對(duì)終端命令行下的執(zhí)行也是我們要追求的目標(biāo)。本文蟲(chóng)蟲(chóng)就給大家介紹如何在Python下實(shí)現(xiàn)優(yōu)雅的終端命令行界面CLI,涉及的模塊有Click和argparse。

Click

Python開(kāi)始的時(shí)候也模仿bansh和其他語(yǔ)言有g(shù)etopt,optparse等模塊來(lái)做CLI,后來(lái)推出argparser模塊后getopt,optparse等都已經(jīng)被廢棄。在介紹argparser模塊之前我們先來(lái)介紹click。

[[274252]]

首先最簡(jiǎn)單的方式是使用click。我們先來(lái)看下python 3中的print()函數(shù),注意該print()強(qiáng)制必須以帶括號(hào)方式, 這是和python2比較大的區(qū)別。其定義如下:

  1. print(*objects, sep=' 'end='\n', file=sys.stdout, flush=False

可以看到該函數(shù)可以支持各種規(guī)范格式的輸出,而不單單一個(gè)打印輸出了。

比如,通過(guò)可以自定義打印的結(jié)束字符,默認(rèn)是"\n"。

  1. print('hello,chongchong! 'end='\r'

可以通過(guò)sep自定義分割符,而不是默認(rèn)的空格。

  1. print('hello'' chongchong!', sep=','

通過(guò)file來(lái)重定向輸出到文件,而不是stdout的默認(rèn)標(biāo)準(zhǔn)輸出。

  1. print(' hello,chongchong!', file=open('chongchong.out''w')) 

我們可以利用click在命令行中實(shí)現(xiàn)對(duì)這些參數(shù)的輸入和解析,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的打印命令行界面。廢話少說(shuō)直接上代碼:

  1. #!/usr/bin/env python3 
  2. import click 
  3. import sys 
  4. @click.command() 
  5. @click.argument('args', nargs=-1) 
  6. @click.option('-s''--sep'default=' ', help='分隔符,默認(rèn)為空'
  7. @click.option('-e''--end'default='\n', help='結(jié)尾字符,默認(rèn)為 "\\n"'
  8. @click.option('-o''--out'default=None, help='輸出文件,默認(rèn)為stdout)'
  9. def print_prog(args, sep, endout): 
  10. '''打印輸出結(jié)果。 
  11. ''
  12. print(*args, sep=sep, end=end, file=open(out'w') if out else sys.stdout) 
  13. if __name__ == '__main__'
  14. print_prog() 

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

腳本很簡(jiǎn)單,就是獲取輸入的參數(shù),并將其傳遞給print()函數(shù)執(zhí)行。執(zhí)行如下:

打印文本

  1. python print.py hello,chongchong! 

顯示幫助

  1. python print.py –help 
利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

設(shè)置風(fēng)格符號(hào)

  1. python print.py -s %% hello chongchong! 

重定向到文件

  1. python print.py -o chongchong.out -s %% hello chongchong! 
利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

通過(guò)幾行代碼就實(shí)現(xiàn)了一個(gè)很棒的交互界面!

當(dāng)然你可以依次為基礎(chǔ)增加更多的內(nèi)容,讓它更實(shí)用這是一個(gè)演示,向您展示創(chuàng)建自己的CLI是多么容易。你不再需要編寫(xiě)普通的python腳本文件了。更多功能和高級(jí)特性可以參考click官方文檔:

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

更多的基于click的項(xiàng)目和模塊也可以通過(guò)其github倉(cāng)clone和fork使用,你也可以給該項(xiàng)目添加自己的貢獻(xiàn)。

具體地址為:github:/click-contrib/。

argparse

我們首先從官方的數(shù)字計(jì)算程序小例子來(lái)開(kāi)始:

  1. import argparse 
  2. parser = argparse.ArgumentParser(description='Process some integers.'
  3. parser.add_argument('integers', metavar='N', type=int, nargs='+'
  4. help='an integer for the accumulator'
  5. parser.add_argument('--sum', dest='accumulate'action='store_const'
  6. const=sumdefault=max
  7. help='sum the integers (default: find the max)'
  8. args = parser.parse_args() 
  9. print args.accumulate(args.integers) 

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

代碼解釋:

首先,通過(guò)argparse.ArgumentParser()創(chuàng)建一個(gè)解析對(duì)象;

接著,給對(duì)象添加兩個(gè)參數(shù),用add_argument()方法。比如本例中是一個(gè)type為一個(gè)或者一列整數(shù);還有一個(gè)目標(biāo)為accumulate屬性用來(lái)選擇兩個(gè)函數(shù)sum()和max()求和和求最大值,默認(rèn)為求最大值。

然后,通過(guò)parse_args()函數(shù)解析對(duì)象的參數(shù),并把各個(gè)參數(shù)解析為合適的類型(int,accumulate),觸發(fā)對(duì)應(yīng)的行為(sum,max)。

最后通過(guò)print打印結(jié)果。

ArgumentParser.add_argument()

使用方法如下:

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

ArgumentParser構(gòu)造對(duì)象

ArgumentParser對(duì)象的初始化原型為(構(gòu)造方法):

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

其各個(gè)參數(shù)為:

prog - 程序的名稱(默認(rèn)為sys.argv[0])

usage - 描述程序使用幫助信息(默認(rèn)值:從添加的參數(shù)來(lái)生成)

description - 在參數(shù)幫助之前顯示的文本(默認(rèn)值:無(wú))

epilog - 在參數(shù)幫助后顯示的文本(默認(rèn)值:無(wú))

parents - ArgumentParser也應(yīng)包含其參數(shù)的對(duì)象列表

formatter_class - 用于自定義幫助輸出的類

prefix_chars - 前綴可選參數(shù)的字符集(默認(rèn)值:' - ')

fromfile_prefix_chars -文件前綴字符參數(shù)(默認(rèn)值:None)

argument_default -為參數(shù)的全局默認(rèn)值(默認(rèn)值:None)

conflict_handler - 解決沖突選項(xiàng)的策略(通常不需要)

add_help -添加-h/--help選項(xiàng)解析器(默認(rèn)值:True)

一般情況下,我們無(wú)需管其他情況,只需設(shè)置個(gè)程序描述即可。

add_argument()方法

add_argument()方法用來(lái)創(chuàng)建解析參數(shù),定義對(duì)參數(shù)具體的解析,其原型如下:

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

參數(shù)有:

name或者flags - 名稱或選項(xiàng)字符串列表,必填寫(xiě)項(xiàng)。例如foo或-f, --foo。

action - 在命令行中遇到此參數(shù)時(shí)要采取的操作類型。

nargs – 要使用的命令行參數(shù)的數(shù)量,用通配符號(hào)表示,比如"*","+"和"?",分別表示不限數(shù)量,至少一個(gè)和一個(gè)參數(shù)。

const - 一些動(dòng)作和 nargs 選擇所需的常量。

default - 如果參數(shù)在命令行中不存在,則默認(rèn)使用的值。

type - 命令行參數(shù)應(yīng)該轉(zhuǎn)換的類型,默認(rèn)為字符串string

choices – 可選項(xiàng), 一個(gè)允許參數(shù)值的容器。

required - 是否可以省略命令行選項(xiàng)(僅對(duì)可選項(xiàng))。

help - 幫助提示信息,用來(lái)對(duì)參數(shù)進(jìn)行必要的描述。

metavar – 幫助消息替代參數(shù)的顯示名稱。

dest - 要添加到parse_args()函數(shù)返回對(duì)象的屬性的名稱。

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

parse_args()方法

parse_args方法用來(lái)把命令行中的字符,解析到參數(shù)解析命名空間(add_argumnet()創(chuàng)建)定義的各個(gè)參數(shù)。其原型如下:

  1. parse_args(args=None, namespace=None) 

args為參數(shù)列表,參數(shù)字符串通過(guò)調(diào)用sys.argv獲取,Namespace為屬性創(chuàng)建一個(gè)新的空對(duì)象。

實(shí)例學(xué)習(xí)sqlmap

最后我們節(jié)選一個(gè)著名sql注入滲透工具sqlmap的cmdline.py部分代碼,來(lái)展示一個(gè)大型軟件中,如何實(shí)際通過(guò)argparser來(lái)構(gòu)建起命令行界面的。基本上也跟上面流程方法一樣,不過(guò)額外使用一些函數(shù)和功能。

利用Click和argparse給你Python程序構(gòu)建一個(gè)優(yōu)雅的命令行界面

全部代碼詳見(jiàn)sqlmap github官方倉(cāng)庫(kù):

(github /sqlmapproject/sqlmap/blob/master/lib/parse/cmdline.py)

總結(jié)

本文我們實(shí)例介紹了python下構(gòu)建優(yōu)雅終端命令行界面兩種方法Click和argparser。善用他們可以為我們的代碼工作減少很多繁瑣的命令行參數(shù)的定義和解析過(guò)程,提高編碼的效率。

 

責(zé)任編輯:華軒 來(lái)源: 今日頭條
相關(guān)推薦

2021-11-15 14:30:49

Pythonargparse編程語(yǔ)言

2022-09-27 13:07:41

clickPython命令行

2019-11-06 19:21:07

Pythonargparse解釋器

2017-08-30 19:11:38

Linux命令行tab

2022-06-07 07:21:19

Python內(nèi)置庫(kù)命令行

2011-06-17 16:49:05

Cocoa蘋(píng)果

2021-07-07 08:01:51

命令行Dotnet Core控制臺(tái)

2018-06-12 15:10:11

Linuxvim命令PacVim

2025-03-18 10:30:44

2017-12-19 06:39:06

命令行界面CLIIT

2018-01-29 20:12:11

python翻譯命令行

2019-04-16 06:50:34

2019-06-10 15:00:27

node命令行前端

2018-11-21 09:57:44

命令行Linux文件

2016-08-10 12:41:00

Linux工具bcShell

2020-02-13 10:57:59

Python數(shù)據(jù)設(shè)計(jì)

2022-01-26 18:59:08

Python工具

2011-12-07 10:42:22

Java

2018-05-03 12:35:05

Linux命令Pet

2022-02-17 18:21:47

工具HTTPie客戶端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)