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


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')

file_prefix_.png

2.9 argument_default 设置默认值的参数

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

图片 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()介绍和模块详解

作业第一版

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 曾经有一份美好的爱情放在我的面前我没有珍惜。等到失去后才后悔莫及。如果可以再对小李说。毛欣想说。这辈子无缘再牵手。...
    毛欣与小李阅读 2,486评论 0 13
  • 9月11,中秋之前,20跑友,游黑山谷。出万盛城区十余公里,上盘山公路。九曲八弯,转转折折。云雾缭绕于群山之腰,金...
    铁马老言阅读 764评论 0 6
  • 我昨天没有写,今天我又不想写,但还好我并没有打算就此放弃,而是用欧卡看了一下,结果答案是我还是坚持下去比较好。 今...
    百合儿阅读 156评论 1 0
  • 新的一年,我们大家肯定都在畅想着美好的未来,憧憬着美丽的蓝图,我也一样,在新年到来的前一夜,我豪情壮志地拿...
    穿prada的女王阅读 291评论 1 1
  • 在三年前的某一天,一个女孩经过努力,经过抗衡。终于去上了大学,一个不知名的专科学院! 她性格开朗,天真,懂事,...
    俗人_7bd3阅读 176评论 1 1