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='''\
第一行描述
第二行描述
縮進的內容'''
)
# 更緊湊的格式
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter
) # 會顯示參數(shù)的默認值三、位置參數(shù)和可選參數(shù)
argparse 模塊支持兩種主要類型的參數(shù):位置參數(shù)(positional arguments)和可選參數(shù)(optional arguments),它們在命令行中的使用方式和定義方法有所不同。
1. 位置參數(shù)
位置參數(shù)是必須提供的參數(shù),它們的順序很重要,名稱不需要在命令行中指定。
特點
必須提供:調用程序時必須指定
順序敏感:參數(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='輸入文件')
常用內置類型
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. 內置自動錯誤檢測
argparse 會自動處理以下常見錯誤情況。
參數(shù)缺失錯誤
# 當必需參數(shù)未提供時
parser.add_argument('required_arg', help='必需參數(shù)')
# 用戶未提供時會自動報錯
無效參數(shù)錯誤
# 當用戶提供了未定義的參數(shù)時 # 例如用戶輸入 --unknown 但未定義此參數(shù)
類型轉換錯誤
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ù)處理腳本需要輸入文件路徑
- 機器學習訓練腳本需要調整超參數(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)控制輸出質量 - 數(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ù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
從基礎方法到智能算法詳解Python查找文本錯別字的常見方法
在數(shù)字化內容爆炸的時代,錯別字不僅影響閱讀體驗,還可能造成信息誤解甚至經濟損失,本文將系統(tǒng)介紹Python中找出文本錯別字的多種方法,涵蓋從基礎規(guī)則到深度學習的全技術棧,有需要的小伙伴可以了解下2026-04-04
使用spyder3調試python程序的實現(xiàn)步驟
本文主要介紹了使用spyder3調試python程序的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12
python實現(xiàn)在函數(shù)中修改變量值的方法
今天小編就為大家分享一篇python實現(xiàn)在函數(shù)中修改變量值的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
分析Python中設計模式之Decorator裝飾器模式的要點
這篇文章主要介紹了Python中設計模式之Decorator裝飾器模式模式,文中詳細地講解了裝飾對象的相關加鎖問題,需要的朋友可以參考下2016-03-03

