Python的模塊及詳解(1)

psuitil模塊

filecmp模塊

pycurl模塊

一、系統性能信息模塊psuitil

psutil是一個跨平臺庫(http://code.google.com/p/psutil/),能夠輕松實現獲取系統運行的進程和系統利用率(包括CPU、內存、磁盤、網絡等)信息。它主要應用于系統監控,分析和限制系統資源及進程的管理。它實現了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。

1.安裝:

#wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate 
# tar -xzvf psutil-2.0.0.tar.gz 
# cd psutil-2.0.0 
# python setup.py install

2.獲取系統性能信息

CPU信息:

>>> import psutil

>>> psutil.cpu_times()#使用cpu_times方法獲取CPU完整信息,需要顯示所有邏輯CPU信息,

>>> #指定方法變量percpu=True即可,如psutil.cpu_times(percpu=True) 

scputimes(user=38.039999999999999, nice=0.01, system=110.88, idle=177062.59, iowait=53.399999999999999, irq=2.9100000000000001, softirq=79.579999999999998, steal=0.0, guest=0.0) 

>>> psutil.cpu_times().user #獲取單項數據信息,如用戶user的CPU時間比 38.0 

>>> psutil.cpu_count() #獲取CPU的邏輯個數,默認logical=True4 

>>> psutil.cpu_count(logical=False) #獲取CPU的物理個數 2 

內存信息:

psutil.virtual_memory()   #獲取內存完整信息

psutil.virtual_memory().total   #獲取內存總數

psutil.virtual_memory().free    #獲取空閑內存數
psutil.swap_memory()      #獲取SWAP分區信息

磁盤信息:

磁盤IO信息包括read_count(讀IO數)、write_count(寫IO數)、read_bytes(IO讀字節數)、write_bytes(IO寫字節數)、read_time(磁盤讀時間)、write_time(磁盤寫時間)等

psutil.disk_partitions()    #獲取磁盤完整信息

psutil.disk_usage('/')     #獲取分區的使用情況

psutil.disk_io_counters()   #獲取硬盤的IO個數、讀寫信息

psutil.disk_io_counters(perdisk=True)    #獲取單個分區IO個數、讀寫信息

網絡信息:

系統的網絡信息與磁盤IO類似,涉及幾個關鍵點,包括bytes_sent(發送字節數)、bytes_recv=28220119(接收字節數)、packets_sent=200978(發送數據包數)、packets_recv=212672(接收數據包數)等。

psutil.net_io_counters()         #獲取網絡總的IO信息,默認pernic=False

psutil.net_io_counters(pernic=True)     #輸出每個網絡接口的IO信息

其他信息:

psutil.users() ? ? ? ? ? ?#返回當前登陸系統的用戶信息

psutil.boot_time() ? ? ? ? ? ?#獲取開機時間,以Linux時間格式顯示

datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S") ? ? ? ? 

‘2018-01-15 15:24:26‘ ? ? ? ? ? ? ? ? ? ? ? ? ? ? #轉換成自然時間格式

3.系統進程管理方法

進程信息:

psutil.pids()        #列出所有進程的PID

p=psutil.Process(#)      #實例化一個對象,參數為一進程的PID

p.name()                 #進程名稱

p.exe()         #進程bin路徑

p.status()        #進程狀態

p.cwd()            #進程工作目錄絕對路徑

p.create_time()        #創建時間,時間戳格式

p.uids()          #進程uid信息

p.gids()           #進程gid信息

p.cpu_time()            #進程CPU時間信息

p.cpu_affinity()       #進程CPU親和度

p.memory_percent()      #進程內存利用率

p.memory_info()       #進程內存rss,vms信息

p.io_counters()             #進程IO信息

p.connections()         #打開進程Socket的namedutples列表

p.num_threads()     #進程打開的線程數

popen類使用

popen類的作用是獲取用戶啟動的應用程序進程信息,以便跟蹤進程的運行狀態

import psutil

from subprocess import PIPE

p = psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout=PIPE)

p.name()

p.communicate()

p.cpu_times()     #進程運行的CPU時間

參見:

https://github.com/giampaolo/psutil

http://psutil.readthedocs.org/en/latest/

二、文件與目錄差異對比方法—–filecmp模塊

單文件對比

采用filecmp.cmp(f1,f2[,shallow])方法,比較文件名名為f1和f2的文件,相同返回True,不相同返回False,shallow默認為True,意思是只根據os.stat()方法返回的文件基本信息進行對比,比如最后訪問時間、修改時間、狀態改變時間等,會忽略文件內容的對比。當shallow為False時,則os.stat()與文件內容同時進行校驗。

示例:比較單文件的差異。

>>> filecmp.cmp("/home/test/filecmp/f1","/home/test/filecmp/f3") 
True

>>> filecmp.cmp("/home/test/filecmp/f1","/home/test/filecmp/f2") 
False

多文件對比

采用filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,對比dir1與dir2目錄給定的文件清單。該方法返回文件名的三個列表,分別為匹配、不匹配、錯誤。匹配為包含匹配的文件的列表,不匹配反之,錯誤列表包括了目錄不存在文件、不具備讀權限或其他原因導致的不能比較的文件清單。

示例:dir1與dir2目錄中指定文件清單對比。

 >>>filecmp.cmpfiles("/home/test/filecmp/dir1","/home/test/filecmp/dir2",['f1','f2','f3','f4','f5']) 

(['f1', 'f2'], ['f3'], ['f4', 'f5'])

目錄對比

通過dircmp(a,b[,ignore[,hide]])類創建一個目錄比較對象,其中a和b是參加比較的目錄名。ignore代表文件名忽略的列表,并默認為[‘RCS’,’CVS’,’tags’];hide代表隱藏的列表,默認為[os.curdir,os.pardir]。dircmp類可以獲得目錄比較的詳細信息,如只有在a目錄中包括的文件、a與b都存在的子目錄、匹配的文件等,同時支持遞歸。

dircmp提供了三個輸出報告的方法:

·report(),比較當前指定目錄中的內容;

·report_partial_closure(),比較當前指定目錄及第一級子目錄中的內容;

·report_full_closure(),遞歸比較所有指定目錄的內容。

為輸出更加詳細的比較結果,dircmp類還提供了以下屬性:

·left,左目錄,如類定義中的a;

·right,右目錄,如類定義中的b;

·left_list,左目錄中的文件及目錄列表;

·right_list,右目錄中的文件及目錄列表;

·common,兩邊目錄共同存在的文件或目錄;

·left_only,只在左目錄中的文件或目錄;

·right_only,只在右目錄中的文件或目錄;

·common_dirs,兩邊目錄都存在的子目錄;

·common_files,兩邊目錄都存在的子文件;

·common_funny,兩邊目錄都存在的子目錄(不同os.stat()記錄的錯誤);

·same_files,匹配相同的文件;

·diff_files,不匹配的文件;

·funny_files,兩邊目錄中都存在,但無法比較的文件;

·subdirs,將common_dirs目錄名映射到新的dircmp對象,格式為字典類型。
示例:對比dir1與dir2的目錄差異。通過調用dircmp()方法實現目錄差異對比功能,同時輸出目錄對比對象所有屬性信息。
/home/test/filecmp/simple1.py
 import filecmp 

 a="/home/test/filecmp/dir1" #定義左目錄

 b="/home/test/filecmp/dir2" #定義右目錄 

  dirobj=filecmp.dircmp(a,b,['test.py']) #目錄比較,忽略test.py文件 

 dirobj.report() 

 dirobj.report_partial_closure() 

 dirobj.report_full_closure() 

 print "left_list:"+ str(dirobj.left_list)

 print "right_list:"+ str(dirobj.right_list)

 print "common:"+ str(dirobj.common)

 print "left_only:"+ str(dirobj.left_only) 

 print "right_only:"+ str(dirobj.right_only)

 print "common_dirs:"+ str(dirobj.common_dirs)

 print "common_files:"+ str(dirobj.common_files)

 print "common_funny:"+ str(dirobj.common_funny)

 print "same_file:"+ str(dirobj.same_files)

 print "diff_files:"+ str(dirobj.diff_files) 

 print "funny_files:"+ str(dirobj.funny_files)

三、探測Web服務質量方法—–pycurl模塊

pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能非常強大,支持的操作協議有FTP、HTTP、HTTPS、TELNET等,可以理解成Linux下curl命令功能的Python封裝,簡單易用。本節通過調用pycurl提供的方法,實現探測Web服務質量的情況,比如響應的HTTP狀態碼、請求延時、HTTP頭信息、下載速度等,利用這些信息可以定位服務響應慢的具體環節。

1.安裝

 (要求curl-config包支持)

# wget http://curl.haxx.se/download/curl-7.36.0.tar.gz 

# tar -zxvf curl-7.36.0.tar.gz # cd curl-7.36.0 

# ./configure

# make && make install

# export LD_LIBRARY_PATH=/usr/local/lib 

# wget https://pypi.python.org/packages/source/p/pycurl/pycurl-7.19.3.1.tar.gz --no-check-certificate 

# tar -zxvf pycurl-7.19.3.1.tar.gz 

# cd pycurl-7.19.3.1 

# python setup.py install --curl-config=/usr/local/bin/curl-config 

校驗安裝結果如下:

>>> import pycurl

>>> pycurl.version 

'PycURL/7.19.3.1 libcurl/7.36.0 OpenSSL/1.0.1e zlib/1.2.3' 2.4.1

2.模塊常用方法說明

pycurl.Curl()類實現創建一個libcurl包的Curl句柄對象,無參數。更多關于libcurl包的介紹見http://curl.haxx.se/libcurl/c/libcurl-tutorial.html。下面介紹Curl對象幾個常用的方法。

·close()方法,對應libcurl包中的curl_easy_cleanup方法,無參數,實現關閉、回收Curl對象。

·perform()方法,對應libcurl包中的curl_easy_perform方法,無參數,實現Curl對象請求的提交。

·setopt(option,value)方法,對應libcurl包中的curl_easy_setopt方法,參數option是通過libcurl的常量來指定的,參數value的值會依賴option,可以是一個字符串、整型、長整型、文件對象、列表或函數等。下面列舉常用的常量列表:

c = pycurl.Curl() #創建一個curl對象 c.setopt(pycurl.CONNECTTIMEOUT, 5) #連接的等待時間,設置為0則不等待 

c.setopt(pycurl.TIMEOUT, 5) #請求超時時間 c.setopt(pycurl.NOPROGRESS, 0) #是否屏蔽下載進度條,非0則屏蔽 c.setopt(pycurl.MAXREDIRS, 5) #指定HTTP重定向的最大數

 c.setopt(pycurl.FORBID_REUSE, 1) #完成交互后強制斷開連接,不重用 

c.setopt(pycurl.FRESH_CONNECT,1) #強制獲取新的連接,即替代緩存中的連接 

c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) #設置保存DNS信息的時間,默認為120秒 c.setopt(pycurl.URL,"http://www.baidu.com") #指定請求的URL

 c.setopt(pycurl.USERAGENT,"Mozilla/5.2 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50324)") #配置請求HTTP頭的User-Agent 

