Python命令列參數處理

2020-08-11 14:43:05

sys模組
sys模組代表了Python直譯器,主要用於獲取和Python直譯器相關的資訊,其中 sys.argv 可以獲取命令列參數

在Python互動式直譯器中可以先匯入sys模組 import sys,再輸入 dir(sys) 檢視sys模組所包含的全部程式單元(包括變數、函數等),或者 [i for i in dir(sys) if not i.startswith(’_’)] 過濾掉隱藏的單元

在这里插入图片描述
常用單元

  • sys.argv:以列表的方式獲取執行 Python 程式的命令列參數存放其中。其中 sys.argv[0] 通常就是指該 Python程式本身,sys.argv[1] 代表第一個參數,sys.argv[2] 代表第二個參數,以此類推。類似於 Shell 中的 $0、$1、$2
import sys
print('程式名稱爲:{},第一個參數爲:{},第二個參數爲:{}'.format(sys.argv[0], sys.argv[1], sys.argv[2]))
  • sys.byteorder:顯示本地位元組序的指示符。如果本地位元組序的大端模式,則該屬性返回big,否則返回little

  • sys.copyright:該屬性返回與 Python 直譯器有關的版權資訊

  • sys.executable:該屬性返回 Python 直譯器在磁碟上的儲存路徑

  • sys.exit():通過引發SystemExit異常來退出程式,將其放在try塊中不能阻止finally塊的執行。

  • sys.flags:該只讀屬性返回執行Python命令時指定的旗標

  • sys.getfilesystemencodiing():返回在當前系統中儲存檔案所用的字元集

  • sys.getrefcount():返回指定物件的參照計數。

  • sys.getrecursionlimit():返回Python直譯器當前支援的遞回深度。該屬性可通過setrecursionlimit()方法重新設定

  • sys.getswitchinterval():返回在當前Python直譯器中執行緒切換的時間間隔。該屬性可通過setswitchinterval()函數改變

  • sys.implementation:返回當前Python直譯器的實現

  • sys.maxsize:返回Python整數支援的最大值。在32位元平臺上,該屬性值爲 2 ×× 31-1;在64位元平臺上,該屬性值爲 2 ×× 63-1

  • sys.path:該屬性指定Python查詢模組的路徑列表。程式可通過修改該屬性來動態增加Python載入模組的路徑

  • sys.platfrom:返回Python直譯器所在的平臺的識別符號

  • sys.stdin:返回系統的標準輸入流——一個類檔案物件

  • sys.stdout:返回系統的標準輸出流——一個類檔案物件

  • sys.stderr:返回系統的錯誤輸出流——一個類檔案物件

  • sys.version:返回當前Python直譯器的版本資訊

  • sys.winver:返回當前Python直譯器的主版本號

  • sys.copyright:返回當前Python直譯器的版權資訊

getopt模組

getopt是對sys.argv獲取的命令列參數進行二次處理。在執行程式時,可能需要根據不同的條件,輸入不同的命令列選項來實現不同的功能,比如 -u 代表後面是使用者,-p 代表後面是密碼。

舉個例子

