最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python標(biāo)準(zhǔn)庫argparse解析命令行參數(shù)使用詳細(xì)介紹

 更新時間:2026年06月01日 09:10:05   作者:花酒鋤作田  
本文詳細(xì)介紹了argparse模塊在Python中的應(yīng)用,包括action參數(shù)的使用方法、互斥參數(shù)的創(chuàng)建以及子命令的處理,通過示例代碼展示了如何為命令行工具添加子命令并綁定處理函數(shù),簡化復(fù)雜邏輯,感興趣的朋友跟隨小編一起看看吧

前言

argparse 是python標(biāo)準(zhǔn)庫中用于解析命令行參數(shù)的模塊。

基本使用

import argparse
# 創(chuàng)建解析器
## description: 程序說明
## prog: 程序名, 默認(rèn)為腳本名
## epilog: 幫助信息末尾附加文本
## formatter_class: 控制幫助信息的展示樣式
parser = argparse.ArgumentParser(
    prog="/my_tool",
    description="A simple command-line tool.",
    epilog="Example usage: /my_tool 'Hello World' --verbose"
)
# 使用add_argument() 添加參數(shù)
# echo1和echo2為位置參數(shù),使用時必需按順序提供
# type 指定類型轉(zhuǎn)換函數(shù)
# help 設(shè)置幫助說明
parser.add_argument("echo1", type=str, help="echo something")
parser.add_argument("echo2", type=str, help="echo something")
# -x 或 --xx 為可選參數(shù)
# default 設(shè)置默認(rèn)值
parser.add_argument("--sftp_ip",type=str,default="127.0.0.1", help="sftp服務(wù)的IP地址")
# 自動轉(zhuǎn)換類型成int
# metavar 修改幫助信息中顯示的占位名
parser.add_argument("--sftp_port", metavar="PORT", type=int, default="22")
# dest 指定解析后屬性名, 解析后使用 args.username 訪問
parser.add_argument("--user-name", dest="username")
# required 讓可選參數(shù)變成必須提供
# required 只適用于可選參數(shù)
parser.add_argument("--name", required=True)
# choice 限制可選值范圍
parser.add_argument("-H","--host",type=str, choices=["127.0.0.1", "192.168.0.10"])
# nargs 控制參數(shù)個數(shù)
## nargs=2, 必須 2 個參數(shù)
## nargs='*', 0個或多個參數(shù)
## nargs='+', 1個或多個參數(shù)
## nargs='?', 0個或1個參數(shù)
parser.add_argument('--nums', nargs=3, type=int)
# 創(chuàng)建互斥組,-v和-q不能同時使用
group = parser.add_mutually_exclusive_group()
# action 定義參數(shù)行為
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
# 解析參數(shù)
# 返回的是一個 Namespace 對象
args = parser.parse_args()
# 使用命令參數(shù)
print(f"echo1: {args.echo1}, echo2: {args.echo2}")
print(f"sftp服務(wù)的IP為: {args.sftp_ip}, 端口號: {args.sftp_port}")
print(f"host is {args.host}")

argparse會自動生成幫助選項-h--help。

action參數(shù)

add_argument() 中的 action 參數(shù)用來定義參數(shù)行為。默認(rèn)值為store.

  • action='store_true', 常用于布爾開關(guān), 不傳則為 False
parser.add_argument('--verbose', action='store_true')
# 運行 python app.py --verbose
# 解析后
args.verbose == True
  • action='store_false', 反向布爾開關(guān)
  • action='append', 每出現(xiàn)一次就追加到列表
parser.add_argument('--tag', action='append')
# 使用
python app.py --tag a --tag b
# 得到
args.tag == ['a', 'b']
  • action='count', 統(tǒng)計出現(xiàn)次數(shù)
parser.add_argument('-v', '--verbose', action='count', default=0)
# 使用
python app.py -vvv
# 得到
args.verbose == 3
  • action='version', 打印版本
parser.add_argument('--version', action='version', version='v1.0.0', default=0)
# 使用
python app.py --version
# 輸出 v1.0.0
# 也可以寫個函數(shù)來動態(tài)獲取
def get_version() -> str:
    return "v1.0.0"
# help 不傳的話默認(rèn)為 show program's version number and exit
parser.add_argument(
    "--version",
    action="version",
    version=get_version(),
    # help="Show the version of the tool and exit.",
)
  • action='store_const', 設(shè)置為指定值
parser.add_argument('--json', action='store_const', const='json', dest='format')
# 運行
python app.py --json
# 得到
args.format == 'json'

互斥參數(shù)