c.setopt(pycurl.HEADERFUNCTION, getheader) #將返回的HTTP HEADER定向到回調函數getheader 

c.setopt(pycurl.WRITEFUNCTION, getbody) #將返回的內容定向到回調函數getbody 

c.setopt(pycurl.WRITEHEADER, fileobj) #將返回的HTTP HEADER定向到fileobj文件對象 

c.setopt(pycurl.WRITEDATA, fileobj) #將返回的HTML內容定向到fileobj文件對象 

·getinfo(option)方法,對應libcurl包中的curl_easy_getinfo方法,參數option是通過libcurl的常量來指定的。下面列舉常用的常量列表: 

c = pycurl.Curl() #創建一個curl對象 

c.getinfo(pycurl.HTTP_CODE) #返回的HTTP狀態碼 

c.getinfo(pycurl.TOTAL_TIME) #傳輸結束所消耗的總時間 

c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS解析所消耗的時間 

c.getinfo(pycurl.CONNECT_TIME) #建立連接所消耗的時間 

c.getinfo(pycurl.PRETRANSFER_TIME) #從建立連接到準備傳輸所消耗的時間 

c.getinfo(pycurl.STARTTRANSFER_TIME) #從建立連接到傳輸開始消耗的時間 

c.getinfo(pycurl.REDIRECT_TIME) #重定向所消耗的時間 

