我们知道在Linux下有文雅的shell终端号令行界面,shell剧本都能够文雅用号令行的方式来运转。而且shell也再带优化号令行参数剖析的bash内部号令getopts和大多数刊行版附带的外部号令getops。Perl言语也有Getopt::XX系列模块来实现类似功能;Golang也有flag标准库以及更加强大的第三库cobra。
说了这么多你肯定要问,那么Python呢?Python不像shell,perl一样有便利强大的oneline剧本,尽管Python有强大的web界面下的剧本施行情况Jupyter Note,但是对终端号令行下的施行也是我们要追求的目标。本文虫虫就给大家引见如安在Python下实现文雅的终端号令行界面CLI,触及的模块有Click和argparse和。
Click
Python开始的时候也模仿bansh和其他言语有getopt,optparse等模块来做CLI,以后推出argparser模块后getopt,optparse等都曾经被烧毁,我们不在引见他们。在引见argparser模块之前我们先来引见click。
首先最简朴的方式是使用click。我们先来看下python 3中的print()函数,留意该print()强制必需以带括号方式, 这是和python2最大的区分。其界说以下:
print(*objects, sep=' ', end='\n', file= flush=False)
能够看到该函数能够支撑各种范例花样的输出,而不但单一个打印输出了。
比如,经过能够自界说打印的结束字符,默许是"\n"。
print('hello,chongchong! ', end='\r')
能够经过sep自界说朋分符,而不是默许的空格。
print('hello', ' chongchong!', sep=',')
经过file来重定向输出到文件,而不是stdout的默许标准输出。
print(' hello,chongchong!', file=open(' 'w'))
我们能够利用click在号令行中实现对这些参数的输入息争析,实现一个简朴的打印号令行界面。空话少说直接上代码:
#!/usr/bin/env python3
import click
import sys
@
@ nargs=-1)
@ '--sep', default=' ', help='分隔符,默许为空')
@ '--end', default='\n', help='末端字符,默许为 "\\n"')
@ '--out', default=None, help='输出文件,默许为stdout)')
def print_prog(args, sep, end, out):
'''打印输出结果。
'''
print(*args, sep=sep, end=end, file=open(out, 'w') if out else
if __name__ == '__main__':
print_prog()
剧本很简单,就是猎取输入的参数,并将其通报给print()函数施行。施行以下:
打印文本
python hello,chongchong!
显现辅助
python –help
设置朋分标记
python -s %% hello chongchong!
重定向到文件
python -o -s %% hello chongchong!
经过几行代码就实现了一个很棒的交互界面!
固然你能够顺次为基础增加更多的内容,让它更适用这是一个演示,向您展现建立本身的CLI是多么容易。你不再需求编写普通的python剧本文件了。更多功能和高等特性能够参考click官方文档:
更多的基于click的项目和模块也能够经过其github仓clone和fork使用,你也能够给该项目添加自己的进献。
argparse
我们开始从官方的数字计算程序小例子来开始:
import argparse
parser = some integers.')
metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args =
上面的代码诠释:
开始,经过建立一个剖析工具;
接着,给工具添加两个参数,用add_argument()方法。比如本例中是一个type为一个大概一列整数;另有一个目标为accumulate属性用来挑选两个函数sum()和max()乞降和求最大值,默许为求最大值。
然后,经过parse_args()函数剖析工具的参数,并把各个参数剖析为合适的类型(int,accumulate),触发对应的举动(sum,max)。
最后经过print打印结果。
使用方法以下:
ArgumentParser构造工具
ArgumentParser工具的初始化原型为(构造方法):
ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class= prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)
其各个参数为:
prog - 程序的称号(默许为
usage - 描述程序使用辅助信息(默许值:从添加的参数来天生)
description - 在参数辅助之前显现的文本(默许值:无)
epilog - 在参数辅助后显现的文本(默许值:无)
parents - ArgumentParser也应包含其参数的工具列表
formatter_class - 用于自界说辅助输出的类
prefix_chars - 前缀可选参数的字符集(默许值:' - ')
fromfile_prefix_chars -文件前缀字符参数(默许值:None)
argument_default -为参数的全局默许值(默许值:None)
conflict_handler - 处理矛盾选项的计谋(通常不需求)
add_help -添加-h/--help选项剖析器(默许值:True)
一般情况下,我们无需管其他情况,只需设置个程序描述便可。
add_argument()方法
add_argument()方法用来建立剖析参数,界说对参数具体的剖析,其原型以下:
add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
参数有:
name大概flags - 名称或选项字符串列表,必填写项。比方foo或-f, --foo。
action - 在号令行中碰到此参数时要采取的操纵类型。
nargs – 要使用的号令行参数的数目,用通配标记表示,比如"*","+"和"?",分别表示不限数目,最少一个和一个参数。
const - 一些行动和 nargs 挑选所需的常量。
default - 如果参数在号令行中不存在,则默认使用的值。
type - 号令行参数应当转换的类型,默许为字符串string
choices – 可选项, 一个容许参数值的容器。
required - 能否能够省略号令行选项(仅对可选项)。
help - 辅助提示信息,用来对参数实行须要的描述。
metavar – 辅助消息替换参数的显现称号。
dest - 要添加到parse_args()函数返回工具的属性的称号。
parse_args()方法
parse_args方法用来把号令行中的字符,剖析到参数剖析定名空间(add_argumnet()建立)界说的各个参数。其原型以下:
parse_args(args=None, namespace=None)
args为参数列表,参数字符勾经过调用猎取,Namespace为属性建立一个新的空工具。
实例学习sqlmap
最后我们节选一个著名sql注入渗透工具sqlmap的部分代码,来展现一个大型软件中,怎样现实经过argparser来构建起号令行界面的。基本上也跟上面流程方法一样,不过分外使用一些函数和功能,节选代码以下:
brute = "Brute force", "These options can be used to run brute force checks")
"--common-tables", dest="commonTables", action="store_true",
help="Check existence of common tables")
udf = "User-defined function injection", "These options can be used to create custom user-defined functions")
"--udf-inject", dest="udfInject", action="store_true",
help="Inject custom user-defined functions")
"--shared-lib", dest="shLib",
help="Local path of the shared library")
全部代码详见sqlmap github官方货仓。
总结
本文我们实例引见了python下构建文雅终端号令行界面两种方法Click和argparser。善用他们可认为我们的代码工作削减很多繁琐的号令行参数的界说息争析历程,提高编码的服从。