網站首頁 編程語言 正文
前言? ??
大家好,在日常編寫 Python 腳本的過程中,我們經常需要結合命令行參數傳入一些變量參數,使項目使用更加的靈活方便
它們分別是:
- 內置 sys.argv 模塊
- 內置 argparse 模塊
- 內置 getopt 模塊
- 第三方依賴庫 click
1. sys.argv
構建命令行參數最簡單、常見的方式是利用內置的「 sys.argv 」模塊
它是將參數以一個有序的列表傳入,所以在使用時傳參順序必須固定
因此,這種方式適用于參數個數少且場景固定的項目中
import sys
if __name__ == '__main__':
# 獲取參數列表
# 注意:sys.argv[0] 代表第一個參數,即:腳本名稱「1_sys.argv.py」
# 其他參數列表
args = sys.argv[1:]
# 參數個數
args_length = len(sys.argv) if sys.argv else 0
print("排除運行主文件參數,其他參數列表為:", args)
print("參數總數:", args_length)
# 使用
# python3 1_sys.argv.py arg1 arg2
# 排除運行主文件參數,其他參數列表為: [arg1, arg1]
# 參數總數:3
需要注意的是,在腳本中通過「 sys.argv 」獲取的參數列表中,第一個參數代表腳本主文件名稱
2. argparse
內置的 argparse 模塊可以非常輕松地編寫出友好的命令行參數腳本,并且它能自動生成幫助使用手冊,在用戶給程序傳入無效參數時能拋出清晰的錯誤信息
官方文檔:
使用它構建命令行參數包含 3 個步驟
構建參數解析對象添加參數添加參數解析參數
構建命令行參數解析對象
import argparse
...
# 構建一個命令行參數解析對象
parser = argparse.ArgumentParser(description='命令行參數')
...
添加命令行參數:
需要指出的是,--arg1 用于指定參數名稱,-a1 代表 dest 目標變量值(簡寫)
...
# 設置3個參數
# 參數1:arg1,整型,非必須傳入參數
# 參數2:arg2,字符串,非必須傳入參數,包含默認值「xag」
# 參數3:arg3,字符串類型,必須傳入的參數
parser.add_argument('--arg1', '-a1', type=int, help='參數1,非必須參數')
parser.add_argument('--arg2', '-a2', type=str, help='參數2,非必須參數,包含默認值', default='xag')
parser.add_argument('--arg3', '-a3', type=str, help='參數3,必須參數', required=True)
...
解析出參數值:
...
# 解析參數,獲取所有的命令行參數(Namespace),然后轉為字典
args = vars(parser.parse_args())
# 獲取所有參數
print("所有命令行參數為:")
for key in args:
print(f"命令行參數名:{key},參數值:{args[key]}")
...
使用的時候,我們就可以通過「 -h / --help 」命令參數查看幫助文檔
# 查看命令行參數幫助文檔
python3 2_argparse.py --help
# 或
python3 2_argparse.py -h
上面添加的 3 個參數,參數 arg1、arg2 非必須傳值,arg3 必須傳值,另外參數 arg2 指定了默認值
# 參數arg3必須,參數arg1和參數arg2非必須,其中參數arg2設置了默認值
# 傳入參數arg3
# python3 2_argparse.py --arg3 123
# python3 2_argparse.py -a3 123
xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a3 123
所有命令行參數為:
命令行參數名:arg1,參數值:None
命令行參數名:arg2,參數值:xag
命令行參數名:arg3,參數值:123
# 傳入參數arg1、arg3
xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111 -a3 123
所有命令行參數為:
命令行參數名:arg1,參數值:111
命令行參數名:arg2,參數值:xag
命令行參數名:arg3,參數值:123
# 傳入參數arg1、arg2、arg3
xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111 -a2 222 -a3 123
所有命令行參數為:
命令行參數名:arg1,參數值:111
命令行參數名:arg2,參數值:222
命令行參數名:arg3,參數值:123
3. getopt
getopt 是 Python 中一個內置標準模塊,可以結合 sys.argv 模塊,直接解析腳本運行時參數
使用格式:getopt(args,shortopts,longopts = [])
其中
args:參數列表,可以通過 sys.argv 獲取,可以參考上面
shortopts 短參數組成的字符串:定義短參數,如果參數有值,需要在短參數后追加一個「 : 」符號
傳參使用方式:-n 23
longopts 長參數列表:定義長參數列表時,如果某個參數有值,需要在短參數后追加一個「 = 」符號
傳參使用方式:–port 8080
這里以傳入數據庫連接參數為例(參數包含 ip、用戶名、密碼、數據庫名稱)進行講解
from getopt import getopt
import sys
# 獲取參數
# sys.argv[1:]:獲取除腳本文件名外的所有命令行參數
# opts:存有所有選項及其輸入值的元組列表
# args:去除有用的輸入以后剩余的部分
opts, args = getopt(sys.argv[1:], 'i:u:p:d:', ['ip=', 'user=', 'pwd=', 'db='])
# 獲取參數值
# 短參數
# python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb
# 長參數
# 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("參數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("參數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("參數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("參數db:", db)
在運行腳本時,我們可以利用「 短參數 」或「 長參數 」形式進行傳遞
# 測試
# 短參數
python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb
# 長參數
python3 4_getopt.py --ip 127.0.0.1 --user root --pwd 123456 --db mysqldb
4. click
click 作為第三方依賴庫,它為命令行工具封裝了大量的方法,可以非常方便實現命令行參數
項目地址
首先,我們需要安裝依賴庫 click
import click
# 安裝依賴
# pip3 install -U click
@click.command()
@click.option('--arg1', default='111', help='參數arg1,默認值為「111」')
@click.option('--arg2', type=int, help='參數arg2')
@click.option('--arg3', type=str, help='參數arg3')
def start(arg1, arg2, arg3):
"""
基于參數arg1、參數arg2、參數arg3運行項目
:param arg1:
:param arg2:
:param arg3:
:return:
"""
print("參數arg1值為:", arg1)
print("參數arg2值為:", arg2)
print("參數arg3值為:", arg3)
if __name__ == '__main__':
start()
然后,在主運行函數上通過裝飾器配置參數即可
比如,上面就定義了 3 個命令行參數 arg1、arg2、arg3,并設置了參數的類型及默認值
最后,在運行腳本時只需要按參數設定傳遞對應的值即可
# 不包含參數
xingag@xingagdeMacBook-Pro args % python3 3_click.py
參數arg1值為: 111
參數arg2值為: None
參數arg3值為: None
# 包含參數arg1
xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1
參數arg1值為: test1
參數arg2值為: None
參數arg3值為: None
# 包含參數arg1、arg2
# 注意:arg2的參數類型為整形,傳入的參數必須能轉為整形,否則會報錯
xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222
參數arg1值為: test1
參數arg2值為: 222
參數arg3值為: None
# 包含參數arg1、arg2、arg3
xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222 --arg3 test3
參數arg1值為: test1
參數arg2值為: 222
參數arg3值為: test3
總結
上面通過實例講解了實現 Python 命令行參數常見的 4 種方式:
對于一些簡單自用且不那么正規的場景,個人覺得可以考慮用 sys.argv 模塊快速構建命令行參數;而對一些參數多、面向用戶的正式生產環境,建議利用 argparse 模塊或 click 依賴來創建命令行參數
原文鏈接:https://blog.csdn.net/weixin_38037405/article/details/125475841
相關推薦
- 2022-11-24 詳解Linux中atime,mtime,ctime的使用場景_linux shell
- 2022-06-02 C#生成帶注釋的dll并引用實現_C#教程
- 2022-08-21 利用Python制作本地Excel的查詢與生成的程序問題_python
- 2024-03-22 【IDEA】Spring boot項目設置網站圖標favicon不生效
- 2023-03-22 Linux?rm命令詳解?Linux刪除文件目錄的操作方法_linux shell
- 2022-04-01 17條提高工作效率的Python技巧分享_python
- 2022-08-11 Python處理文本數據的方法詳解_python
- 2022-06-20 elasticsearch索引index之merge底層機制的合并講解_相關技巧
- 最近更新
-
- 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同步修改后的遠程分支