創(chuàng)建互斥組:group = parser.add_mutually_exclusive_group()

使用group.add_argument設(shè)置的命令行選項將互斥,不能同時使用

簡單例子:

import argparse
parser = argparse.ArgumentParser()
# 創(chuàng)建互斥組
# 傳入 required=True 的話,用戶必須從互斥組參數(shù)中選一個; 默認(rèn)用戶可以不選可選組參數(shù)
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true')
group.add_argument('--quiet', action='store_true')
args = parser.parse_args()
print(args)
# 這樣同時調(diào)用會報錯
python app.py --verbose --quiet

子命令

當(dāng)命令行工具包含多種操作時可能就會需要子命令了,例如:

python tool.py add user1
python tool.py delete user1
python tool.py list

這里add, delete, list 都是子命令, 這時候最適合用 parser.add_subparsers()

add_subparsers() 用來給一個命令行程序添加多個子解析器(subparsers),每個子解析器對應(yīng)一個子命令。

基本用法

import argparse
parser = argparse.ArgumentParser(prog='usercli', description='用戶管理工具')
# required=True, 強制用戶使用子命令
# 建議總是顯式寫 dest='command'
subparsers = parser.add_subparsers(dest='command', required=True)
# add 子命令
parser_add = subparsers.add_parser('add', help='添加用戶')
parser_add.add_argument('username', help='用戶名')
parser_add.add_argument('--age', type=int, default=18, help='年齡')
# delete 子命令
parser_delete = subparsers.add_parser('delete', help='刪除用戶')
parser_delete.add_argument('username', help='用戶名')
# list 子命令
parser_list = subparsers.add_parser('list', help='列出用戶')
parser_list.add_argument('--verbose', action='store_true', help='顯示詳細(xì)信息')
args = parser.parse_args()
if args.command == 'add':
    print(f'添加用戶: {args.username}, 年齡: {args.age}')
elif args.command == 'delete':
    print(f'刪除用戶: {args.username}')
elif args.command == 'list':
    print(f'列出用戶, verbose={args.verbose}')

子命令綁定處理函數(shù)

上面基本用法中用if/elif 來分發(fā)邏輯,簡單場景下還湊合,但是當(dāng)命令多,功能復(fù)雜時,代碼會顯得非?;靵y,這種情況下就可以為子命令綁定處理函數(shù)。

示例代碼:

import argparse
def handle_add(args):
    print(f'添加用戶: {args.username}, 年齡: {args.age}')
def handle_delete(args):
    print(f'刪除用戶: {args.username}')
def handle_list(args):
    print(f'列出用戶, verbose={args.verbose}')
def create_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(prog='usercli')
    subparsers = parser.add_subparsers(dest='command', required=True)
    parser_add = subparsers.add_parser('add', help='添加用戶')
    parser_add.add_argument('username')
    parser_add.add_argument('--age', type=int, default=18)
    parser_add.set_defaults(func=handle_add)
    parser_delete = subparsers.add_parser('delete', help='刪除用戶')
    parser_delete.add_argument('username')
    parser_delete.set_defaults(func=handle_delete)
    parser_list = subparsers.add_parser('list', help='列出用戶')
    parser_list.add_argument('--verbose', action='store_true')
    parser_list.set_defaults(func=handle_list)
    return parser
def main() -> None:
    parser = create_parser()
    args = parser.parse_args()
    # 如果用了 args.func(args)
    # 一定要確保每個子命令都執(zhí)行了 parser_xxx.set_defaults(func=...)
    # 否則報錯: AttributeError: 'Namespace' object has no attribute 'func'
    args.func(args)
if __name__ == "__main__":
    main()

子命令共享公共參數(shù)

如果多個子命令都需要同一組參數(shù),可以抽一個“父解析器”。

import argparse
def main():
    common_parser = argparse.ArgumentParser(add_help=False)
    common_parser.add_argument('--config', help='配置文件路徑')
    parser = argparse.ArgumentParser(prog='tool')
    subparsers = parser.add_subparsers(dest='command', required=True)
    parser_a = subparsers.add_parser('start', parents=[common_parser])
    parser_a.add_argument('--port', type=int)
    parser_b = subparsers.add_parser('stop', parents=[common_parser])
    parser_b.add_argument('--force', action='store_true')
    # 解析命令行參數(shù)
    # common_parser 是一個共享參數(shù)模板, 不需要參與參數(shù)解析
    args = parser.parse_args()
    if args.command == 'start':
        print(f"Starting with config: {args.config} on port: {args.port}")
    elif args.command == 'stop':
        print(f"Stopping with config: {args.config} {'forcefully' if args.force else ''}")
    else:
        print("Unknown command")
