最全總結(jié) | 聊聊 Python 命令行參數(shù)化的幾種方式!

1. 前言

大家好,我是安果!

在日常編寫 Python 腳本的過程中,我們經(jīng)常需要結(jié)合命令行參數(shù)傳入一些變量參數(shù),使項目使用更加的靈活方便

本篇文章我將羅列出構(gòu)建 Python 命令行參數(shù)的 4 種常見方式

它們分別是:

  • 內(nèi)置 sys.argv 模塊

  • 內(nèi)置 argparse 模塊

  • 內(nèi)置 getopt 模塊

  • 第三方依賴庫 click

2. sys.argv

構(gòu)建命令行參數(shù)最簡單、常見的方式是利用內(nèi)置的「 sys.argv 」模塊

它是將參數(shù)以一個有序的列表傳入,所以在使用時傳參順序必須固定

因此,這種方式適用于參數(shù)個數(shù)少且場景固定的項目中

  1. import sys
  2. if __name__ == '__main__':
  3.     # 獲取參數(shù)列表
  4.     # 注意:sys.argv[0] 代表第一個參數(shù),即:腳本名稱「1_sys.argv.py」
  5.     # 其他參數(shù)列表
  6.     args = sys.argv[1:]
  7.     # 參數(shù)個數(shù)
  8.     args_length = len(sys.argv) if sys.argv else 0
  9.     print("排除運(yùn)行主文件參數(shù),其他參數(shù)列表為:", args)
  10.     print("參數(shù)總數(shù):", args_length)
  11. # 使用
  12. # python3 1_sys.argv.py arg1 arg2
  13. # 排除運(yùn)行主文件參數(shù),其他參數(shù)列表為: [arg1, arg1]
  14. # 參數(shù)總數(shù):3

需要注意的是,在腳本中通過「 sys.argv 」獲取的參數(shù)列表中,第一個參數(shù)代表腳本主文件名稱

3. argparse

內(nèi)置的 argparse 模塊可以非常輕松地編寫出友好的命令行參數(shù)腳本,并且它能自動生成幫助使用手冊,在用戶給程序傳入無效參數(shù)時能拋出清晰的錯誤信息

官方文檔:

https://docs.python.org/zh-cn/3.10/library/argparse.html

使用它構(gòu)建命令行參數(shù)包含 3 個步驟:

  • 構(gòu)建參數(shù)解析對象添加參數(shù)

  • 添加參數(shù)

  • 解析參數(shù)

3-1  構(gòu)建命令行參數(shù)解析對象
  1. import argparse
  2. ...
  3. # 構(gòu)建一個命令行參數(shù)解析對象
  4. parser = argparse.ArgumentParser(description='命令行參數(shù)')
  5. ...
3-2  添加命令行參數(shù)
需要指出的是,--arg1 用于指定參數(shù)名稱,-a1 代表 dest 目標(biāo)變量值(簡寫)
  1. ...
  2. # 設(shè)置3個參數(shù)
  3. # 參數(shù)1:arg1,整型,非必須傳入?yún)?shù)
  4. # 參數(shù)2:arg2,字符串,非必須傳入?yún)?shù),包含默認(rèn)值「xag」
  5. # 參數(shù)3:arg3,字符串類型,必須傳入的參數(shù)
  6. parser.add_argument('--arg1''-a1'type=int, help='參數(shù)1,非必須參數(shù)')
  7. parser.add_argument('--arg2''-a2'type=str, help='參數(shù)2,非必須參數(shù),包含默認(rèn)值'default='xag')
  8. parser.add_argument('--arg3''-a3'type=str, help='參數(shù)3,必須參數(shù)', required=True)
  9. ...
3-3  解析出參數(shù)值
  1. ...
  2. # 解析參數(shù),獲取所有的命令行參數(shù)(Namespace),然后轉(zhuǎn)為字典
  3. args = vars(parser.parse_args())
  4. # 獲取所有參數(shù)
  5. print("所有命令行參數(shù)為:")
  6. for key in args:
  7.     print(f"命令行參數(shù)名:{key},參數(shù)值:{args[key]}")
  8. ...
使用的時候,我們就可以通過「 -h / --help 」命令參數(shù)查看幫助文檔
  1. # 查看命令行參數(shù)幫助文檔
  2. python3 2_argparse.py --help
  3. # 或
  4. python3 2_argparse.py -h

上面添加的 3 個參數(shù),參數(shù) arg1、arg2 非必須傳值,arg3 必須傳值,另外參數(shù) arg2 指定了默認(rèn)值

  1. # 參數(shù)arg3必須,參數(shù)arg1和參數(shù)arg2非必須,其中參數(shù)arg2設(shè)置了默認(rèn)值
  2. # 傳入?yún)?shù)arg3
  3. # python3 2_argparse.py --arg3 123
  4. # python3 2_argparse.py -a3 123 
  5. xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a3 123  
  6. 所有命令行參數(shù)為:
  7. 命令行參數(shù)名:arg1,參數(shù)值:None
  8. 命令行參數(shù)名:arg2,參數(shù)值:xag
  9. 命令行參數(shù)名:arg3,參數(shù)值:123
  10. # 傳入?yún)?shù)arg1、arg3
  11. xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111  -a3 123  
  12. 所有命令行參數(shù)為:
  13. 命令行參數(shù)名:arg1,參數(shù)值:111
  14. 命令行參數(shù)名:arg2,參數(shù)值:xag
  15. 命令行參數(shù)名:arg3,參數(shù)值:123
  16. # 傳入?yún)?shù)arg1、arg2、arg3
  17. xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111 -a2 222  -a3 123
  18. 所有命令行參數(shù)為:
  19. 命令行參數(shù)名:arg1,參數(shù)值:111
  20. 命令行參數(shù)名:arg2,參數(shù)值:222
  21. 命令行參數(shù)名:arg3,參數(shù)值:123