c.getinfo(pycurl.SIZE_UPLOAD) #上傳數據包大小 

c.getinfo(pycurl.SIZE_DOWNLOAD) #下載數據包大小 

c.getinfo(pycurl.SPEED_DOWNLOAD) #平均下載速度 

c.getinfo(pycurl.SPEED_UPLOAD) #平均上傳速度 

c.getinfo(pycurl.HEADER_SIZE) #HTTP頭部大小

HTTP服務是最流行的互聯網應用之一,服務質量的好壞關系到用戶體驗以及網站的運營服務水平,最常用的有兩個標準,一為服務的可用性,比如是否處于正常提供服務狀態,而不是出現404頁面未找到或500頁面錯誤等;二為服務的響應速度,比如靜態類文件下載時間都控制在毫秒級,動態CGI為秒級。本示例使用pycurl的setopt與getinfo方法實現HTTP服務質量的探測,獲取監控URL返回的HTTP狀態碼,HTTP狀態碼采用pycurl.HTTP_CODE常量得到,以及從HTTP請求到完成下載期間各環節的響應時間,通過pycurl.NAMELOOKUP_TIME、pycurl.CONNECT_TIME、pycurl.PRETRANSFER_TIME、pycurl.R等常量來實現。另外通過pycurl.WRITEHEADER、pycurl.WRITEDATA常量得到目標URL的HTTP響應頭部及頁面內容。實現源碼如下:【/home/test/pycurl/simple1.py】

