網站首頁 編程語言 正文
0. 命令行參數
通常,對于大型項目程序而言,執行程序的一個必要的步驟是正確處理命令行參數,這些命令行參數是提供給包含某種參數化信息的程序或腳本的參數。例如,在計算機視覺項目中,圖像和不同類型的文件通常作為命令行參數傳遞給腳本,用于使程序可以處理不同圖片或者不同類型文件。
命令行參數是參數化程序執行的一種常見且簡單的方法,下面主要介紹三種常見的獲取和解析命令行參數的方法。
1. sys.argv
為了處理命令行參數,Python 中內置了 sys.argv 模塊,通過模塊中的 sys.argv 就可以訪問到所有的命令行參數,它的返回值是包含所有命令行參數的列表 (list)。當程序執行時,Python 從命令行獲取所有值并將它們存儲在 sys.argv 列表中。列表的第一個元素 sys.argv[0] 是腳本的完整路徑(或腳本名稱——取決于具體操作系統)。列表的第二個元素是腳本的第一個命令行參數,即 sys.argv[1],依此類推。這可以通過下圖中清晰的看出,其中 script_1.py 腳本使用兩個參數執行:
接下來,讓我們看看 sys.argv 是如何工作的,首先編寫 scripy_1.py 腳本:
import sys print("正在運行的腳本名稱: '{}'".format(sys.argv[0])) print("腳本的參數數量: '{}'".format(len(sys.argv))) print("腳本的參數: '{}'".format(str(sys.argv)))
如果我們不使用任何參數執行這個腳本:
python script_1.py
將會看到如下信息:
正在運行的腳本名稱: 'script_1.py'
腳本的參數數量: '1'
腳本的參數: '['script_1.py']'
如果我們使用多個參數執行此腳本:
python script_1.py OpenCV -i test.png
將得到以下信息:
正在運行的腳本名稱: 'script_1.py'
腳本的參數數量: '4'
腳本的參數: '['script_1.py', 'OpenCV', '-i', 'test.png']'
如上所示,列表的第一個元素 script_1.py (sys.argv[0]) 是腳本名稱。列表的第二個元素 (sys.argv[1]) OpenCV 是腳本的第一個參數。但同時也可以看到,sys.argv 將命令行選項 -i 也識別為參數,這樣并不能方便的滿足我們的需求,因此引入 getopt 模塊來識別命令行選項。
2. getopt
getopt 模塊是專門處理命令行參數的模塊,用于獲取命令行選項和參數。命令行選項使得程序的參數更加靈活,其支持短選項模式(-)和長選項模式(–)。
該模塊提供了兩個方法及一個異常處理來解析命令行參數。
2.1 getopt.getopt 方法
getopt.getopt 方法用于解析命令行參數列表,其語法格式如下:
getopt.getopt(args, options[, long_options])
方法參數說明如下表所示:
參數 | 說明 |
---|---|
args | 要解析的命令行參數列表,一般是sys.argv[1:],需要過濾掉腳本名(sys.argv[0]) |
options | 以字符串的格式定義,options 后的冒號 “: ” 表示如果設置該選項,必須有附加的參數,否則就不附加參數 |
long_options | 以列表的格式定義,long_options 后的等號 “= ” 表示該選項必須有附加的參數,不帶冒號表示該選項不附加參數 |
該方法返回值由兩個元素組成: 第一個是 (option, value) 元組的列表。 第二個是參數列表,包含那些沒有 - 或 – 的參數。
下面編寫 script_2.py 腳本進行演示:
import sys import getopt def main(argv): 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是個列表,其中的元素是那些不含'-'或'--'的參數 opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="]) for opt, arg in opts: if opt in ("-h", "--help"): print('script_2.py -i-o ') print('or: test_arg.py --input_file= --output_file= ') sys.exit() elif opt in ("-i", "--input_file"): input_file = arg elif opt in ("-o", "--output_file"): output_file = arg print('輸入文件為:', input_file) print('輸出文件為:', output_file) # 打印不含'-'或'--'的參數 for i in range(0, len(args)): print('不含'-'或'--'的參數 %s 為:%s' % (i + 1, args[i])) if __name__ == "__main__": main(sys.argv)
使用帶有命令行選項的命令執行此腳本,以下兩種方式是等價的:
# 方式1 python scripy_1.py -i test.png -o output.png OpenCV # 方式2 python scripy_1.py --input_file test.png --output_file output.png OpenCV
輸出得到以下信息:
輸入文件為: test.png
輸出文件為: output.png
不含'-'或'--'的參數 1 為:OpenCV
2.2 Exception getopt.GetoptError
在參數列表中沒有找到所傳遞參數,或選項的需要的參數為空時會觸發該異常。異常的參數是一個字符串,表示錯誤的原因。屬性 msg 和 opt 為相關選項的錯誤信息。
在上述代碼中添加異常處理,檢查此錯誤信息:
# ... def main(argv): input_file = "" output_file = "" try: opts, args = getopt.getopt(argv[1:], "hi:o", ["help", "input_file=", "output_file="]) except getopt.GetoptError as e: print(e.msg) print(e.opt) sys.exit(2) # ...
使用錯誤的格式選項傳遞參數執行腳本:
python scripy_1.py -f
輸出以下錯誤信息:
option -f not recognized f
3. argparse
當程序中使用采用復雜參數或多個文件名時,推薦使用 Python 的 argparse 庫,它以系統的方式處理命令行參數,從而可以編寫用戶友好的命令行程序。Python 標準庫 argparse 同樣也是用于解析命令行參數的模塊。首先,由程序確定所需的參數,然后, argparse 將這些參數解析為 sys.argv。此外,argparse 會生成幫助和使用信息提示,并在提供無效參數時發出錯誤。
為了介紹此模塊,編寫 script_3.py,如下所示:
import argparse parser = argparse.ArgumentParser() parser.parse_args()
不帶參數運行此腳本不會向 stdout 顯示任何內容。但是,如果使用 --help 或 -h 選項,將得到腳本的使用信息提示:
usage: scripy_3.py [-h] optional arguments: -h, --help show this help message and exit
指定其他參數會導致錯誤,例如使用如下命令:
scripy_3.py -i
則會報導致錯誤:
usage: scripy_3.py [-h]
argparse_minimal.py: error: unrecognized arguments: -i
由于未定義參數,因此不允許其他參數,接下來就添加一個參數,編寫 script_4.py 腳本:
import argparse parser = argparse.ArgumentParser() parser.add_argument("first_argument", help="this is the string text in connection with first_argument") args = parser.parse_args() print(args.first_argument)
這里添加了 add_argument() 方法。此方法用于指定程序將接受哪些命令行選項,此處添加了 first_argument 參數。此外, argparse 模塊存儲所有參數,將其名稱與每個添加參數的名稱相匹配——在此處為 first_argument 。為了獲得參數值,需要使用 args.first_argument。
如果此腳本以下示方法執行,則輸出為 10:
python scripy_4.py 10
但如果腳本在沒有參數的情況下執行,則將輸出以下信息:
usage: scripy_4.py [-h] first_argument
scripy_4.py: error: the following arguments are required: first_argument
最后,如果我們使用 -h 選項執行腳本,輸出將如下所示:
usage: scripy_4.py [-h] first_argument
positional arguments:
? first_argument ?this is the string text in connection with first_argumentoptional arguments:
? -h, --help ? ? ?show this help message and exit
默認情況下,argparse 將提供的選項視為字符串。因此,如果參數不是字符串,則應使用 type 選項。使用 script_5.py 腳本,其中添加了兩個參數,這兩個參數是 int 類型:
import argparse parser = argparse.ArgumentParser() parser.add_argument("first_number", help="first number to be added", type=int) parser.add_argument("second_number", help="second number to be added", type=int) args = parser.parse_args() print("args: '{}'".format(args)) print("the sum is: '{}'".format(args.first_number + args.second_number)) args_dict = vars(parser.parse_args()) print("args_dict dictionary: '{}'".format(args_dict)) print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))
在前面的示例中,通過調用 vars() 函數將參數存儲在字典中:
args_dict = vars(parser.parse_args()) print("args_dict dictionary: '{}'".format(args_dict)) print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))
如果不帶參數執行腳本:
python script_5.py
則輸出如下:
usage: scripy_5.py [-h] first_number second_number
scripy_5.py: error: the following arguments are required: first_number, second_number
此外,如果我們使用 -h 選項執行腳本:
python script_5.py --help
輸出將如下所示:
usage: scripy_1.py [-h] first_number second_number
positional arguments:
? first_number ? first number to be added
? second_number ?second number to be addedoptional arguments:
? -h, --help ? ? show this help message and exit
如果此腳本以如下方式執行:
python script_5.py 123 456
則輸出如下:
args: 'Namespace(first_number=123, second_number=456)'
the sum is: '579'
args_dict dictionary: '{'first_number': 123, 'second_number': 456}'
first argument from the dictionary: '123'
更多 argparse 的高級介紹可以在官方文檔中看到,其中包括了大量示例。
總結
原文鏈接:https://blog.csdn.net/LOVEmy134611/article/details/119656854
相關推薦
- 2023-07-04 spring之BeanDefinition
- 2022-06-22 C++詳細分析引用的使用及其底層原理_C 語言
- 2022-08-30 MongoDB數據庫權限管理詳解_MongoDB
- 2022-10-03 Pandas中inf值替換的方法_python
- 2022-02-17 springBoot自定義場景啟動器starter
- 2022-06-11 C#實現DataTable轉TXT、CSV文件_C#教程
- 2022-04-28 Go語言單元測試超詳細解析_Golang
- 2022-12-10 C++?Boost?Spirit進階教程_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支