1. 程式人生 > >22. Python 模塊2

22. Python 模塊2

python 模塊

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