Python中argparse模塊命令行參數(shù)詳細解析
一、argparse的主要功能
argparse 是 Python 標準庫中用于解析命令行參數(shù)的模塊,主要包括:
- 自動生成幫助和使用信息
- 支持位置參數(shù)和可選參數(shù)
- 多種參數(shù)類型和驗證與子命令系統(tǒng)支持
- 自動錯誤處理
通過合理使用 argparse,可以輕松創(chuàng)建用戶友好的命令行工具,提高腳本的可用性和可維護性。
二、自動生成幫助和使用信息
Python 的 argparse 模塊能夠自動生成幫助和使用信息。
1. 基本用法
使用 argparse 創(chuàng)建解析器并添加參數(shù)后,它會自動處理 -h 或 --help 參數(shù)并顯示幫助信息:
import argparse # 創(chuàng)建解析器 parser = argparse.ArgumentParser(description='這是一個示例程序') # 添加參數(shù) parser.add_argument('filename', help='輸入文件名') parser.add_argument('-v', '--verbose', action='store_true', help='顯示詳細輸出') parser.add_argument('--output', help='輸出文件名') # 解析參數(shù) args = parser.parse_args()
運行這個腳本并加上 -h 或 --help 參數(shù):
python script.py -h
自動生成的幫助信息:
usage: script.py [-h] [-v] [--output OUTPUT] filename 這是一個示例程序 positional arguments: filename 輸入文件名 optional arguments: -h, --help show this help message and exit -v, --verbose 顯示詳細輸出 --output OUTPUT 輸出文件名
2. 自定義幫助信息
程序描述:通過 ArgumentParser 的 description 參數(shù)
parser = argparse.ArgumentParser(description='這是一個詳細的程序描述')
參數(shù)幫助:通過 add_argument 的 help 參數(shù)
parser.add_argument('--input', help='指定輸入文件路徑')
用法示例:通過 ArgumentParser 的 epilog 參數(shù)添加結尾文本
parser = argparse.ArgumentParser( description='程序描述', epilog='示例:\n python script.py input.txt --output result.txt' )
自定義幫助選項:通過 add_help 參數(shù)禁用默認幫助或自定義幫助選項
parser = argparse.ArgumentParser(add_help=False) # 禁用默認幫助 parser.add_argument('-?', action='help', help='顯示幫助信息') # 自定義幫助選項
3. 高級格式化
argparse 還允許通過 formatter_class 參數(shù)自定義幫助信息的格式:
# 保留空白字符和換行 parser = argparse.ArgumentParser( formatter_class=argparse.RawDescriptionHelpFormatter, description='''\ 第一行描述 第二行描述 縮進的內(nèi)容''' ) # 更緊湊的格式 parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter ) # 會顯示參數(shù)的默認值
三、位置參數(shù)和可選參數(shù)
argparse 模塊支持兩種主要類型的參數(shù):位置參數(shù)(positional arguments)和可選參數(shù)(optional arguments),它們在命令行中的使用方式和定義方法有所不同。
1. 位置參數(shù)
位置參數(shù)是必須提供的參數(shù),它們的順序很重要,名稱不需要在命令行中指定。
特點
必須提供:調(diào)用程序時必須指定
順序敏感:參數(shù)值的位置決定其含義
無前綴:不需要使用 - 或 – 前綴
定義方法
parser.add_argument('filename', help='輸入文件名') parser.add_argument('output_dir', help='輸出目錄')
使用示例
python script.py input.txt output/
input.txt 對應 filename 參數(shù)
output/ 對應 output_dir 參數(shù)
高級用法
# 接受多個值 parser.add_argument('files', nargs='+', help='一個或多個文件') # 固定數(shù)量參數(shù) parser.add_argument('coordinates', nargs=2, metavar=('X', 'Y'), help='X和Y坐標')
2. 可選參數(shù)
可選參數(shù)通常以 - 或 – 開頭,可以按任意順序提供。
特點
可選提供:可以省略(除非設置 required=True)
順序無關:可以任意順序指定
有前綴:使用 -(短參數(shù))或 --(長參數(shù))前綴
定義方法
parser.add_argument('-v', '--verbose', action='store_true', help='詳細輸出') parser.add_argument('-o', '--output', help='輸出文件路徑') parser.add_argument('--count', type=int, default=1, help='重復次數(shù)')
使用示例
python script.py --verbose -o result.txt # 或 python script.py -v --output=result.txt
3. 位置參數(shù)與可選參數(shù)對比
特性 | 位置參數(shù) | 可選參數(shù) |
---|---|---|
必要性 | 必須提供 | 可選(除非設置 required=True) |
前綴 | 無 | - 或 -- |
順序 | 重要 | 不重要 |
典型用途 | 主要輸入(如文件名) | 選項和標志 |
默認值 | 不常見 | 常見 |
多值支持 | 常見(nargs=‘+’) | 也支持 |
4. 混合使用示例
import argparse parser = argparse.ArgumentParser(description='文件處理工具') # 位置參數(shù) parser.add_argument('source', help='源文件路徑') parser.add_argument('destination', help='目標路徑') # 可選參數(shù) parser.add_argument('-c', '--copy', action='store_true', help='復制模式') parser.add_argument('-m', '--move', action='store_true', help='移動模式') parser.add_argument('--size', type=int, choices=[1, 2, 4], help='塊大小(1,2或4KB)') parser.add_argument('-v', '--verbose', action='count', default=0, help='輸出詳細程度(-v, -vv, -vvv)') args = parser.parse_args() print(f"源: {args.source}") print(f"目標: {args.destination}") print(f"模式: {'移動' if args.move else '復制'}") print(f"詳細級別: {args.verbose}")
四、多種參數(shù)類型和驗證和子命令系統(tǒng)
argparse 提供了多種參數(shù)類型和驗證機制,確保用戶輸入符合預期。
1. 基本參數(shù)類型
指定參數(shù)類型
使用 type 參數(shù)可以指定輸入值的類型:
parser.add_argument('--num', type=int, help='整數(shù)參數(shù)') parser.add_argument('--size', type=float, help='浮點數(shù)參數(shù)') parser.add_argument('--file', type=argparse.FileType('r'), help='輸入文件')
常用內(nèi)置類型
int: 整數(shù)
float: 浮點數(shù)
str: 字符串(默認)
argparse.FileType(‘r’/‘w’): 文件對象(自動打開)
2. 參數(shù)驗證
范圍驗證
通過自定義函數(shù)或結合 choices 實現(xiàn):
# 使用 choices 限制可選值 parser.add_argument('--color', choices=['red', 'green', 'blue'], help='顏色選擇') # 自定義驗證函數(shù) def check_positive(value): ivalue = int(value) if ivalue <= 0: raise argparse.ArgumentTypeError(f"{value} 必須是正數(shù)") return ivalue parser.add_argument('--positive', type=check_positive)
正則表達式驗證
import re def validate_email(email): if not re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', email): raise argparse.ArgumentTypeError(f"'{email}' 不是有效的郵箱地址") return email parser.add_argument('--email', type=validate_email)
3. 高級參數(shù)處理
列表參數(shù)
# 接收多個值 parser.add_argument('--nums', nargs='+', type=int, help='多個整數(shù)') # 固定數(shù)量參數(shù) parser.add_argument('--coords', nargs=2, metavar=('X', 'Y'), help='X Y 坐標')
布爾參數(shù)
# 開關型參數(shù) parser.add_argument('--enable', action='store_true', help='啟用功能') parser.add_argument('--disable', action='store_false', dest='enable', help='禁用功能') # 另一種方式 parser.add_argument('--flag', action=argparse.BooleanOptionalAction, help='布爾標志')
計數(shù)參數(shù)
parser.add_argument('-v', '--verbose', action='count', default=0, help='增加輸出詳細程度(如 -vvv)')
4. 參數(shù)組
互斥參數(shù)
group = parser.add_mutually_exclusive_group(required=True) group.add_argument('--create', action='store_true', help='創(chuàng)建模式') group.add_argument('--delete', action='store_true', help='刪除模式')
參數(shù)分組
parser = argparse.ArgumentParser() input_group = parser.add_argument_group('輸入選項') input_group.add_argument('--input-file', help='輸入文件') input_group.add_argument('--input-dir', help='輸入目錄') output_group = parser.add_argument_group('輸出選項') output_group.add_argument('--output-file', help='輸出文件')
5. 子命令
parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='command', required=True) # 創(chuàng)建子命令 parser_create = subparsers.add_parser('create', help='創(chuàng)建資源') parser_create.add_argument('name', help='資源名稱') # 刪除子命令 parser_delete = subparsers.add_parser('delete', help='刪除資源') parser_delete.add_argument('id', type=int, help='資源ID')
6. 默認值和必需參數(shù)
parser.add_argument('--port', type=int, default=8080, help='端口號(默認: 8080)') parser.add_argument('--username', required=True, help='必須指定用戶名')
7. 自定義參數(shù)處理
class PercentageAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): if not 0 <= values <= 100: raise argparse.ArgumentError(self, "必須在0-100之間") setattr(namespace, self.dest, values) parser.add_argument('--percent', type=int, action=PercentageAction, help='百分比(0-100)')
五、自動錯誤處理
argparse 模塊提供了自動錯誤處理功能,能夠檢測和報告用戶輸入中的各種問題。
1. 內(nèi)置自動錯誤檢測
argparse 會自動處理以下常見錯誤情況。
參數(shù)缺失錯誤
# 當必需參數(shù)未提供時 parser.add_argument('required_arg', help='必需參數(shù)') # 用戶未提供時會自動報錯
無效參數(shù)錯誤
# 當用戶提供了未定義的參數(shù)時 # 例如用戶輸入 --unknown 但未定義此參數(shù)
類型轉(zhuǎn)換錯誤
parser.add_argument('--num', type=int) # 用戶輸入非數(shù)字時會自動報錯:error: argument --num: invalid int value: 'abc'
參數(shù)值驗證錯誤
parser.add_argument('--size', choices=['S', 'M', 'L']) # 用戶輸入無效選項時會報錯
2. 自定義錯誤處理
方法1:自定義類型驗證函數(shù)
def positive_int(value): try: ivalue = int(value) if ivalue <= 0: raise argparse.ArgumentTypeError(f"{value} 必須是正整數(shù)") return ivalue except ValueError: raise argparse.ArgumentTypeError(f"'{value}' 不是有效整數(shù)") parser.add_argument('--count', type=positive_int)
方法2:自定義 Action 類
class RangeAction(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): if not 0 <= values <= 100: parser.error(f"{option_string} 必須在0到100之間") setattr(namespace, self.dest, values) parser.add_argument('--percent', type=int, action=RangeAction)
方法3:后解析驗證
def validate_args(args): if args.start > args.end: raise ValueError("開始值不能大于結束值") parser.add_argument('--start', type=int) parser.add_argument('--end', type=int) args = parser.parse_args() try: validate_args(args) except ValueError as e: parser.error(str(e))
3. 錯誤處理配置
自定義錯誤消息格式
parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter, epilog="遇到錯誤時請聯(lián)系支持團隊" )
控制退出行為
try: args = parser.parse_args() except argparse.ArgumentError as e: print(f"參數(shù)錯誤: {e}") parser.print_help() sys.exit(2) # Unix慣例: 2表示命令行用法錯誤
4. 錯誤處理技巧
顯示更友好的錯誤消息
try: args = parser.parse_args() except argparse.ArgumentTypeError as e: print(f"錯誤: {e}") print("請輸入 --help 查看用法") sys.exit(1)
收集所有錯誤而非立即退出
parser = argparse.ArgumentParser(exit_on_error=False) try: args = parser.parse_args() except argparse.ArgumentError as e: errors.append(str(e))
5. 錯誤處理總結
- 提供清晰的錯誤消息:確保錯誤信息能指導用戶正確使用
- 一致性:保持錯誤格式一致,便于用戶理解
- 防御性編程:對關鍵參數(shù)進行額外驗證
- 適當退出代碼:使用標準退出代碼(如2表示用法錯誤)
- 記錄錯誤:對于復雜應用,考慮記錄錯誤日志
六、應用與實踐
1. 需要用戶輸入?yún)?shù)的腳本
當 Python 腳本需要接收外部輸入(如文件路徑、配置選項、運行模式等)時,argparse
可以方便地解析命令行參數(shù),而不是硬編碼在代碼中。
示例場景
- 數(shù)據(jù)處理腳本需要輸入文件路徑
- 機器學習訓練腳本需要調(diào)整超參數(shù)(如學習率、批次大?。?/li>
- 日志分析工具需要指定時間范圍或過濾條件
示例代碼
import argparse parser = argparse.ArgumentParser(description="處理CSV文件") parser.add_argument("input_file", help="輸入CSV文件路徑") parser.add_argument("--output", "-o", help="輸出文件路徑(可選)") parser.add_argument("--delimiter", default=",", help="分隔符(默認:逗號)") args = parser.parse_args() print(f"處理文件: {args.input_file}") if args.output: print(f"輸出到: {args.output}") print(f"分隔符: {args.delimiter}")
2. 需要支持可選參數(shù)和默認值的腳本
如果你的腳本有些參數(shù)是可選的,并且需要默認值,argparse
可以輕松管理這些參數(shù)。
示例場景
- 爬蟲腳本可以設置
--delay
(默認 1 秒)控制請求間隔 - 圖像處理腳本可以設置
--quality
(默認 90)控制輸出質(zhì)量 - 數(shù)據(jù)庫備份腳本可以設置
--compress
(默認True
)控制是否壓縮
示例代碼
import argparse parser = argparse.ArgumentParser(description="爬蟲腳本") parser.add_argument("--delay", type=float, default=1.0, help="請求間隔(秒)") parser.add_argument("--max-pages", type=int, default=10, help="最大爬取頁數(shù)") parser.add_argument("--headless", action="store_true", help="是否使用無頭模式") args = parser.parse_args() print(f"請求間隔: {args.delay} 秒") print(f"最大爬取頁數(shù): {args.max_pages}") if args.headless: print("使用無頭模式")
3. 需要子命令的 CLI 工具(類似git)
如果你的工具支持多個子命令(如 git commit
、git push
),argparse
的 subparsers
功能可以很好地組織代碼。
示例場景
- 版本控制工具(類似
git
) - 數(shù)據(jù)庫管理工具(
db backup
、db restore
) - 系統(tǒng)管理工具(
system start
、system stop
)
示例代碼
import argparse parser = argparse.ArgumentParser(description="數(shù)據(jù)庫管理工具") subparsers = parser.add_subparsers(dest="command", required=True) # 子命令:backup backup_parser = subparsers.add_parser("backup", help="備份數(shù)據(jù)庫") backup_parser.add_argument("--output", required=True, help="備份文件路徑") backup_parser.add_argument("--compress", action="store_true", help="是否壓縮") # 子命令:restore restore_parser = subparsers.add_parser("restore", help="恢復數(shù)據(jù)庫") restore_parser.add_argument("input", help="備份文件路徑") args = parser.parse_args() if args.command == "backup": print(f"備份數(shù)據(jù)庫到: {args.output}") if args.compress: print("啟用壓縮") elif args.command == "restore": print(f"從 {args.input} 恢復數(shù)據(jù)庫")
4. 需要自動生成幫助文檔(--help)
argparse
自動生成 --help
信息,用戶無需手動編寫幫助文本。
示例代碼:
import argparse parser = argparse.ArgumentParser(description="一個示例程序") parser.add_argument("input", help="輸入文件") parser.add_argument("--output", "-o", help="輸出文件") parser.add_argument("--verbose", "-v", action="store_true", help="顯示詳細日志") args = parser.parse_args()
運行 python script.py --help
會輸出:
usage: script.py [-h] [--output OUTPUT] [--verbose] input 一個示例程序 positional arguments: input 輸入文件 optional arguments: -h, --help show this help message and exit --output OUTPUT, -o OUTPUT 輸出文件 --verbose, -v 顯示詳細日志
5. 需要參數(shù)類型檢查和錯誤提示
argparse
可以自動檢查參數(shù)類型(如 int
、float
),并提示錯誤。
示例場景:
- 如果用戶輸入
--count abc
(期望是整數(shù)),argparse
會報錯 - 如果用戶輸入
--mode fast
,但choices=["slow", "medium"]
,會提示無效選項
示例代碼
import argparse parser = argparse.ArgumentParser() parser.add_argument("--count", type=int, help="必須輸入整數(shù)") parser.add_argument("--mode", choices=["slow", "medium", "fast"], default="medium") args = parser.parse_args() print(f"Count: {args.count}") print(f"Mode: {args.mode}")
如果用戶輸入 --count abc
,會報錯:
error: argument --count: invalid int value: 'abc'
6. 替代sys.argv手動解析
如果你之前用 sys.argv
手動解析參數(shù),argparse
可以更優(yōu)雅地處理復雜參數(shù)。
sys.argv
手動解析(不推薦)
import sys if len(sys.argv) < 2: print("Usage: script.py <input> [--output OUTPUT]") sys.exit(1) input_file = sys.argv[1] output_file = None if "--output" in sys.argv: output_index = sys.argv.index("--output") + 1 if output_index < len(sys.argv): output_file = sys.argv[output_index] print(f"Input: {input_file}") if output_file: print(f"Output: {output_file}")
argparse
解析(推薦)
import argparse parser = argparse.ArgumentParser() parser.add_argument("input", help="輸入文件") parser.add_argument("--output", "-o", help="輸出文件") args = parser.parse_args() print(f"Input: {args.input}") if args.output: print(f"Output: {args.output}")
到此這篇關于Python中argparse模塊命令行參數(shù)解析介紹的文章就介紹到這了,更多相關Python argparse命令行參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)內(nèi)網(wǎng)穿透和端口轉(zhuǎn)發(fā)代理詳解
這篇文章主要為大家介紹了Python實現(xiàn)內(nèi)網(wǎng)穿透和端口轉(zhuǎn)發(fā)代理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Python?numpy下幾種fft函數(shù)的使用方式
numpy中有一個fft的庫,scipy中也有一個fftpack的庫,各自都有fft函數(shù),兩者的用法基本是一致的,下面這篇文章主要給大家介紹了關于Python?numpy下幾種fft函數(shù)的使用方式,需要的朋友可以參考下2022-08-08