- 概念
使用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概念。一些語法略不懂
>>> 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')
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。
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
- 文件擁有者所在組名
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