詳解python中的三種命令行模塊(sys.argv,argparse,click)
Python作為一門腳本語言,經(jīng)常作為腳本接受命令行傳入?yún)?shù),Python接受命令行參數(shù)大概有三種方式。因為在日常工作場景會經(jīng)常使用到,這里對這幾種方式進行總結(jié)。
命令行參數(shù)模塊這里命令行參數(shù)模塊平時工作中用到最多就是這三種模塊:sys.argv,argparse,click。sys.argv和argparse都是內(nèi)置模塊,click則是第三方模塊。
sys.argv模塊(內(nèi)置模塊)先看一個簡單的示例:
#!/usr/bin/pythonimport sysdef hello(name, age, sex, *args): print('Hello, My name is {name}.'.format(name=name)) print('I’m {age} years old.'.format(age=age)) print('I’m a {sex}'.format(sex=sex)) print('Other word:n{args}'.format(args='n'.join(args)))if __name__ == '__main__': file_name = sys.argv[0] name = sys.argv[1] age = sys.argv[2] sex = sys.argv[3] other = sys.argv[4:] hello(name, age, sex, *other)
調(diào)用腳本:
python test_sysargv.py zhangsan 13 man nibi ss
腳本輸出:
Hello, My name is zhangsan.I’m 13 years old.I’m a manOther word:nibiss
sys.argv模塊不難理解,命令參數(shù)作為列表傳入Python腳本中,argv[0]是腳本的名字,argv[1]則是第一個參數(shù),后面以此類推。所以在腳本中只需要提取列表中的參數(shù)即可使用。上面演示的是正確調(diào)用Python腳本的情況,下面則是調(diào)用失敗的情況。
錯誤調(diào)用腳本:
python test_sysargv.py zhangsan 13
錯誤輸出:
Traceback (most recent call last): File 'test_sysargv.py', line 16, in <module> sex = sys.argv[3]IndexError: list index out of range
關(guān)于錯誤也很好理解,經(jīng)典的列表索引超出范圍,之所列表索引超出范圍,沒有傳入足夠的參數(shù)。當然你可以使用try...except捕獲錯誤。但是這種做法太過死板,因為在命令行中必須按照腳本規(guī)定的參數(shù)順序輸入?yún)?shù),所以這種模塊使用一般是針對一些需要的參數(shù)比較少并且固定的腳本。
argparse模塊(內(nèi)置模塊)同樣的先看一個簡單的示例:
#!/usr/bin/pythonimport argparseparser = argparse.ArgumentParser(description=’Test for argparse module.’) # 構(gòu)建命令參數(shù)實例parser.add_argument('--name', '-n', help='name attribute: 非必要屬性')parser.add_argument('--age', '-a', help='age attribute: 非必要屬性')parser.add_argument('--sex', '-s', help='sex attribute: 非必要屬性')parser.add_argument('--type', '-t', help='type attribute: 非必要屬性', required=True)args = parser.parse_args()def hello(name, age, sex, *args): print('Hello, My name is {name}.'.format(name=name)) print('I’m {age} years old.'.format(age=age)) print('I’m a {sex}'.format(sex=sex)) print('Other word:n{args}'.format(args='n'.join(args)))if __name__ == '__main__': print('Format of transfer file: {type}'.format(type=args.type)) if args.name and args.age and args.sex: hello(args.name, args.age, args.sex)
執(zhí)行腳本:
python3 test_argparse.py -t json -n zhangsan -a 13 -s man
腳本成功輸出:
Format of transfer file: jsonHello, My name is zhangsan.I’m 13 years old.I’m a manOther word:
關(guān)于argparse模塊的使用,首先需要生成一個命令行參數(shù)的實例,然后通過對這個對象添加屬性,添加需要從命令行獲取的參數(shù),包括哪些是必要參數(shù)(required=True),哪些非必要參數(shù),同時也可以對每個參數(shù)進行幫助提示(help='')。
而上面示例中分別添加了四個屬性,--name和-n同時可以再命令行中使用,都表示了參數(shù)name。ArgumentParser通過parse_ags()方法解析參數(shù),檢查命令行,將每個參數(shù)轉(zhuǎn)換為適當?shù)念愋停栽谀_本中同時也可以使用args.n和args.name獲取到參數(shù),相對應(yīng)的如果沒有傳入該參數(shù),腳本中則獲取到None。
查看命令行參數(shù)之后腳本的幫助提示:
python3 test_argparse.py -husage: test_argparse.py [-h] [--name NAME] [--age AGE] [--sex SEX] --type TYPETest for argparse module.optional arguments: -h, --help show this help message and exit --name NAME, -n NAME name attribute: 非必要屬性 --age AGE, -a AGE age attribute: 非必要屬性 --sex SEX, -s SEX sex attribute: 非必要屬性 --type TYPE, -t TYPE type attribute: 非必要屬性
另外在添加命令行參數(shù)的屬性中,還有更多的設(shè)置,多余的可以參考Python官方文檔,里面都有詳細的標注,這里就不展開來講,總結(jié)的就是關(guān)于argparse模塊的使用非常簡便,同時十分人性化,也很符合日常工作的需要。
click模塊先開一個簡單的使用示例:
#!/usr/bin/pythonimport click@click.command()@click.option('--name', default='zhangsan', help='name attribute: 非必要屬性')@click.option('--age', help='age attribute', type=int)@click.option('--sex', help='sex attribute')@click.option('-t', help='type attribute: 必要屬性', required=True)def hello(t, name, age, sex, *args): print('Format of transfer file: {type}'.format(type=t)) print('Hello, My name is {name}.'.format(name=name)) print('I’m {age} years old.'.format(age=age)) print('I’m a {sex}'.format(sex=sex)) print('Other word:n{args}'.format(args='n'.join(args)))if __name__ == '__main__': hello()
執(zhí)行腳本:
python3 test_click.py -t 1 --age 13 --sex man
腳本輸出:
Format of transfer file: 1Hello, My name is zhangsan.I’m 13 years old.I’m a manOther word:
click模塊是Flask團隊優(yōu)秀的開源項目,使用方法和argparse模塊很相似,同樣為命令行封裝了大量的方法,使用者只需要專注代碼功能的實現(xiàn)。click模塊和argparse模塊不同的地方就是,click模塊使用裝飾器的方式給函數(shù)添加命令行屬性,關(guān)于裝飾器簡單來講就是能夠在不修改原有函數(shù)的基礎(chǔ)上添加功能。雖然使用裝飾器但是添加命令行屬性的方式和argparse模塊很相似,包括options中常用的參數(shù)含義也有很多類似的地方。值得注意的就是一開始需要通過command()將函數(shù)成為命令行的接口。關(guān)于的click模塊的就大致講到這里,其余有興趣的可以再去了解一下。
總結(jié)關(guān)于這三個模塊值得注意的是,盡量貼近自己應(yīng)用場景去選擇,真正的做到自己能夠方便使用才是你去使用這些模塊的原因。
以上就是詳解python中的三種命令行模塊(sys.argv,argparse,click)的詳細內(nèi)容,更多關(guān)于python 命令行模塊的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. python argparse模塊通過后臺傳遞參數(shù)實例2. Python命令行參數(shù)argv和argparse該如何使用3. Python基于argparse與ConfigParser庫進行入?yún)⒔馕雠cini parser4. python 如何利用argparse解析命令行參數(shù)5. Python 利用argparse模塊實現(xiàn)腳本命令行參數(shù)解析6. 淺談Python 命令行參數(shù)argparse寫入圖片路徑操作7. python入門:argparse淺析 nargs='+'作用8. python argparse命令行參數(shù)解析(推薦)9. Python包argparse模塊常用方法10. python argparse傳入布爾參數(shù)false不生效的解決
