11argparse的使用,pwd,grp,stat使用

  • 概念

使用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概念。一些语法略不懂


11argparse的使用,pwd,grp,stat使用_第1张图片
parents.jpeg
>>> 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')

11argparse的使用,pwd,grp,stat使用_第2张图片
file_prefix_.png

2.9 argument_default 设置默认值的参数

通常,参数默认值是通过将默认值传递给add_argument()或通过调用set_defaults()方法来指定特定的名称-值对来指定的。然而,有时为参数指定一个单一的不太广泛的默认值可能是有用的。可以通过将argument_default=关键词参数传递给ArgumentParser来实现。例如,为了全局地使用parse_args()调用的SUPPRESS属性创建,我们提供argument_default=SUPPRESS。

11argparse的使用,pwd,grp,stat使用_第3张图片
图片 1.png

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

pwd衍生_网址

  • 文件拥有者所在组名
    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

作业参考:

st_mode的详细解释

os.stat()介绍和模块详解

作业第一版

你可能感兴趣的:(11argparse的使用,pwd,grp,stat使用)