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

  • 概念

使用argparse書寫友好型的命令行

  • 使用步驟
1:import argparse
2:parser = argparse.ArgumentParser()
3:parser.add_argument()
4:parser.parse_args()

1. 導(dǎo)入該模塊磅甩;
2. 創(chuàng)建一個需要解析的對象炊林;
argumentpaser object
https://docs.python.org/3/library/argparse.html#prog
2.1 prog
可供應(yīng)另一個參數(shù)給argumentparser栅隐,在bash調(diào)用的時(shí)候更簡便。
普通情況:

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中僧叉,使用簡單的描述形容程序的運(yùn)作奕枝。使用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
有些項(xiàng)目希望在項(xiàng)目之后也能增加描述瓶堕,這種情況下可以使用epilog=,該描述會放在最后谭梗,即在help后面宛蚓。
同時(shí)在有description參數(shù)的情況下,使用epilog參數(shù)會自動換行远舅,此時(shí)可以使用formatter_class變量去調(diào)整竞思。

>>> 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 為了避免每次在參數(shù)里面都要重新定義,引入了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的格式默認(rèn)是不會自動換行的氧猬?持懷疑觀點(diǎn)

以下是對比

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

為各種幫助文本保留空白格,因?yàn)槎鄠€空白格會被新的描述行替代柱锹,可以使用該命令去保留空白行丰包。

2.6.3argparse.ArgumentDefaultsHelpformatter

自動添加各個參數(shù)幫助信息中的默認(rèn)值

>>> 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參數(shù)來展現(xiàn)參數(shù)邑彪,而不是用dest這種默認(rèn)的格式。

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

大多數(shù)命令行選項(xiàng)將使用-作為前綴升筏,例如-f/- foo瘸爽。需要支持不同或附加前綴字符的解析器剪决,例如,例如柑潦,對于+f或/foo的選項(xiàng)渗鬼,可以使用prefix_chars=參數(shù)來指定它們,以參數(shù)為ArgumentParser構(gòu)造函數(shù):


>>> 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 處理特別長的參數(shù)時(shí)的使用方法:

有時(shí)差牛,例如在處理一個特別長的參數(shù)列表時(shí)堰乔,將參數(shù)列表保存在一個文件中,而不是在命令行中鍵入它可能是有意義的侦讨。如果fromfile_prefix_chars=參數(shù)用于ArgumentParser構(gòu)造函數(shù),那么從任何指定字符開始的參數(shù)將被視為文件骗污,并將被它們所包含的參數(shù)所取代怜俐。例如:


>>> 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 設(shè)置默認(rèn)值的參數(shù)

通常拍鲤,參數(shù)默認(rèn)值是通過將默認(rèn)值傳遞給add_argument()或通過調(diào)用set_defaults()方法來指定特定的名稱-值對來指定的季稳。然而,有時(shí)為參數(shù)指定一個單一的不太廣泛的默認(rèn)值可能是有用的景鼠☆趵欤可以通過將argument_default=關(guān)鍵詞參數(shù)傳遞給ArgumentParser來實(shí)現(xiàn)。例如玫坛,為了全局地使用parse_args()調(diào)用的<a name="OLE_LINK3">SUPPRESS</a>屬性創(chuàng)建包晰,我們提供argument_default=SUPPRESS。

圖片 1.png

2.10 allow_abbrev

當(dāng)你添加參數(shù)到parse_args中的時(shí)候勉痴,系統(tǒng)會自動默認(rèn)尋找他的全程(前提是這個參數(shù)是獨(dú)一無二的)蒸矛。使用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中添加兩個動作筛谚,如果添加兩個他會默認(rèn)出現(xiàn)以下錯誤


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

默認(rèn)只要命令行被執(zhí)行的時(shí)候,-h 和 –help都會自動出現(xiàn)吮铭,此時(shí)如果不希望這出現(xiàn),就在argumentparser中將add_help=成False即可掠拳。

同時(shí)help選項(xiàng)默認(rèn)是-h和—help纸肉,在此如果把前綴定義好或者定義成不包含‘-’符號的柏肪,那就會顯示出另一種樣子。

3. 向該對象添加你要關(guān)注的命令行參數(shù)和選項(xiàng)聂使;每一個add_argument方法對應(yīng)一個你要關(guān)注的參數(shù)或選項(xiàng)谬俄;

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

其中:

name or flags:命令行參數(shù)名或者選項(xiàng),如上面的address或者-p,--port.其中命令行參數(shù)如果沒給定屎蜓,且沒有設(shè)置defualt蔬芥,則出錯笔诵。但是如果是選項(xiàng)的話,則設(shè)置為None

nargs:命令行參數(shù)的個數(shù)测僵,一般使用通配符表示谢翎,其中,'?'表示只用一個榨婆,'*'表示0到多個褒侧,'+'表示至少一個

default:默認(rèn)值

type:參數(shù)的類型谊迄,默認(rèn)是字符串string類型统诺,還有float疑俭、int等類型

help:和ArgumentParser方法中的參數(shù)作用相似,出現(xiàn)的場合也一致

add_argument()常用的參數(shù):

dest:如果提供dest啄寡,例如dest="a"香璃,那么可以通過args.a訪問該參數(shù)

default:設(shè)置參數(shù)的默認(rèn)值

action:參數(shù)出發(fā)的動作

store:保存參數(shù)葡秒,默認(rèn)

store_const:保存一個被定義為參數(shù)規(guī)格一部分的值(常量),而不是一個來自參數(shù)解析而來的值蹋岩。

store_ture/store_false:保存相應(yīng)的布爾值

append:將值保存在一個列表中学少。

append_const:將一個定義在參數(shù)規(guī)格中的值(常量)保存在一個列表中。