if __name__ == "__main__":
    main()

子命令設(shè)置別名

parser_remove = subparsers.add_parser('remove', aliases=['rm'])

這樣兩種命令都可以

python tool.py remove file.txt
python tool.py rm file.txt

嵌套子命令

復(fù)雜 CLI 可能有多級命令,比如:

tool user add alice
tool user delete bob

可以嵌套 add_subparsers()

import argparse
parser = argparse.ArgumentParser(prog='tool')
subparsers = parser.add_subparsers(dest='entity', required=True)
user_parser = subparsers.add_parser('user')
user_subparsers = user_parser.add_subparsers(dest='action', required=True)
user_add = user_subparsers.add_parser('add')
user_add.add_argument('name')
user_delete = user_subparsers.add_parser('delete')
user_delete.add_argument('name')
args = parser.parse_args()
print(args)

運行:

python tool.py user add alice

得到:

Namespace(entity='user', action='add', name='alice')

到此這篇關(guān)于Python標(biāo)準(zhǔn)庫argparse解析命令行參數(shù)使用詳細(xì)介紹的文章就介紹到這了,更多相關(guān)python argparse解析命令行參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 通過python順序修改文件名字的方法

    通過python順序修改文件名字的方法

    今天小編就為大家分享一篇通過python順序修改文件名字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 一文輕松掌握python語言命名規(guī)范規(guī)則

    一文輕松掌握python語言命名規(guī)范規(guī)則

    這篇文章主要介紹了一文輕松掌握python語言命名規(guī)范規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • python實現(xiàn)H2O中的隨機森林算法介紹及其項目實戰(zhàn)

    python實現(xiàn)H2O中的隨機森林算法介紹及其項目實戰(zhàn)

    這篇文章主要介紹了python實現(xiàn)H2O中的隨機森林算法介紹及其項目實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 如何真正的了解python裝飾器

    如何真正的了解python裝飾器

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于如何真正的了解python裝飾器的相關(guān)文章,需要的朋友們可以參考下。
    2020-08-08
  • Python+MongoDB自增鍵值的簡單實現(xiàn)

    Python+MongoDB自增鍵值的簡單實現(xiàn)

    下面小編就為大家?guī)硪黄狿ython+MongoDB自增鍵值的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 用python繪制極坐標(biāo)雷達圖

    用python繪制極坐標(biāo)雷達圖

    大家好,本篇文章主要講的是用python繪制極坐標(biāo)雷達圖,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 利用pyproj將經(jīng)緯度投影為平面坐標(biāo)以及地理坐標(biāo)系背景知識解讀

    利用pyproj將經(jīng)緯度投影為平面坐標(biāo)以及地理坐標(biāo)系背景知識解讀

    這篇文章主要介紹了利用pyproj將經(jīng)緯度投影為平面坐標(biāo)以及地理坐標(biāo)系背景知識解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python實現(xiàn)楊輝三角思路

    python實現(xiàn)楊輝三角思路

    本文給大家分享的是作者使用python實現(xiàn)楊輝三角的思路,非常的實用,有需要的小伙伴可以參考下
    2017-07-07
  • Python設(shè)計模式之單例模式實例

    Python設(shè)計模式之單例模式實例

    這篇文章主要介紹了設(shè)計模式中的單例模式Python實例,需要的朋友可以參考下
    2014-04-04
  • 一文掌握Python函數(shù)進階:參數(shù)類型與返回值

    一文掌握Python函數(shù)進階:參數(shù)類型與返回值

    本文介紹了Python函數(shù)的五種參數(shù)類型,包括位置參數(shù)、默認(rèn)參數(shù)、可變位置參數(shù)、關(guān)鍵字參數(shù)和可變關(guān)鍵字參數(shù),以及它們的應(yīng)用場景和傳遞細(xì)節(jié),本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2026-05-05

最新評論

那坡县| 金华市| 宿迁市| 民丰县| 连江县| 宝山区| 邯郸市| 黄平县| 巨野县| 玉林市| 冷水江市| 万年县| 萍乡市| 昌吉市| 伊春市| 塘沽区| 普兰店市| 英吉沙县| 安溪县| 时尚| 察雅县| 文昌市| 静海县| 玛曲县| 大埔县| 新田县| 介休市| 乃东县| 镇赉县| 古蔺县| 师宗县| 贡嘎县| 云梦县| 南宫市| 鹤山市| 南安市| 和林格尔县| 岳普湖县| 新巴尔虎右旗| 玛纳斯县| 阜南县|