<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
除ide的執行方式外,命令列的方式執行Python指令碼是引數化程式執行的一種常見且簡單的方法,正確處理命令列引數,可以提供給包含某種引數化資訊的程式或指令碼的引數。例如處理目錄或者檔案通常作為命令列引數傳遞給指令碼,用於使程式可以處理不同圖片或者不同型別檔案。
python main.py -a v1 -b v2 ...
1、sys.argv
2、getopt
3、argparse
1、sys.argv返回一個列表,第一個值為指令碼名稱,列表的值型別為string。
2、引數數量:len(sys.argv)
3、獲取全部引數:sys.argv
# -*- coding: utf-8 -*- # time: 2022/9/1 0:10 # file: args_demo.py # 公眾號: 玩轉測試開發 import sys def f1(): print(f"正在執行的指令碼名稱: {sys.argv[0]}") print(f"指令碼的引數數量: {len(sys.argv)}") print(f"指令碼的引數: {sys.argv}") if __name__ == '__main__': f1()
執行結果:
getopt案例:getopt 模組是專門處理命令列引數的模組,用於獲取命令列選項和引數。命令列選項使得程式的引數更加靈活,其支援短選項模式(-)和雙-選項模式(--)。該模組提供了兩個方法及一個例外處理來解析命令列引數。
語法格式:
getopt.getopt(args, options[, long_options])
引數說明:
args:要解析的命令列參數列,一般是sys.argv[1:],需要過濾掉指令碼名(sys.argv[0])
options:以字串的格式定義,options 後的冒號 “:” ,表示如果設定該選項,必須有附加的引數,否則就不附加引數
long_options:以列表的格式定義,long_options 後的等號 “=” ,表示該選項必須有附加的引數,不帶冒號表示該選項不附加引數
# -*- coding: utf-8 -*- # time: 2022/9/1 0:10 # file: args_demo.py # 公眾號: 玩轉測試開發 import sys import getopt def f1(): print(f"正在執行的指令碼名稱: {sys.argv[0]}") print(f"指令碼的引數數量: {len(sys.argv)}") print(f"指令碼的引數: {sys.argv}") def f2(argv): input_file = "" output_file = "" opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="]) # "hi:o:": 短格式分析串, h 後面沒有冒號, 表示後面不帶引數; i 和 o 後面帶有冒號, 表示後面帶引數 # ["help", "input_file=", "output_file="]: 長格式分析串列表, help後面沒有等號, 表示後面不帶引數; input_file和output_file後面帶冒號, 表示後面帶引數 # 返回值包括 `opts` 和 `args`, opts 是以元組為元素的列表, 每個元組的形式為: (選項, 附加引數),如: ('-i', 'test.png'); # args是個列表,其中的元素是那些不含'-'或'--'的引數 for opt, arg in opts: if opt in ("-h", "--help"): # 即:處理 -h引數的案例說明,幫助檔案等 print('args_demo.py -i <input_file> -o <output_file>') print('or: args_demo.py --input_file=<input_file> --output_file=<output_file>') sys.exit() elif opt in ("-i", "--input_file"): input_file = arg elif opt in ("-o", "--output_file"): output_file = arg print(f'輸入檔案為:{input_file}') print(f'輸出檔案為:{output_file}') # 列印不含'-'或'--'的引數 for i in range(0, len(args)): print(f'不含 - 或 -- 的引數 {i + 1} 為:{args[i]}') if __name__ == '__main__': # f1() f2(sys.argv)
命令列依次執行:
python args_demo.py -h python args_demo.py -i a.txt python args_demo.py -o b.txt python args_demo.py -i a.txt -o b.txt c.txt
執行結果:
Exception getopt.GetoptError:在參數列中沒有找到所傳遞引數,或選項的需要的引數為空時會觸發該異常。異常的引數是一個字串,表示錯誤的原因。屬性 msg 和 opt 為相關選項的錯誤資訊。在上述程式碼中新增例外處理,檢查此錯誤資訊。
使用錯誤的格式選項傳遞引數執行指令碼:python args_demo.py -q
argparse案例:當程式中使用採用複雜引數或多個檔名時,推薦使用 Python 的 argparse 庫,它以系統的方式處理命令列引數,從而可以編寫使用者友好的命令列程式。Python 標準庫 argparse 同樣也是用於解析命令列引數的模組。首先,由程式確定所需的引數,然後 argparse 將這些引數解析為 sys.argv。此外,argparse 會生成幫助和使用資訊提示,並在提供無效引數時發出錯誤。為了介紹此模組,編寫 argparse_demo1.py,如下所示:
為了介紹此模組,編寫 argparse_demo1.py,如下所示:
不帶引數執行此指令碼不會向 stdout 顯示任何內容。但是,如果使用 --help 或 -h 選項,將得到指令碼的使用資訊提示
import argparse parser = argparse.ArgumentParser() parser.parse_args()
執行結果:
(venv)>python argparse_demo.py -h
usage: argparse_demo.py [-h]
optional arguments:
-h, --help show this help message and exit
(venv)>python argparse_demo.py --help
usage: argparse_demo.py [-h]
optional arguments:
-h, --help show this help message and exit
指定其他引數會導致錯誤python argparse_demo.py -q
python argparse_demo.py -q usage: argparse_demo.py [-h] argparse_demo.py: error: unrecognized arguments: -q
新增一個引數需要呼叫方法 parser.add_argument
# -*- coding: utf-8 -*- # time: 2022/8/31 16:20 # file: argparse_demo1.py # author: tom import argparse parser = argparse.ArgumentParser() parser.add_argument("name", help="新增的第1個引數name,姓名。") args = parser.parse_args() print(f"args.name:{args.name}") print(f"type:{type(args.name)}")
使用範例:
python argparse_demo1.py tom python argparse_demo1.py -h python argparse_demo1.py
執行結果:此時不帶引數執行指令碼則丟擲缺少引數name
(venv) >python argparse_demo.py tom
args.name:tom
type:<class 'str'>
(venv) >python argparse_demo.py -h
usage: argparse_demo.py [-h] name
positional arguments:
name 新增的第1個引數name,姓名。
optional arguments:
-h, --help show this help message and exit
(venv) >python argparse_demo.py
usage: argparse_demo.py [-h] name
argparse_demo.py: error: the following arguments are required: name
使用--的形式:使用-的形式則--name改成 -name即可。
argparse 將提供的選項預設視為字串,新增int型別的案例
# -*- coding: utf-8 -*- # time: 2022/8/31 16:20 # file: argparse_demo1.py # author: tom import argparse parser = argparse.ArgumentParser() parser.add_argument("--name", help="新增的第1個引數name,姓名。") parser.add_argument("--age", help="新增的第2個引數age,年齡。", type=int) args = parser.parse_args() print(f"args.name:{args.name}") print(f"type:{type(args.name)}") print("*" * 50) print(f"args.age:{args.age}") print(f"type:{type(args.age)}")
使用範例:可使用兩種形式 --key=value / --key value
python argparse_demo.py --name=tom --age=30 python argparse_demo.py --name tom --age 30
執行結果:
(venv) >python argparse_demo.py --name=tom --age=30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>
(venv) >python argparse_demo.py --name tom --age 30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>
到此這篇關於Python實現解析命令列引數的常見方法總結的文章就介紹到這了,更多相關Python解析命令列引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45