## fileName: test.py
'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:778463939
尋找有志同道合的小夥伴,互幫互助,羣裡還有不錯的視訊學習教學和PDF電子書!
'''
import sys, getopt
opts, args = getopt.getopt(sys.argv[1:], "hu:", ["help", "file="])
print("opts輸出結果爲", opts)
print("args輸出結果爲", args)
  1. 呼叫getopt.getopt()會返回兩個列表,第一個列表賦值給opts,第二個列表賦值給args:
  • opts:是 (選項, 選項值) 的元組爲一個元素的列表。如果沒有選項值爲空字串
  • args:存放沒用選項單參數的列表。不屬於格式資訊的剩餘的命令列參數
  1. 使用 sys.argv[1:] 是爲過濾第一個參數(第一個參數爲Python程式本身)
  2. 「hu:」 爲定義短格式選項(-)。這裏的h和u爲兩個選項。「h」 後面沒有 「:」 表示h這個選項沒有選項值,是作爲開關選項(比如:有 -h 爲顯示幫助資訊,沒有 -h 爲不顯示幫助資訊)。「u:」 後面有 「:」 爲必須有選項值
  3. [「help」, 「file=」] 爲定義長格式選項(–)。這裏的 「=」 和上面的短格式選項中的 「:」 一樣
    執行的例子
python test.py -h -u root --help --file=file.py file2.py
## 輸出結果
opts輸出結果爲 [('-h', ''), ('-u', 'root'), ('--help', ''), ('--file', 'file.py')]
args輸出結果爲 ['file2.py']

optparse模組
optparse模組主要用來爲指令碼傳遞命令參數,採用預先定義好的選項來解析命令列參數,自動生成幫助資訊,不需要sys.argv

先簡單寫個例子

import optparse

usage="python %prog -u/--user <target user> -p/--password <target password>"
parser=optparse.OptionParser(usage) ## 寫入上面定義的幫助資訊
parser.add_option('-u', '--user',dest='User',type='string',help='target user', default='root')
parser.add_option('-p','--password',dest='Pwd',type='string',help='target password')
options, args=parser.parse_args()
print('options爲', options)
print("使用者名稱爲", options.User)
print("密碼爲", options.Pwd)
print('args爲', args)

add_option參數:

  • 可以設定多個選項字串,比如上面的 ‘-u’, ‘–user’ 這兩個,用的時候任選其一
  • dest用於定義選項值存放的位置,作爲後面的第一個字典(options)的鍵,值爲命令輸入的參數
  • type用於檢測命令列輸入參數的數據型別是否符合要求,有 string(字串)、int(整數)、float(浮點數)等型別
  • help用於定義幫助資訊
  • default設定預設值
    在这里插入图片描述

幫助資訊裏面的選項字串都在一個組中,我們可以建立不同的組用來給選項字串分類

import optparse

usage="python %prog -u/--user <target user> -p/--password <target password>"
parser=optparse.OptionParser(usage) ## 寫入上面定義的幫助資訊
parser.add_option('-u', '--user',dest='User',type='string',help='target user', default='root')
parser.add_option('-p','--password',dest='Pwd',type='string',help='target password')
group = optparse.OptionGroup(parser, 'Debug Options') ## 建立group分組
parser.add_option_group(group)  ## 把建立的組新增到parser中
group.add_option('-d', '--debug', action='store_true', help='Print debug information')
options, args=parser.parse_args()

action有三種類型:

  • action=‘store’ 預設型別,可以忽略不寫。使用者必須給出一個明確的參數值,該型別定義了將實際參數值儲存到dest指定變數中
  • action=‘store_true’ 使用者不需給出參數值,該型別定義了將布爾值true儲存到dest指定的變數中(和上面getopt中不加 ‘:’ 、’=’)
  • action=‘store_false’ 使用者不需給出參數值,該型別定義了將布爾值false儲存到dest指定的變數中

在这里插入图片描述
argparse模組

optparse模組的升級版,optparse被Python2.7和Python3.2棄用,所有有理由相信未來是屬於argparse模組的

編輯幫助資訊

import argparse

parser = argparse.ArgumentParser(description='幫助描述資訊', prog='程式顯示名稱', usage='頂部顯示資訊,會覆蓋prog', epilog='底部顯示資訊')  ## 括號裏面可以什麼都不寫,會走預設
parser.parse_args()    ## 命令列參數解析後存放的位置

還有一些不常用的參數:

  • add_help = False 禁止顯示幫助介面,只接收參數
  • argument_default=argparse.SUPPRESS 限制只能從命令列傳遞參數,程式中指定無效
  • allow_abbrev=False 例如–fooo,輸入–foo,則不可以識別參數,預設可以
  • conflict_handler=‘resolve’ 若參數重名,則不報錯

在这里插入图片描述

新增命令列參數

'''
遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:778463939
尋找有志同道合的小夥伴,互幫互助,羣裡還有不錯的視訊學習教學和PDF電子書!
'''
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user', dest='User', type=str,default='root', help='target User')
parser.add_argument('-s', '--sex', dest='Sex', type=str, choices=['男', '女'], default='男', help='target Sex')
parser.add_argument('-n', '--number', dest='Num', nargs=2, required=True,type=int, help='target Two Numbers')
print(parser.parse_args())  ## 字典的方式接收參數

參數大多數和上面的optparse相同,不同的有:

  • choices:設定參數的範圍,如果choice中的型別不是字串,要指定type
  • nargs:設定參數接受的個數:
    ?:表示可有可無
    +:表示至少一個
    *:表示任意個
    數位表示必須是指定數目個
  • required:表示該參數是否可以不寫,預設爲 False