# -*- coding: utf-8 -*- 

import os,sys

import time 

import sys 

import pycurl URL="http://www.google.com.hk" #探測的目標URL
c = pycurl.Curl() #創建一個Curl對象 

c.setopt(pycurl.URL, URL) #定義請求的URL常量 

c.setopt(pycurl.CONNECTTIMEOUT, 5) #定義請求連接的等待時間 

c.setopt(pycurl.TIMEOUT, 5) #定義請求超時時間 

c.setopt(pycurl.NOPROGRESS, 1) #屏蔽下載進度條 

c.setopt(pycurl.FORBID_REUSE, 1) #完成交互后強制斷開連接,不重用 

c.setopt(pycurl.MAXREDIRS, 1) #指定HTTP重定向的最大數為1 

c.setopt(pycurl.DNS_CACHE_TIMEOUT,30) #設置保存DNS信息的時間為30秒 

#創建一個文件對象,以”wb”方式打開,用來存儲返回的http頭部及頁面內容 

indexfile = open(os.path.dirname(os.path.realpath(__file__))+"/content.txt", "wb")

c.setopt(pycurl.WRITEHEADER, indexfile) #將返回的HTTP HEADER定向到indexfile文件對象 

c.setopt(pycurl.WRITEDATA, indexfile) #將返回的HTML內容定向到indexfile文件對象 

try: 

? ? c.perform() #提交請求 

except Exception,e: 

? ? print "connecion error:"+str(e) 

? ? indexfile.close() 

? ? c.close() 

? ? sys.exit() 

NAMELOOKUP_TIME = c.getinfo(c.NAMELOOKUP_TIME) #獲取DNS解析時間 

CONNECT_TIME = c.getinfo(c.CONNECT_TIME) #獲取建立連接時間 

PRETRANSFER_TIME = c.getinfo(c.PRETRANSFER_TIME) #獲取從建立連接到準備傳輸所消耗的時間 

STARTTRANSFER_TIME = c.getinfo(c.STARTTRANSFER_TIME) #獲取從建立連接到傳輸開始消耗的時間 