4. getopt

getopt 是 Python 中一個內(nèi)置標(biāo)準(zhǔn)模塊,可以結(jié)合 sys.argv 模塊,直接解析腳本運(yùn)行時參數(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ù)庫名稱)進(jìn)行講解

  1. from getopt import getopt
  2. import sys
  3. # 獲取參數(shù)
  4. # sys.argv[1:]:獲取除腳本文件名外的所有命令行參數(shù)
  5. # opts:存有所有選項及其輸入值的元組列表
  6. # args:去除有用的輸入以后剩余的部分
  7. opts, args = getopt(sys.argv[1:], 'i:u:p:d:', ['ip=''user=''pwd=''db='])
  8. # 獲取參數(shù)值
  9. # 短參數(shù)
  10. # python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb
  11. # 長參數(shù)
  12. # python3 4_getopt.py --ip 127.0.0.1 -u root -p 123456 -d mysqldb
  13. ip_pre = [item[1for item in opts if item[0] in ('-i''--ip')]
  14. ip = ip_pre[0if len(ip_pre) > 0 else None
  15. print("參數(shù)ip:", ip)
  16. user_pre = [item[1for item in opts if item[0] in ('-u''--user')]
  17. user = user_pre[0if len(user_pre) > 0 else None
  18. print("參數(shù)user:", user)
  19. pwd_pre = [item[1for item in opts if item[0] in ('-p''--pwd')]
  20. pwd = pwd_pre[0if len(pwd_pre) > 0 else None
  21. print("參數(shù)pwd:", pwd)
  22. db_pre = [item[1for item in opts if item[0] in ('-d''--db')]
  23. db = db_pre[0if len(db_pre) > 0 else None
  24. print("參數(shù)db:", db)

在運(yùn)行腳本時,我們可以利用「 短參數(shù) 」或「 長參數(shù) 」形式進(jìn)行傳遞

  1. # 測試
  2. # 短參數(shù)
  3. python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb
  4. # 長參數(shù)
  5. python3 4_getopt.py --ip 127.0.0.1 --user root --pwd 123456 --db mysqldb

5. click

click 作為第三方依賴庫,它為命令行工具封裝了大量的方法,可以非常方便實現(xiàn)命令行參數(shù)

項目地址:https://pypi.org/project/click/

首先,我們需要安裝依賴庫 click

  1. import click
  2. # 安裝依賴
  3. # pip3 install -U click
  4. @click.command()
  5. @click.option('--arg1'default='111', help='參數(shù)arg1,默認(rèn)值為「111」')
  6. @click.option('--arg2'type=int, help='參數(shù)arg2')
  7. @click.option('--arg3'type=str, help='參數(shù)arg3')
  8. def start(arg1, arg2, arg3):
  9.     """
  10.     基于參數(shù)arg1、參數(shù)arg2、參數(shù)arg3運(yùn)行項目
  11.     :param arg1:
  12.     :param arg2:
  13.     :param arg3:
  14.     :return:
  15.     """
  16.     print("參數(shù)arg1值為:", arg1)
  17.     print("參數(shù)arg2值為:", arg2)
  18.     print("參數(shù)arg3值為:", arg3)
  19. if __name__ == '__main__':
  20.     start()

然后,在主運(yùn)行函數(shù)上通過裝飾器配置參數(shù)即可

比如,上面就定義了 3 個命令行參數(shù) arg1、arg2、arg3,并設(shè)置了參數(shù)的類型及默認(rèn)值

最后,在運(yùn)行腳本時只需要按參數(shù)設(shè)定傳遞對應(yīng)的值即可

  1. # 不包含參數(shù)
  2. xingag@xingagdeMacBook-Pro args % python3 3_click.py 
  3. 參數(shù)arg1值為: 111
  4. 參數(shù)arg2值為: None
  5. 參數(shù)arg3值為: None
  6. # 包含參數(shù)arg1
  7. xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1
  8. 參數(shù)arg1值為: test1
  9. 參數(shù)arg2值為: None
  10. 參數(shù)arg3值為: None
  11. # 包含參數(shù)arg1、arg2
  12. # 注意:arg2的參數(shù)類型為整形,傳入的參數(shù)必須能轉(zhuǎn)為整形,否則會報錯
  13. xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222  
  14. 參數(shù)arg1值為: test1
  15. 參數(shù)arg2值為: 222
  16. 參數(shù)arg3值為: None
  17. # 包含參數(shù)arg1、arg2、arg3
  18. xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222 --arg3 test3
  19. 參數(shù)arg1值為: test1
  20. 參數(shù)arg2值為: 222
  21. 參數(shù)arg3值為: test3

6. 最后

上面通過實例講解了實現(xiàn) Python 命令行參數(shù)常見的 4 種方式

對于一些簡單自用且不那么正規(guī)的場景,個人覺得可以考慮用 sys.argv 模塊快速構(gòu)建命令行參數(shù);而對一些參數(shù)多、面向用戶的正式生產(chǎn)環(huán)境,建議利用 argparse 模塊或 click 依賴來創(chuàng)建命令行參數(shù)


作者:星安果


歡迎關(guān)注微信公眾號 :AirPython