構建?Python?命令行參數(shù)的?4?種常見方式
前言
大家好,在日常編寫 Python 腳本的過程中,我們經常需要結合命令行參數(shù)傳入一些變量參數(shù),使項目使用更加的靈活方便
它們分別是:
- 內置 sys.argv 模塊
- 內置 argparse 模塊
- 內置 getopt 模塊
- 第三方依賴庫 click
1. sys.argv
構建命令行參數(shù)最簡單、常見的方式是利用內置的「 sys.argv 」模塊
它是將參數(shù)以一個有序的列表傳入,所以在使用時傳參順序必須固定
因此,這種方式適用于參數(shù)個數(shù)少且場景固定的項目中
import sys if __name__ == '__main__': # 獲取參數(shù)列表 # 注意:sys.argv[0] 代表第一個參數(shù),即:腳本名稱「1_sys.argv.py」 # 其他參數(shù)列表 args = sys.argv[1:] # 參數(shù)個數(shù) args_length = len(sys.argv) if sys.argv else 0 print("排除運行主文件參數(shù),其他參數(shù)列表為:", args) print("參數(shù)總數(shù):", args_length) # 使用 # python3 1_sys.argv.py arg1 arg2 # 排除運行主文件參數(shù),其他參數(shù)列表為: [arg1, arg1] # 參數(shù)總數(shù):3
需要注意的是,在腳本中通過「 sys.argv 」獲取的參數(shù)列表中,第一個參數(shù)代表腳本主文件名稱
2. argparse
內置的 argparse 模塊可以非常輕松地編寫出友好的命令行參數(shù)腳本,并且它能自動生成幫助使用手冊,在用戶給程序傳入無效參數(shù)時能拋出清晰的錯誤信息
使用它構建命令行參數(shù)包含 3 個步驟
構建參數(shù)解析對象添加參數(shù)添加參數(shù)解析參數(shù)
構建命令行參數(shù)解析對象
import argparse ... # 構建一個命令行參數(shù)解析對象 parser = argparse.ArgumentParser(description='命令行參數(shù)') ...
添加命令行參數(shù):
需要指出的是,--arg1 用于指定參數(shù)名稱,-a1 代表 dest 目標變量值(簡寫)
... # 設置3個參數(shù) # 參數(shù)1:arg1,整型,非必須傳入?yún)?shù) # 參數(shù)2:arg2,字符串,非必須傳入?yún)?shù),包含默認值「xag」 # 參數(shù)3:arg3,字符串類型,必須傳入的參數(shù) parser.add_argument('--arg1', '-a1', type=int, help='參數(shù)1,非必須參數(shù)') parser.add_argument('--arg2', '-a2', type=str, help='參數(shù)2,非必須參數(shù),包含默認值', default='xag') parser.add_argument('--arg3', '-a3', type=str, help='參數(shù)3,必須參數(shù)', required=True) ...
解析出參數(shù)值:
... # 解析參數(shù),獲取所有的命令行參數(shù)(Namespace),然后轉為字典 args = vars(parser.parse_args()) # 獲取所有參數(shù) print("所有命令行參數(shù)為:") for key in args: print(f"命令行參數(shù)名:{key},參數(shù)值:{args[key]}") ...
使用的時候,我們就可以通過「 -h / --help 」命令參數(shù)查看幫助文檔
# 查看命令行參數(shù)幫助文檔 python3 2_argparse.py --help # 或 python3 2_argparse.py -h
上面添加的 3 個參數(shù),參數(shù) arg1、arg2 非必須傳值,arg3 必須傳值,另外參數(shù) arg2 指定了默認值
# 參數(shù)arg3必須,參數(shù)arg1和參數(shù)arg2非必須,其中參數(shù)arg2設置了默認值 # 傳入?yún)?shù)arg3 # python3 2_argparse.py --arg3 123 # python3 2_argparse.py -a3 123 xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a3 123 所有命令行參數(shù)為: 命令行參數(shù)名:arg1,參數(shù)值:None 命令行參數(shù)名:arg2,參數(shù)值:xag 命令行參數(shù)名:arg3,參數(shù)值:123 # 傳入?yún)?shù)arg1、arg3 xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111 -a3 123 所有命令行參數(shù)為: 命令行參數(shù)名:arg1,參數(shù)值:111 命令行參數(shù)名:arg2,參數(shù)值:xag 命令行參數(shù)名:arg3,參數(shù)值:123 # 傳入?yún)?shù)arg1、arg2、arg3 xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111 -a2 222 -a3 123 所有命令行參數(shù)為: 命令行參數(shù)名:arg1,參數(shù)值:111 命令行參數(shù)名:arg2,參數(shù)值:222 命令行參數(shù)名:arg3,參數(shù)值:123
3. getopt
getopt 是 Python 中一個內置標準模塊,可以結合 sys.argv 模塊,直接解析腳本運行時參數(shù)
使用格式:getopt(args,shortopts,longopts = [])
其中
args:參數(shù)列表,可以通過 sys.argv 獲取,可以參考上面
shortopts 短參數(shù)組成的字符串:定義短參數(shù),如果參數(shù)有值,需要在短參數(shù)后追加一個「 : 」符號
傳參使用方式:-n 23
longopts 長參數(shù)列表:定義長參數(shù)列表時,如果某個參數(shù)有值,需要在短參數(shù)后追加一個「 = 」符號
傳參使用方式:–port 8080
這里以傳入數(shù)據(jù)庫連接參數(shù)為例(參數(shù)包含 ip、用戶名、密碼、數(shù)據(jù)庫名稱)進行講解
from getopt import getopt import sys # 獲取參數(shù) # sys.argv[1:]:獲取除腳本文件名外的所有命令行參數(shù) # opts:存有所有選項及其輸入值的元組列表 # args:去除有用的輸入以后剩余的部分 opts, args = getopt(sys.argv[1:], 'i:u:p:d:', ['ip=', 'user=', 'pwd=', 'db=']) # 獲取參數(shù)值 # 短參數(shù) # python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb # 長參數(shù) # python3 4_getopt.py --ip 127.0.0.1 -u root -p 123456 -d mysqldb ip_pre = [item[1] for item in opts if item[0] in ('-i', '--ip')] ip = ip_pre[0] if len(ip_pre) > 0 else None print("參數(shù)ip:", ip) user_pre = [item[1] for item in opts if item[0] in ('-u', '--user')] user = user_pre[0] if len(user_pre) > 0 else None print("參數(shù)user:", user) pwd_pre = [item[1] for item in opts if item[0] in ('-p', '--pwd')] pwd = pwd_pre[0] if len(pwd_pre) > 0 else None print("參數(shù)pwd:", pwd) db_pre = [item[1] for item in opts if item[0] in ('-d', '--db')] db = db_pre[0] if len(db_pre) > 0 else None print("參數(shù)db:", db)
在運行腳本時,我們可以利用「 短參數(shù) 」或「 長參數(shù) 」形式進行傳遞
# 測試 # 短參數(shù) python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb # 長參數(shù) python3 4_getopt.py --ip 127.0.0.1 --user root --pwd 123456 --db mysqldb
4. click
click 作為第三方依賴庫,它為命令行工具封裝了大量的方法,可以非常方便實現(xiàn)命令行參數(shù)
首先,我們需要安裝依賴庫 click
import click # 安裝依賴 # pip3 install -U click @click.command() @click.option('--arg1', default='111', help='參數(shù)arg1,默認值為「111」') @click.option('--arg2', type=int, help='參數(shù)arg2') @click.option('--arg3', type=str, help='參數(shù)arg3') def start(arg1, arg2, arg3): """ 基于參數(shù)arg1、參數(shù)arg2、參數(shù)arg3運行項目 :param arg1: :param arg2: :param arg3: :return: """ print("參數(shù)arg1值為:", arg1) print("參數(shù)arg2值為:", arg2) print("參數(shù)arg3值為:", arg3) if __name__ == '__main__': start()
然后,在主運行函數(shù)上通過裝飾器配置參數(shù)即可
比如,上面就定義了 3 個命令行參數(shù) arg1、arg2、arg3,并設置了參數(shù)的類型及默認值
最后,在運行腳本時只需要按參數(shù)設定傳遞對應的值即可
# 不包含參數(shù) xingag@xingagdeMacBook-Pro args % python3 3_click.py 參數(shù)arg1值為: 111 參數(shù)arg2值為: None 參數(shù)arg3值為: None # 包含參數(shù)arg1 xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 參數(shù)arg1值為: test1 參數(shù)arg2值為: None 參數(shù)arg3值為: None # 包含參數(shù)arg1、arg2 # 注意:arg2的參數(shù)類型為整形,傳入的參數(shù)必須能轉為整形,否則會報錯 xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222 參數(shù)arg1值為: test1 參數(shù)arg2值為: 222 參數(shù)arg3值為: None # 包含參數(shù)arg1、arg2、arg3 xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222 --arg3 test3 參數(shù)arg1值為: test1 參數(shù)arg2值為: 222 參數(shù)arg3值為: test3
總結
上面通過實例講解了實現(xiàn) Python 命令行參數(shù)常見的 4 種方式:
對于一些簡單自用且不那么正規(guī)的場景,個人覺得可以考慮用 sys.argv 模塊快速構建命令行參數(shù);而對一些參數(shù)多、面向用戶的正式生產環(huán)境,建議利用 argparse 模塊或 click 依賴來創(chuàng)建命令行參數(shù)
到此這篇關于構建 Python 命令行參數(shù)的 4 種常見方式的文章就介紹到這了,更多相關Python命令行參數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python工廠模式實現(xiàn)封裝Webhook群聊機器人詳解
企業(yè)存在給 特定群組 自動推送消息的需求,你可以在群聊中添加一個自定義機器人,通過服務端調用 webhook 地址,即可將外部系統(tǒng)的通知消息即時推送到群聊中。本文就來和大家聊聊具體實現(xiàn)方法2023-02-02Python3.6實現(xiàn)帶有簡單界面的有道翻譯小程序
本文通過實例代碼給大家介紹了基于Python3.6實現(xiàn)帶有簡單界面的有道翻譯小程序,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2019-04-04