- 概念
使用argparse书写友好型的命令行
- 使用步骤
1:import argparse
2:parser = argparse.ArgumentParser()
3:parser.add_argument()
4:parser.parse_args()
1. 导入该模块;
2. 创建一个需要解析的对象;
argumentpaser object
https://docs.python.org/3/library/argparse.html#prog
2.1 prog
可供应另一个参数给argumentparser,在bash调用的时候更简便。
普通情况:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
$ python myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]
ptional arguments:
-h, --help show this help message and exit
--foo FOO foo help
$ cd ..
$ python subdir/myprogram.py --help
usage: myprogram.py [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO foo help
使用prog后的情况
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]
optional arguments:
-h, --help show this help message and exit
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
2.2 usage 用法——不清楚
https://docs.python.org/3/library/argparse.html#usage
2.3description
在argumentparser中,使用简单的描述形容程序的运作。使用description=
在usage和help信息之间显示。
>>> parser = argparse.ArgumentParser(description='A foo that bars')
>>> parser.print_help()
usage: argparse.py [-h]
A foo that bars
optional arguments:
-h, --help show this help message and exit
2.4epilog
有些项目希望在项目之后也能增加描述,这种情况下可以使用epilog=,该描述会放在最后,即在help后面。
同时在有description参数的情况下,使用epilog参数会自动换行,此时可以使用formatter_class变量去调整。
>>> parser = argparse.ArgumentParser(
... description='A foo that bars',
... epilog="And that's how you'd foo a bar")
>>> parser.print_help()
usage: argparse.py [-h]
A foo that bars
optional arguments:
-h, --help show this help message and exit
And that's how you'd foo a bar
2.5parents 为了避免每次在参数里面都要重新定义,引入了parents概念。一些语法略不懂
>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)
>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
Namespace(foo='XXX', parent=2)
>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
2.6 formatter_class
在argumentparser对象中,允许格式化的类,让help变得更好看。这里有四个例子
class argparse.RawDescriptionHelpFormatter
class argparse.RawTextHelpFormatter
class argparse.ArgumentDefaultsHelpFormatter
class argparse.MetavarTypeHelpFormatter
在不使用formatter_class的情况下,description的格式默认是不会自动换行的?持怀疑观点
以下是对比
2.6.1 argparse.RawDescriptionHelpFormatter
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... description='''this description
... was indented weird
... but that is okay''',
... epilog='''
... likewise for this epilog whose whitespace will
... be cleaned up and whose words will be wrapped
... across a couple lines''')
>>> parser.print_help()
usage: PROG [-h]
this description was indented weird but that is okay
optional arguments:
-h, --help show this help message and exit
likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines
在以下的description=textwrap.dedent代表什么意思?
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.RawDescriptionHelpFormatter,
... description=textwrap.dedent('''\
... Please do not mess up this text!
... --------------------------------
... I have indented it
... exactly the way
... I want it
... '''))
>>> parser.print_help()
usage: PROG [-h]
Please do not mess up this text!
-------------------------------
I have indented it
exactly the way
I want it
optional arguments:
-h, --help show this help message and exit
2.6.2 argparse.RawTextHelpFormatter
为各种帮助文本保留空白格,因为多个空白格会被新的描述行替代,可以使用该命令去保留空白行。
2.6.3argparse.ArgumentDefaultsHelpformatter
自动添加各个参数帮助信息中的默认值
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar [bar ...]]
positional arguments:
bar BAR! (default: [1, 2, 3])
optional arguments:
-h, --help show this help message and exit
--foo FOO FOO! (default: 42)
2.6.4 MetavarTypeHelpFormatter
可以用type参数来展现参数,而不是用dest这种默认的格式。
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
usage: PROG [-h] [--foo int] float
positional arguments:
float
optional arguments:
-h, --help show this help message and exit
--foo int
2.7 prefix_chars
大多数命令行选项将使用-作为前缀,例如-f/- foo。需要支持不同或附加前缀字符的解析器,例如,例如,对于+f或/foo的选项,可以使用prefix_chars=参数来指定它们,以参数为ArgumentParser构造函数:
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
2.8 fromfile_prefix_chars 处理特别长的参数时的使用方法:
有时,例如在处理一个特别长的参数列表时,将参数列表保存在一个文件中,而不是在命令行中键入它可能是有意义的。如果fromfile_prefix_chars=参数用于ArgumentParser构造函数,那么从任何指定字符开始的参数将被视为文件,并将被它们所包含的参数所取代。例如:
>>> with open('args.txt', 'w') as fp:
... fp.write('-f\nbar')
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')
2.9 argument_default 设置默认值的参数
通常,参数默认值是通过将默认值传递给add_argument()或通过调用set_defaults()方法来指定特定的名称-值对来指定的。然而,有时为参数指定一个单一的不太广泛的默认值可能是有用的。可以通过将argument_default=关键词参数传递给ArgumentParser来实现。例如,为了全局地使用parse_args()调用的<a name="OLE_LINK3">SUPPRESS</a>属性创建,我们提供argument_default=SUPPRESS。
2.10 allow_abbrev
当你添加参数到parse_args中的时候,系统会自动默认寻找他的全程(前提是这个参数是独一无二的)。使用allow_abbrew=False可以取消自动前缀匹配。
>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon
2.11 conflict_handler 冲突处理
argumentparser不允许在同一个string中添加两个动作,如果添加两个他会默认出现以下错误
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
..
ArgumentError: argument --foo: conflicting option string(s): --foo
如果想解决这个冲突,可在argumentparser中加入conflict_handler=‘resolve’
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]
optional arguments:
-h, --help show this help message and exit
-f FOO old foo help
--foo FOO new foo help
[图片上传失败...(image-92c89a-1515898554574)]
2.12 add_help
默认只要命令行被执行的时候,-h 和 –help都会自动出现,此时如果不希望这出现,就在argumentparser中将add_help=成False即可。
同时help选项默认是-h和—help,在此如果把前缀定义好或者定义成不包含‘-’符号的,那就会显示出另一种样子。
3. 向该对象添加你要关注的命令行参数和选项;每一个add_argument方法对应一个你要关注的参数或选项;
方法add_argument(name or flags...[, action][, nargs]
[, const][, default][, type][, choices][, required][, help][, metavar][, dest])
其中:
name or flags:命令行参数名或者选项,如上面的address或者-p,--port.其中命令行参数如果没给定,且没有设置defualt,则出错。但是如果是选项的话,则设置为None
nargs:命令行参数的个数,一般使用通配符表示,其中,'?'表示只用一个,'*'表示0到多个,'+'表示至少一个
default:默认值
type:参数的类型,默认是字符串string类型,还有float、int等类型
help:和ArgumentParser方法中的参数作用相似,出现的场合也一致
add_argument()常用的参数:
dest:如果提供dest,例如dest="a",那么可以通过args.a访问该参数
default:设置参数的默认值
action:参数出发的动作
store:保存参数,默认
store_const:保存一个被定义为参数规格一部分的值(常量),而不是一个来自参数解析而来的值。
store_ture/store_false:保存相应的布尔值
append:将值保存在一个列表中。
append_const:将一个定义在参数规格中的值(常量)保存在一个列表中。
count:参数出现的次数
parser.add_argument("-v", "--verbosity", action="count", default=0, help="increase output verbosity")
version:打印程序版本信息
type:把从命令行输入的结果转成设置的类型
choice:允许的参数值
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity")
help:参数命令的介绍
如果需要更高级的手法:
https://docs.python.org/2/library/argparse.html#argument-abbreviations-prefix-matching
4.最后调用parse_args()方法进行解析;解析成功之后即可使用
作业:用argparse列出ls –la的内容
ls –l需要的东西:
文件类型,文件执行权,文件节点(文件夹用有的字文件夹个数),文件拥有者,文件拥有者所在组,文件占用空间,文件最近访问时间,文件名
- 文件类型:
使用if函数+os.path.isdir(file),判断文件类型 - 文件执行权?
- 文件节点:os.stat()st_nlink查看硬链接数量
- 文件拥有者
a.先用os.stat()st_uid查看文件拥有者uid
b.输入pwd,利用用户uid,通过pwd查看用户名:
import pwd, os
pwd.getpwuid(os.stat(file).st_uid).pw_name
#纯转用户名的函数为
pwd.getpwuid().pw_name
- 文件拥有者所在组名
a.获得拥有者所在组的gid
os.stat(file).st_gid
b.利用组gid求出组名,在此要先import grp
import os, grp
a = os.stat(file).st_gid
grp.getgrgid(a).gr_name
文件占用空间大小:os.stat(file)st_size
文件最近访问时间:
a.先得到最近访问时间的时间戳:os.stat().st_mtime
b.将时间戳转换成当地时间time.localtime(os.stat().st_mtime)
c.利用time.strftime()函数将时间转换成自己想要的格式:
time.strftime("%m %d %H:%M", time.localtime(os.stat()st_mtime))文件名 直接用file