用Python来编写脚本简化日常的运维工作是Python的一个重要用途。 在Python中获取系统信息的一个好办法是使用psutil这个第三方模块。顾名思义,psutil = process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。
>>> import psutil
>>> psutil.cpu_count() # CPU逻辑数量
8
>>> psutil.cpu_count(logical=False) # CPU物理核心
4
# 4说明是4核超线程, 8则是8核非超线程
统计CPU的用户/系统/空闲时间:
>>> psutil.cpu_times()
>>> scputimes(user=229289.53125, system=132089.0, idle=4802985.0, interrupt=5994.125030517578, dpc=5266.125)
使用psutil获取物理内存和交换内存信息,分别使用:
# 返回的是字节为单位的整数
>>> psutil.virtual_memory()
svmem(total=8512647168, available=4071849984, percent=52.2, used=4440797184, free=4071849984)
>>> psutil.swap_memory()
sswap(total=9049518080, used=5464526848, free=3584991232, percent=60.4, sin=0, sout=0)
>>> psutil.disk_partitions() # 磁盘分区信息
[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed')]
>>> psutil.disk_usage('/') # 磁盘使用情况
sdiskusage(total=119070531584, used=73445441536, free=45625090048, percent=61.7)
>>> 45625090048/(2**30)
42.491676330566406 # GB
>>> psutil.disk_io_counters() # 磁盘IO
sdiskio(read_count=7417512, write_count=5075323, read_bytes=170990955520, write_bytes=143101932032, read_time=9873, write_time=5668)
Python支持多种图形界面的第三方库,包括:
我们编写的Python代码会调用内置的Tkinter,Tkinter封装了访问Tk的接口; Tk是一个图形库,支持多个操作系统,使用Tcl语言开发; Tk会调用操作系统提供的本地GUI接口,完成最终的GUI。 所以,我们的代码只需要调用Tkinter提供的接口就可以了。
Frame
派生一个Application
类,这是所有Widget的父容器:from tkinter import *
class Application(Frame):
def __init__(self,master=None):
Frame.__init__(self,master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.helloLabel = Label(self, text='Hello, World!')
self.helloLabel.pack()
self.quitButton = Button(self, text='Quit', command=self.quit)
self.quitButton.pack()
在GUI中,每个Button、Label、输入框等,都是一个Widget。Frame则是可以容纳其他Widget的Widget,所有的Widget组合起来就是一棵树。
pack()
方法把Widget加入到父容器中,并实现布局。pack()
是最简单的布局,grid()
可以实现更复杂的布局。
在createWidgets()
方法中,我们创建一个Label
和一个Button
,当Button被点击时,触发self.quit()
使程序退出。
Application
,并启动消息循环:app = Application()
# 设置窗口标题:
app.master.title('Hello World')
# 主消息循环:
app.mainloop()
我们再对这个GUI程序改进一下,加入一个文本框,让用户可以输入文本,然后点按钮后,弹出消息对话框。
from tkinter import *
import tkinter.messagebox as messagebox
class Application(Frame):
def __init__(self,master=None):
Frame.__init__(self,master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.nameInput = Entry(self)
self.nameInput.pack()
self.quitButton = Button(self, text='Helo', command=self.hello)
self.quitButton.pack()
def hello(self):
name = self.nameInput.get() or 'World!'
messagebox.showinfo('Message','Hello, %s' % name)
app = Application()
# 设置窗口标题:
app.master.title('Hello, World!')
# 主消息循环:
app.mainloop()
当用户点击按钮时,触发hello()
,通过self.nameInput.get()
获得用户输入的文本后,使用tkMessageBox.showinfo()
可以弹出消息对话框。
import tkinter as tk
def callback():
"""
callback function for button click
"""
listbox.insert(tk.END,"Hello World!")
if __name__ == "__main__":
master = tk.Tk()
button = tk.Button(master,text="OK",command=callback)
button.pack()
listbox = tk.Listbox(master)
listbox.pack()
tk.mainloop()
GUI回调