22. Python 模塊2
1. logging 模塊
日誌是我們排查問題的關鍵利器,寫好日誌記錄,當我們發生問題時,可以快速定位代碼範圍進行修改。
Python有給開發者們提供好的日誌模塊,下面介紹一下logging模塊:
首先,我們先來看一個例子:
import logging
logging.debug(‘This is debug message‘)
logging.info(‘This is info message‘)
logging.warning(‘This is warning message‘)
logging.error(‘This is error message‘)
logging.critical(‘This is critical message‘)
結果:
WARNING:root:This is warning message
ERROR:root:This is error message
CRITICAL:root:This is critical message
默認情況下,logging將日誌打印到屏幕
日誌級別大小關系為:
CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,當然也可以自己定義日誌級別。
● DEBUG:詳細的信息,通常只出現在診斷問題上。
● INFO:確認一切按預期運行
● WARNING:一個警告,可能會有一些意想不到的事情發生了,或表明一些問題在不久的將來(例如。磁盤空間低”),這個軟件還能按預期工作
● ERROR:個更嚴重的問題,軟件沒能執行一些功能
● CRITICAL:一個嚴重的錯誤,這表明程序本身可能無法繼續運行
默認logging默認的日誌級別是 info,一般基本上所有的程序都是這個級別,有助於我們排查問題,但是當發生問題,我們沒法定位到問題,很多情況下我們需要把日誌級別提升到debug級別。
如何提升日誌級別:
通過logging.basicConfig函數對日誌的輸出格式及方式做相關配置
import logging
logging.basicConfig(level=logging.DEBUG, format=‘%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s‘,datefmt=‘ %Y/%m/%d %H:%M:%S‘, filename=‘myapp.log‘, filemode=‘w‘)
logger = logging.getLogger(__name__)
logging.debug(‘This is debug message‘)
logging.info(‘This is info message‘)
logging.warning(‘This is warning message‘)
logging.error(‘This is error message‘)
logging.critical(‘This is critical message‘)
結果:
在當前文件新增了一個myapp.log文件,文件的內容如下:
2017/11/10 21:17:42 read.py[line:12] DEBUG This is debug message
2017/11/10 21:17:42 read.py[line:13] INFO This is info message
2017/11/10 21:17:42 read.py[line:14] WARNING This is warning message
2017/11/10 21:17:42 read.py[line:15] ERROR This is error message
2017/11/10 21:17:42 read.py[line:16] CRITICAL This is critical message
解釋:
主要是通過logging.basicConfig函數進行操作,現在我們來介紹一下該函數參數的用法:
level: 設置日誌級別,默認為logging.WARNING
filename: 指定日誌文件名。
filemode: 和file函數意義相同,指定日誌文件的打開模式,‘w‘或‘a‘
format: 指定輸出的格式和內容,format可以輸出很多有用信息,如上例所示:
%(levelname)s: 打印日誌級別名稱
%(filename)s: 打印當前執行程序名
%(funcName)s: 打印日誌的當前函數
%(lineno)d: 打印日誌的當前行號
%(asctime)s: 打印日誌的時間
%(thread)d: 打印線程ID
%(process)d: 打印進程ID
%(message)s: 打印日誌信息
datefmt: 指定時間格式,同time.strftime()
stream: 指定將日誌的輸出流,可以指定輸出到sys.stderr,sys.stdout或者文件,默認輸出到sys.stderr,當stream和filename同時指定時,stream被忽略
logging.getLogger(__name__):
創建一個日誌對象:
返回一個logger實例,如果沒有指定name,返回root logger。
只要name相同,返回的logger實例都是同一個而且只有一個,即name和logger實例是一一對應的。
這意味著,無需把logger實例在各個模塊中傳遞。
只要知道name,就能得到同一個logger實例。
logging.getLogger(__name__) 在上述實例中__name__就指的是__main__。
2.os模塊
os模塊也是我們平時工作中很常用到的一個模塊,通過os模塊調用系統命令,獲得路勁,獲取操作系統的類型等都是使用該模塊。
下面我們就了解一下os模塊。
(1)通過os獲取系統類型
import os
print(os.name)
這個就是查看我們系統的類型:
如果是windows系統,os.name = ‘nt‘;
如果是linux系統os.name = ‘posix‘;
不同的操作系統是命令可能不一樣。
所以在使用系統命令之前,我們先要判斷系統是linux系統還是windows系統。
(2)執行系統命令
通過python來代用系統命令
import os
os.system(‘ipconfig’)
content=os.popen(‘ipconfig‘).read()
print(content)
解釋:
該代碼調用了windows系統的ipconfig命令,ipconfig是用來查看windows系統ip的。
os.system(‘ifconfig’)只會調用系統的命令,但是當我們需要獲得系統命令最後的執行結果的時候該怎麽辦呢?
這時候我們就用os.popen()方法,os.popen()返回的是一個file對象,我們可以通過file.read()來獲得最後系統命令最終的結果
(3)目錄和文件相關操作
① 獲得當前目錄的路徑
import os
print(os.getcwd())
② 列出當前目錄的文件
print(os.listdir(os.getcwd()))
③ 切換目錄
os.chdir(‘d:‘)
④ 列出C:\Python27目錄下的文件
print(os.listdir(‘C:\Python27‘))
⑤ 在當前目錄下創建abc目錄
os.mkdir(‘abc‘)
⑥ 刪除當前目錄下的1.txt文件,(若文件不存在會報錯)
os.remove(‘1.txt‘)
⑦ 打印操作系統的分隔符,linux系統的分隔符\n,windows系統的分隔符\r\n,mac系統的分隔符\r
print(os.linesep)
⑧ 在當前目錄拼接字段,並不出創建 # E:\test\abc.txt 文件
print(os.path.join(os.getcwd(), ‘abc.txt‘))
返回 # E:\test\abc.txt
print(os.path.islink(os.getcwd()))
返回 # False
⑨ 把最後的文件名和目錄分開
path1 = os.path.join(os.getcwd(), ‘abc.txt‘)
print(os.path.split(path1))
返回 # (‘E:\\test‘, ‘abc.txt‘)
⑩ 把第一節目錄和後面的分開
print(os.path.splitdrive(path1))
返回 # (‘E:‘, ‘\\test\\abc.txt‘)
(11) 把目錄文件名和後綴名分開
print(os.path.splitext(path1))
返回 # (‘E:\\test\\abc‘, ‘.txt‘)
(12) 若當前目錄下存在aaa目錄,不創建,當前不存在aaa目錄,創建aaa目錄
if not os.path.exists(r‘E:\test\aaa‘):
os.makedirs(r‘E:\test\aaa‘)
(13) 獲得E:\test\test.py文件的目錄
print(os.path.dirname(r‘E:\test\test.py‘))
返回 # E:\test
解釋:
1,os.getcwd() 獲得目錄的當前系統程序工作路勁
2,os. chdir(‘目標目錄’) 切換到目標目錄
3,os.listdir(‘字符串目錄’) 列出字符串目錄下的所有文件
4,os.makedirs(‘目錄‘) 創建目錄
5,os.remove(‘1.txt‘) 刪除文件,文件不存在時會報錯
6,os.linesep 打印操作系統的分隔符,linux系統的分隔符\n,windows系統的分隔符\r\n,mac系統的分隔符\r
7,os.path.join(os.getcwd(), ‘aaa‘, ‘bbb’, ‘ccc’) 拼接出來多級目錄:E:\test\aaa\bbb\ccc
8,os.path.exists(‘目錄’) 判斷目錄是否存在
9,os.path.split(‘文件或者目錄’) 把最後的一個目錄或者文件和前面的目錄分開,返回一個tuple
10,os.path.splitext(‘文件’) 把文件的後綴名和前面分開,返回一個tuple
3.commands 模塊只使用於linux的shell模式下
在我們平時碼字時,經常需要調用系統腳本或者系統命令來解決很多問題;
一個很好用的模塊command,可以通過python調用系統命令;
commands是提供linux系統環境下支持使用shell命令的一個模塊;
調用系統命令command模塊提供了三種方法:cmd代表系統命令。
(1)commands.getoutput(cmd)
作用:只返回執行shell命令的結果
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import commands
cmd = ‘ls /home/admin‘
a = commands.getoutput(cmd)
print(type(a))
print(a)
結果:
<type ‘str‘>
nginx.conf
test.py
(2)commands.getstatusoutput(cmd)
作用:在上面我們在執行shell命令的時候,我們的shell命令可能執行報錯,或者異常退出,我們就要有一個條件來判斷shell最終執行的結果是什麽,commands.getstatusoutput(cmd)的返回結果有兩個值。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import commands
cmd = ‘ls /home/admin‘
c = commands.getstatusoutput(cmd)
print(type(c))
status, output = commands.getstatusoutput(cmd)
print(status)
print(output)
print(type(output))
結果
<type ‘tuple‘>
0
nginx.conf
test.py
<type ‘str‘>
解釋:
Commands.getstatusoutput(cmd)的返回結果是一個tuple,第一個值是shell執行的結果,如果 shell 執行成功,返回0,否則,為非0;
第二個是一個字符串,就是我們shell命令的執行結果,python通過一一對應的方式復制給status和output。
4. sys 模塊
(1)通過sys模塊獲取程序的參數
import sys
print(‘argv[0] = {0} argv [1] = {1}‘.format(sys.argv[0], sys.argv[1]))
執行:
python test.py hello
結果:
argv[0] = E:/test/test.py argv [1] = hello
解釋:
和其他語言一樣,python的sys模塊默認是把第一個參數默認是程序本省,從第二個參數起都是代碼後面跟著的參數,通過sys.arg[n]就可以獲得傳入到程序中的參數。
(2)sys.stdin \ stdout \ stderr
功能:stdin , stdout , 以及stderr 變量包含與標準I/O 流對應的流對象。
如果需要更好地控制輸出,而print 不能滿足你的要求, 它們就是你所需要的。
你也可以替換它們, 這時候你就可以重定向輸出和輸入到其它設備( device ), 或者以非標準的方式處理它們
(2.1) sys.stdout 與 print
當我們在 Python 中打印對象調用 print obj 時候,事實上是調用了sys.stdout.write(obj+‘\n‘),print 將你需要的內容打印到了控制臺,然後追加了一個換行符,print 會調用 sys.stdout 的 write 方法。
以下兩行在事實上等價:
import sys
sys.stdout.write(‘hello\n‘) #默認不加換行符,如需要換行,手動添加換行符。
print ‘hello‘
(2.2)sys.stdin 與 raw_input
import sys
a = raw_input(‘raw_input_name: ‘)
print(a)
print ‘stdin_name: ‘, #逗號保持在同一行上
b = sys.stdin.readline()[:-1] # -1 表示丟棄換行符\n
print(b)
(2.3)從控制臺重定向到文件
mport sys
f_handler=open(‘out.log‘, ‘w‘)
sys.stdout=f_handler
print ‘hello‘
在當前文件下新生成一個文件out.log,文件內容為hello
(3)捕獲sys.exit(n)調用
功能:執行到主程序末尾,解釋器自動退出,但是如果需要中途退出程序,可以調用sys.exit函數,帶有一個可選的整數參數返回給調用它的程序,表示你可以在主程序中捕獲對sys.exit的調用。(0是正常退出,其他為異常)
def exitfunc():
print "hello world"
sys.exitfunc = exitfunc # 設置捕獲時調用的函數
print "aaaaaaaa"
sys.exit(1) # 退出自動調用exitfunc()後,程序依然退出了
print "there" # 不會被 print
結果:
aaaaaaaa
hello world
解釋:
1,設置sys.exitfunc函數,及當執行sys.exit(1)的時候,調用exitfunc函數
2,sys.exit(1)後面的內容就不會執行了,因為程序已經退出。
本文出自 “筆記空間” 博客,請務必保留此出處http://286577399.blog.51cto.com/10467610/1980801
22. Python 模塊2