TOTAL_TIME = c.getinfo(c.TOTAL_TIME) #獲取傳輸的總時間

HTTP_CODE = c.getinfo(c.HTTP_CODE) #獲取HTTP狀態碼 

SIZE_DOWNLOAD = c.getinfo(c.SIZE_DOWNLOAD) #獲取下載數據包大小 

HEADER_SIZE = c.getinfo(c.HEADER_SIZE) #獲取HTTP頭部大小

SPEED_DOWNLOAD=c.getinfo(c.SPEED_DOWNLOAD) #獲取平均下載速度 

#打印輸出相關數據 

print "HTTP狀態碼:%s" %(HTTP_CODE) 

print "DNS解析時間:%.2f ms"%(NAMELOOKUP_TIME*1000) 

print "建立連接時間:%.2f ms" %(CONNECT_TIME*1000) 

print "準備傳輸時間:%.2f ms" %(PRETRANSFER_TIME*1000) 

print "傳輸開始時間:%.2f ms" %(STARTTRANSFER_TIME*1000) 

print "傳輸結束總時間:%.2f ms" %(TOTAL_TIME*1000) 

print "下載數據包大?。?d bytes/s" %(SIZE_DOWNLOAD) 

print "HTTP頭部大?。?d byte" %(HEADER_SIZE) 

print "平均下載速度:%d bytes/s" %(SPEED_DOWNLOAD) #關閉文件及Curl對象 

indexfile.close() 

c.close()

pycurl模塊的常用類與方法說明參考官網http://pycurl.sourceforge.net/doc/index.html。

原創文章,作者:nene,如若轉載,請注明出處:http://www.www58058.com/91122

(0)
nenenene
上一篇 2018-01-15 15:46
下一篇 2018-01-15

相關推薦

  • N21-北京-泥人-馬哥教育網絡班21期+第一周課程練習

    馬哥教育網絡班21期  第一周課程練習 一、計算機的組成 1、計算機主要由以下幾部分組成:運算器 控制器 存儲器(編址存儲單元)、 輸入、輸出設備   2、運算器負責運算:只能做二進制的數學、邏輯運算, 控制器:控制由哪得到數據,放到哪去,協調運算器、存儲器、輸入、輸出等設備 運算器、控制器整合到一起就是常說的中央處理器,也就是CPU。 …

    Linux干貨 2016-07-12
  • LINUX 下正確關機方法

    Linux下正確關機方法 Table of Contents 1關機前 1.1觀察系統使用 1.2通知在線使用者關機 2關機 2.1 sy 2.2 shutdo 2.3 rebo 2.4 ha 2.5 powero 3執行 3.1等級 3.2等級 1關機前準備 1.1觀察系統使用狀態 誰在線:who 聯網狀態:netstat -a 后臺執行的程序:ps -a…

    Linux干貨 2017-08-21
  • Linux系統啟動流程

    對于linux系統的初學者來說,理解并掌握linux系統啟動流程能夠使你夠深入的理解linux系統,還可以通過系統的啟動過程來分析問題解決問題。   Linux系統的啟動流程   關于linux系統的啟動流程可以分為以下步驟:     POST(加電自檢)–>加載BIOS(Basic Inp…

    Linux干貨 2015-05-18
  • N26-第三周作業

    N26-第三周作業 一、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 [root@promote ~]# who root     tty1         2017-03-10 22:36 lxk…

    Linux干貨 2017-03-11
  • shell腳本之 select 循環菜單及 函數

    select 循環與菜單 select variable in list    do      循環體命令   done select 循環主要用于創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,并顯示PS3 提示符,等待用戶輸入 用戶輸入菜單列表中的某個數字,執行相應的命令…

    Linux干貨 2016-08-22
  • N26_第三周作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 演示: [root@joylin test]# who|cut -d” ” -f1|uniq root gentoo [root@joylin test]# who|cut -d” ” -f1|uniq -c 5 root 1 gentoo 或者 [root@joyl…

    Linux干貨 2017-02-21
欧美性久久久久