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
import sys, getopt
opts, args = getopt.getopt(sys.argv[1:], "hu:", ["help", "file="])
print("opts輸出結果為", opts)
print("args輸出結果為", args)
- 調用getopt.getopt()會返回兩個列表,第一個列表賦值給opts,第二個列表賦值給args:
- opts:是 (選項, 選項值) 的元組為一個元素的列表。如果沒有選項值為空字符串
- args:存放沒用選項單參數的列表。不屬於格式信息的剩余的命令行參數
- 使用 sys.argv[1:] 是為過濾第一個參數(第一個參數為Python程序本身)
- "hu:" 為定義短格式選項(-)。這里的h和u為兩個選項。"h" 后面沒有 ":" 表示h這個選項沒有選項值,是作為開關選項(比如:有 -h 為顯示幫助信息,沒有 -h 為不顯示幫助信息)。"u:" 后面有 ":" 為必須有選項值
- ["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' 若參數重名,則不報錯
添加命令行參數
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