count:參數(shù)出現(xiàn)的次數(shù)

parser.add_argument("-v", "--verbosity", action="count", default=0, help="increase output verbosity")

version:打印程序版本信息

type:把從命令行輸入的結(jié)果轉(zhuǎn)成設(shè)置的類型

choice:允許的參數(shù)值

parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity")

help:參數(shù)命令的介紹

如果需要更高級的手法:

https://docs.python.org/2/library/argparse.html#argument-abbreviations-prefix-matching

4.最后調(diào)用parse_args()方法進(jìn)行解析扣囊;解析成功之后即可使用

作業(yè):用argparse列出ls –la的內(nèi)容

ls –l需要的東西:
文件類型侵歇,文件執(zhí)行權(quán)吓蘑,文件節(jié)點(diǎn)(文件夾用有的字文件夾個數(shù)),文件擁有者溃蔫,文件擁有者所在組琳猫,文件占用空間脐嫂,文件最近訪問時(shí)間侄榴,文件名

  • 文件類型:
    使用if函數(shù)+os.path.isdir(file)网沾,判斷文件類型
  • 文件執(zhí)行權(quán)辉哥?
  • 文件節(jié)點(diǎn):os.stat()st_nlink查看硬鏈接數(shù)量
  • 文件擁有者
    a.先用os.stat()st_uid查看文件擁有者uid
    b.輸入pwd,利用用戶uid攒射,通過pwd查看用戶名:
import pwd, os
pwd.getpwuid(os.stat(file).st_uid).pw_name

#純轉(zhuǎn)用戶名的函數(shù)為
pwd.getpwuid().pw_name

pwd衍生_網(wǎng)址

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

  • 文件最近訪問時(shí)間:
    a.先得到最近訪問時(shí)間的時(shí)間戳:os.stat().st_mtime
    b.將時(shí)間戳轉(zhuǎn)換成當(dāng)?shù)貢r(shí)間time.localtime(os.stat().st_mtime)
    c.利用time.strftime()函數(shù)將時(shí)間轉(zhuǎn)換成自己想要的格式:
    time.strftime("%m %d %H:%M", time.localtime(os.stat()st_mtime))

  • 文件名 直接用file

作業(yè)參考:

st_mode的詳細(xì)解釋

os.stat()介紹和模塊詳解

作業(yè)第一版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捂人,一起剝皮案震驚了整個濱河市滥搭,隨后出現(xiàn)的幾起案子捣鲸,更是在濱河造成了極大的恐慌,老刑警劉巖愁溜,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件外厂,死亡現(xiàn)場離奇詭異酣衷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)席爽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門只锻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紫谷,“玉大人捐寥,你說我怎么就攤上這事祖驱∞嗥В” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵束昵,是天一觀的道長葛峻。 經(jīng)常有香客問我术奖,道長,這世上最難降的妖魔是什么榛丢? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任挺庞,我火速辦了婚禮选侨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戏挡。我一直安慰自己晨仑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布妥凳。 她就那樣靜靜地躺著逝钥,像睡著了一般拱镐。 火紅的嫁衣襯著肌膚如雪持际。 梳的紋絲不亂的頭發(fā)上哗咆,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天岳枷,我揣著相機(jī)與錄音空繁,去河邊找鬼朱庆。 笑死,一個胖子當(dāng)著我的面吹牛傲诵,可吹牛的內(nèi)容都是我干的箱硕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栓拜,長吁一口氣:“原來是場噩夢啊……” “哼幕与!你這毒婦竟也來了镇防?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诫给,失蹤者是張志新(化名)和其女友劉穎中狂,沒想到半個月后考传,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枉层,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年赐写,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揉忘。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡泣矛,死狀恐怖禾蚕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哗总,我是刑警寧澤倍试,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布县习,位于F島的核電站,受9級特大地震影響哈蝇,放射性物質(zhì)發(fā)生泄漏攘已。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一吠勘、第九天 我趴在偏房一處隱蔽的房頂上張望剧防。 院中可真熱鬧辫樱,春花似錦、人聲如沸鸡挠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽备埃。三九已至按脚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間望众,已是汗流浹背伞辛。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工蚤氏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踊兜,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓于游,卻偏偏與公主長得像贰剥,于是被迫代替她去往敵國和親筷频。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 曾經(jīng)有一份美好的愛情放在我的面前我沒有珍惜。等到失去后才后悔莫及吵取。如果可以再對小李說锯厢。毛欣想說。這輩子無緣再牽手捺氢。...
    毛欣與小李閱讀 2,613評論 0 13
  • 9月11摄乒,中秋之前残黑,20跑友,游黑山谷拭荤。出萬盛城區(qū)十余公里疫诽,上盤山公路。九曲八彎雏亚,轉(zhuǎn)轉(zhuǎn)折折摩钙。云霧繚繞于群山之腰,金...
    鐵馬老言閱讀 822評論 0 6
  • 我昨天沒有寫之斯,今天我又不想寫,但還好我并沒有打算就此放棄莉擒,而是用歐卡看了一下,結(jié)果答案是我還是堅(jiān)持下去比較好填硕。 今...
    百合兒閱讀 165評論 1 0
  • 新的一年翅帜,我們大家肯定都在暢想著美好的未來姻檀,憧憬著美麗的藍(lán)圖,我也一樣涝滴,在新年到來的前一夜绣版,我豪情壯志地拿...
    穿prada的女王閱讀 327評論 1 1
  • 在三年前的某一天,一個女孩經(jīng)過努力歼疮,經(jīng)過抗衡杂抽。終于去上了大學(xué)韩脏,一個不知名的屇梗科學(xué)院! 她性格開朗骤素,天真,懂事愚屁,...
    俗人_7bd3閱讀 186評論 1 1