Qt Designer 获取cpu和内存并以图表形式展现
功能:
1.通过telnet获取top命令下某进程的cpu占用率和内存使用率
2.写入excel表格,以设备ip分工作表
3.图表展现
效果图:
代码:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'plot.ui' # # Created by: PyQt5 UI code generator 5.15.4 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do not edit this file unless you know what you are doing. from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(916, 486) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.centralwidget) self.verticalLayout_6.setContentsMargins(0, 0, 0, 0) self.verticalLayout_6.setSpacing(0) self.verticalLayout_6.setObjectName("verticalLayout_6") self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.plot_widget = QtWidgets.QWidget(self.centralwidget) self.plot_widget.setStyleSheet("") self.plot_widget.setObjectName("plot_widget") self.verticalLayout.addWidget(self.plot_widget) self.verticalLayout_6.addLayout(self.verticalLayout) self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setContentsMargins(10, -1, -1, -1) self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.groupBox = QtWidgets.QGroupBox(self.centralwidget) self.groupBox.setObjectName("groupBox") self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_4.setContentsMargins(9, -1, -1, -1) self.verticalLayout_4.setObjectName("verticalLayout_4") self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.label_3 = QtWidgets.QLabel(self.groupBox) self.label_3.setObjectName("label_3") self.horizontalLayout.addWidget(self.label_3) self.lineEdit = QtWidgets.QLineEdit(self.groupBox) self.lineEdit.setFrame(False) self.lineEdit.setObjectName("lineEdit") self.horizontalLayout.addWidget(self.lineEdit) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout_2.addLayout(self.horizontalLayout) self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setContentsMargins(-1, 10, -1, 10) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label_4 = QtWidgets.QLabel(self.groupBox) self.label_4.setObjectName("label_4") self.horizontalLayout_2.addWidget(self.label_4) self.timer_interval_comboBox = QtWidgets.QComboBox(self.groupBox) self.timer_interval_comboBox.setObjectName("timer_interval_comboBox") self.timer_interval_comboBox.addItem("") self.timer_interval_comboBox.addItem("") self.timer_interval_comboBox.addItem("") self.timer_interval_comboBox.addItem("") self.horizontalLayout_2.addWidget(self.timer_interval_comboBox) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem1) self.verticalLayout_2.addLayout(self.horizontalLayout_2) self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName("horizontalLayout_8") spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_8.addItem(spacerItem2) self.start_draw_btn = QtWidgets.QPushButton(self.groupBox) self.start_draw_btn.setObjectName("start_draw_btn") self.horizontalLayout_8.addWidget(self.start_draw_btn) self.horizontalLayout_8.setStretch(0, 2) self.horizontalLayout_8.setStretch(1, 1) self.verticalLayout_2.addLayout(self.horizontalLayout_8) self.verticalLayout_4.addLayout(self.verticalLayout_2) self.horizontalLayout_7.addWidget(self.groupBox) spacerItem3 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_7.addItem(spacerItem3) self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_2.setObjectName("groupBox_2") self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_5.setObjectName("verticalLayout_5") self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.label = QtWidgets.QLabel(self.groupBox_2) self.label.setObjectName("label") self.horizontalLayout_3.addWidget(self.label) self.start_dateTimeEdit = QtWidgets.QDateTimeEdit(self.groupBox_2) self.start_dateTimeEdit.setFocusPolicy(QtCore.Qt.ClickFocus) self.start_dateTimeEdit.setContextMenuPolicy(QtCore.Qt.NoContextMenu) self.start_dateTimeEdit.setWrapping(False) self.start_dateTimeEdit.setButtonSymbols(QtWidgets.QAbstractSpinBox.UpDownArrows) self.start_dateTimeEdit.setKeyboardTracking(True) self.start_dateTimeEdit.setMaximumDate(QtCore.QDate(9999, 12, 31)) self.start_dateTimeEdit.setCurrentSection(QtWidgets.QDateTimeEdit.YearSection) self.start_dateTimeEdit.setCalendarPopup(True) self.start_dateTimeEdit.setTimeSpec(QtCore.Qt.LocalTime) self.start_dateTimeEdit.setObjectName("start_dateTimeEdit") self.horizontalLayout_3.addWidget(self.start_dateTimeEdit) self.label_2 = QtWidgets.QLabel(self.groupBox_2) self.label_2.setObjectName("label_2") self.horizontalLayout_3.addWidget(self.label_2) self.end_dateTimeEdit = QtWidgets.QDateTimeEdit(self.groupBox_2) self.end_dateTimeEdit.setFocusPolicy(QtCore.Qt.ClickFocus) self.end_dateTimeEdit.setTime(QtCore.QTime(23, 59, 59)) self.end_dateTimeEdit.setMaximumDateTime(QtCore.QDateTime(QtCore.QDate(9999, 12, 31), QtCore.QTime(23, 59, 59))) self.end_dateTimeEdit.setCurrentSection(QtWidgets.QDateTimeEdit.YearSection) self.end_dateTimeEdit.setCalendarPopup(True) self.end_dateTimeEdit.setObjectName("end_dateTimeEdit") self.horizontalLayout_3.addWidget(self.end_dateTimeEdit) spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem4) self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setContentsMargins(-1, 10, -1, 10) self.horizontalLayout_4.setObjectName("horizontalLayout_4") self.select_cbox = QtWidgets.QComboBox(self.groupBox_2) self.select_cbox.setObjectName("select_cbox") self.select_cbox.addItem("") self.select_cbox.addItem("") self.select_cbox.addItem("") self.horizontalLayout_4.addWidget(self.select_cbox) spacerItem5 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem5) self.horizontalLayout_4.setStretch(0, 1) self.horizontalLayout_4.setStretch(1, 2) self.verticalLayout_3.addLayout(self.horizontalLayout_4) self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") spacerItem6 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem6) self.fresh_btn = QtWidgets.QPushButton(self.groupBox_2) self.fresh_btn.setObjectName("fresh_btn") self.horizontalLayout_5.addWidget(self.fresh_btn) self.horizontalLayout_5.setStretch(0, 2) self.horizontalLayout_5.setStretch(1, 1) self.verticalLayout_3.addLayout(self.horizontalLayout_5) self.verticalLayout_5.addLayout(self.verticalLayout_3) self.horizontalLayout_7.addWidget(self.groupBox_2) self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") spacerItem7 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem7) self.total_data_lbl = QtWidgets.QLabel(self.centralwidget) self.total_data_lbl.setMinimumSize(QtCore.QSize(120, 60)) self.total_data_lbl.setLayoutDirection(QtCore.Qt.LeftToRight) self.total_data_lbl.setStyleSheet("background-color: rgb(255, 255, 255);") self.total_data_lbl.setText("") self.total_data_lbl.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.total_data_lbl.setObjectName("total_data_lbl") self.horizontalLayout_6.addWidget(self.total_data_lbl) spacerItem8 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem8) self.xy_data_lbl = QtWidgets.QLabel(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(10) sizePolicy.setVerticalStretch(10) sizePolicy.setHeightForWidth(self.xy_data_lbl.sizePolicy().hasHeightForWidth()) self.xy_data_lbl.setSizePolicy(sizePolicy) self.xy_data_lbl.setMinimumSize(QtCore.QSize(120, 60)) self.xy_data_lbl.setStyleSheet("background-color: rgb(255, 255, 255);") self.xy_data_lbl.setText("") self.xy_data_lbl.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.xy_data_lbl.setObjectName("xy_data_lbl") self.horizontalLayout_6.addWidget(self.xy_data_lbl) spacerItem9 = QtWidgets.QSpacerItem(10, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem9) self.horizontalLayout_7.addLayout(self.horizontalLayout_6) self.verticalLayout_6.addLayout(self.horizontalLayout_7) self.verticalLayout_6.setStretch(0, 4) self.verticalLayout_6.setStretch(1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 916, 23)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.groupBox.setTitle(_translate("MainWindow", "画图参数:")) self.label_3.setText(_translate("MainWindow", "IP:")) self.lineEdit.setText(_translate("MainWindow", "192.168.0.104")) self.label_4.setText(_translate("MainWindow", "更新间隔:")) self.timer_interval_comboBox.setItemText(0, _translate("MainWindow", "30分钟")) self.timer_interval_comboBox.setItemText(1, _translate("MainWindow", "10分钟")) self.timer_interval_comboBox.setItemText(2, _translate("MainWindow", "1小时")) self.timer_interval_comboBox.setItemText(3, _translate("MainWindow", "2小时")) self.start_draw_btn.setText(_translate("MainWindow", "开始画图")) self.groupBox_2.setTitle(_translate("MainWindow", "查询参数:")) self.label.setText(_translate("MainWindow", "时间范围:")) self.start_dateTimeEdit.setDisplayFormat(_translate("MainWindow", "yyyy/MM/dd HH:mm")) self.label_2.setText(_translate("MainWindow", " -- ")) self.end_dateTimeEdit.setDisplayFormat(_translate("MainWindow", "yyyy/MM/dd HH:mm")) self.select_cbox.setItemText(0, _translate("MainWindow", "全部类型")) self.select_cbox.setItemText(1, _translate("MainWindow", "显示CPU")) self.select_cbox.setItemText(2, _translate("MainWindow", "显示内存")) self.fresh_btn.setText(_translate("MainWindow", "刷新图表"))
import os import sys, time from xlutils.copy import copy import telnetlib import matplotlib.pyplot as plt from threading import Thread plt.style.use('seaborn-whitegrid') import xlrd import xlwt from PyQt5.QtCore import QTimer, pyqtSignal, QDate, QTime from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout) from matplotlib import dates from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.figure import Figure from plot import Ui_MainWindow from datetime import datetime import pandas as pd import random data_file = 'data.xls' class myFigure(FigureCanvas): ''' 画布类,通过Figure创建画布,并且作为参数传递给父类FigureCanvas,最后添加绘图区self.axes ''' # draw_signal = pyqtSignal(object, object) def __init__(self, parent=None): self.fig = Figure() super(myFigure, self).__init__(self.fig) # 在父类中激活self.fig,否则不能显示图像 self.axes = self.fig.add_subplot(111) plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['font.sans-serif'] = ['Microsoft Yahei'] self.axes.spines['left'].set_position(('data', 0)) def show_max_value(self, x, y, tip, color): max_b = 0 cur_a = 0 for a, b in zip(x, y): if int(b) > int(max_b): cur_a = a max_b = b if len(y) > 3: cur_a = dates.date2num(datetime.strptime(cur_a, "%Y/%m/%d %H:%M")) self.axes.text(cur_a, int(max_b) + 3, '最高%s %.0f' % (tip,int(max_b)), ha='center', va='bottom', fontsize=8, color=color) def set_mat_func(self, x, y, y1, show_cpu, show_mem): ''' 用清除画布刷新的方法绘图 :param x: x轴数据 :param y: y轴数据 :return: ''' # 数据清洗后,数据类型变成series self.x = x.values self.y = y.values self.y1 = y1.values # 清除绘图区 self.axes.cla() self.axes.set_xlabel('日期', fontsize=10) self.axes.set_ylabel('CPU/MEM(%)', fontsize=10) self.axes.grid(True, linestyle = '--', alpha = 0.5) self.axes.xaxis.set_major_formatter(dates.DateFormatter("%Y/%m/%d %H:%M")) x = [dates.date2num(datetime.strptime(self.x[i], "%Y/%m/%d %H:%M")) for i in range(len(self.x))] # 显示/隐藏数据判断 if len(self.x) >= 2: if show_cpu == True: self.axes.plot(x, self.y, 'r-', linewidth=1, marker='.', mfc='w') self.show_max_value(self.x, self.y, "CPU", color='r') if show_mem == True: self.axes.plot(x, self.y1, 'g-', linewidth=1, marker='.', mfc='w') self.show_max_value(self.x, self.y1, "MEM", color='g') self.axes.yaxis.set_major_locator(plt.MultipleLocator(20)) self.axes.set_ylim(-5, 100) if len(self.x) <= 1: self.axes.set_xticks([]) self.fig.autofmt_xdate() self.fig.subplots_adjust(top=0.92, bottom=0.34, right=0.979, left=0.15) self.fig.canvas.draw() self.fig.canvas.flush_events() class TelnetClient(): def __init__(self, ): self.tn = telnetlib.Telnet() # 此函数实现telnet登录主机 def login_host(self, host_ip, username, password): try: # self.tn = telnetlib.Telnet(host_ip,port=23) self.tn.open(host_ip, port=23) except: return False self.tn.read_until(b'login: ', timeout=10) self.tn.write(username.encode('ascii') + b'\n') self.tn.read_until(b'Password: ', timeout=10) self.tn.write(password.encode('ascii') + b'\n') time.sleep(2) # read_very_eager()获取到的是的是上次获取之后本次获取之前的所有输出 command_result = self.tn.read_very_eager().decode('ascii') if 'Login incorrect' not in command_result: # print(u'%s 登录成功' % host_ip) return True else: print(u'%s 登录失败,用户名或密码错误' % host_ip) return False # 此函数实现执行传过来的命令,并输出其执行结果 def execute_some_command(self, command, waittime): self.tn.write(command.encode('ascii') + b'\n') time.sleep(waittime) # 获取命令结果 command_result = self.tn.read_very_eager().decode('ascii') ## print(u'命令执行结果:\n%s' % command_result) return command_result # 退出telnet def logout_host(self): self.tn.write(b"exit\n") class UI(QMainWindow, Ui_MainWindow): draw_signal = pyqtSignal(object, object, object, object, object) modify_window_title_signal = pyqtSignal() show_data_signal = pyqtSignal() fresh_datetime_signal = pyqtSignal() def __init__(self): super(UI, self).__init__() self.setupUi(self) self.resize(1000, 600) self.fresh_btn.clicked.connect(lambda : Thread(target=self.on_fresh).start()) self.canvas = myFigure(self.plot_widget) self.draw_signal.connect(self.canvas.set_mat_func) self.modify_window_title_signal.connect(self.set_window_title) self.canvas.mpl_connect('motion_notify_event', self.on_motion_notify_event) self.start_draw_btn.clicked.connect(lambda :Thread(target=self.start_draw).start()) self.start_draw_btn.clicked.connect(self.timer_start) self.start_draw_btn.clicked.connect(self.timer_stop) self.show_data_signal.connect(self.show_data) self.fresh_datetime_signal.connect(self.fresh_datetime) self.x = pd.Series([],dtype=object) self.y = pd.Series([], dtype=float) self.y1 = pd.Series([], dtype=float) self.layout = QVBoxLayout(self.plot_widget) self.layout.addWidget(self.canvas) self.total_row = 0 self.show_cpu = True self.show_mem = True self.init_ui() self.timer = QTimer() self.timer.timeout.connect(self.set_data) def timer_start(self): if self.timer_flag == True: self.timer_interval_func() self.timer.start(1000 * 60 * int(self.timer_interval_value)) def timer_stop(self): if self.timer_flag == False: self.timer.stop() def start_draw(self): self.ip = self.lineEdit.text().strip() if len(self.ip) == 0: return self.sheet_name = self.ip if self.start_draw_btn.text().strip() == '开始画图': self.timer_flag = True self.lineEdit.setEnabled(False) self.timer_interval_comboBox.setEnabled(False) self.start_draw_btn.setText('结束画图') self.set_data() else: self.timer_flag = False self.start_draw_btn.setText('开始画图') self.lineEdit.setEnabled(True) self.timer_interval_comboBox.setEnabled(True) def fresh_datetime(self): self.start_dateTimeEdit.setDate(QDate.currentDate()) self.start_dateTimeEdit.setTime(QTime(00, 00, 00)) self.end_dateTimeEdit.setDate(QDate.currentDate()) self.end_dateTimeEdit.setTime(QTime(23, 59, 59)) def set_window_title(self): self.ip = self.lineEdit.text() window_title = 'CPU/内存监控' if len(self.ip) != 0: window_title = window_title + ' - ' + self.ip self.setWindowTitle(window_title) def timer_interval_func(self): timer_interval = self.timer_interval_comboBox.currentText() dict_time = {"2分钟": 2, "5分钟": 5, "10分钟": 10, "30分钟": 30, "1小时": 60, "2小时": 120} self.timer_interval_value = dict_time[timer_interval] def init_ui(self): self.modify_window_title_signal.emit() self.fresh_datetime_signal.emit() self.xy_data_lbl.setText('数据坐标:\nX:\nY:\n') self.draw_signal.emit(self.x, self.y, self.y1, self.show_cpu, self.show_mem) self.canvas.fig.suptitle('CPU/内存使用率实时趋势', fontsize=10) self.show_data_signal.emit() def show_data(self): self.date_range_start = '' self.date_range_end = '' self.query_date() if len(self.x) <= 1: show_data_num = 0 self.total_row = 0 self.date_range_start = 0 self.date_range_end = 0 else: show_data_num = len(self.x) self.total_row -= 1 self.total_data_lbl.setText('显示数据:%s\n总数据:%s\n开始日期:%s\n结束日期:%s' % (show_data_num, self.total_row, self.date_range_start, self.date_range_end)) def on_motion_notify_event(self, event): ''' 功能:鼠标移动显示数据坐标轴上的x,y值 :param event: :return: ''' if event.xdata == None or event.ydata == None: return x = dates.num2date(event.xdata).strftime("%Y/%m/%d %H:%M") y = event.ydata.astype(int) x_values = self.x.values y_values = self.y.values y1_values = self.y1.values str_x = [str(x_values[i]) for i in range(len(x_values))] int_y = [y_values[j].astype(int) for j in range(len(y_values))] int_y1 = [y1_values[j].astype(int) for j in range(len(y1_values))] if x in str_x: if y in int_y: self.xy_data_lbl.setText('数据坐标:\nX:%s\nY:%s\n' %(x, y)) elif y in int_y1: self.xy_data_lbl.setText('数据坐标:\nX:%s\nY:%s\n' % (x, y)) else: self.xy_data_lbl.setText('数据坐标:\nX:\nY:\n') else: self.xy_data_lbl.setText('数据坐标:\nX:\nY:\n') def on_fresh(self): self.modify_window_title_signal.emit() self.ip = self.lineEdit.text().strip() if len(self.ip) == 0: return self.sheet_name = self.ip if not os.path.exists(data_file): return readbook = xlrd.open_workbook(data_file) # 判断工作表是否存在 if not self.sheet_name in readbook.sheet_names(): return self.get_data() self.draw_signal.emit(self.x, self.y, self.y1, self.show_cpu, self.show_mem) def write_content(self, sheet): sheet.write(0, 0, '日期') sheet.write(0, 1, 'cpu使用率') sheet.write(0, 2, '内存使用率') def create_sheet(self): if not os.path.exists(data_file): writebook = xlwt.Workbook(data_file) sheet = writebook.add_sheet(self.sheet_name) self.write_content(sheet) writebook.save(data_file) else: readbook = xlrd.open_workbook(data_file) # 判断工作表是否存在 if not self.sheet_name in readbook.sheet_names(): new_readbook = copy(readbook) sheet = new_readbook.add_sheet(self.sheet_name) self.write_content(sheet) new_readbook.save(data_file) def get_telnet_data(self, ip): ''' 函数功能:获取ipc设备剩余系统内存,free -m ''' username = '用户名' password = '密码' mem_command = "free -m | grep Mem: | grep -v grep | awk -F ' ' '{print $3/$2 FS}'" command = "top -n 8 | grep \进程名 | grep -v grep | awk -F ' ' '{print $7 FS}'" self.telnet_client = TelnetClient() try: if self.telnet_client.login_host(str(ip), username, password): # print(u'\ntelnet成功,正在操作...') command_result = self.telnet_client.execute_some_command(command, 60) strcommand_result = str(command_result.encode('utf-8')) cmdstr = strcommand_result.split('\\r\\n')[2:-1] cmdstr = ('\n'.join(cmdstr)).strip() # print(u'系统占用CPU:{}'.format(cmdstr)) mem_result = self.telnet_client.execute_some_command(mem_command, 10) self.telnet_client.logout_host() # print(u'telnet完成') return cmdstr, mem_result else: print(u'\ntelnet失败 ') return except: return def get_file_status(self): if not os.path.exists(data_file): return try: readbook = xlrd.open_workbook(data_file) # 判断工作表是否存在 if not self.sheet_name in readbook.sheet_names(): return row = readbook.sheet_by_name(self.sheet_name).nrows self.total_row = row return 1 except: pass def write_data(self): try: self.create_sheet() readbook = xlrd.open_workbook(data_file) row = readbook.sheet_by_name(self.sheet_name).nrows self.total_row = row new_excel = copy(readbook) sheet = new_excel.get_sheet(self.sheet_name) except: print('文件访问失败') return 1 data = '' data_mem = '' try: res, res_mem = self.get_telnet_data(self.ip) data_mem = res_mem.split('\r\n')[1][2:4] data_list = [] for i in res.split(): i = i.strip() if '%' in i: i = i[:-1] data_list.append(float(i)) data = max(data_list) except Exception as e: print('get telnet data failed, cpu: %s, mem: %s' % (data,data_mem)) print(e) return 1 # 为测试,造数据 time_result = datetime.now().strftime("%Y/%m/%d %H:%M") # data = random.randint(0, 70) # data_mem = random.randint(0, 80) sheet.write(row, 0, time_result) sheet.write(row, 1, data) sheet.write(row, 2, data_mem) new_excel.save(data_file) def query_date(self): if self.get_file_status() != 1: return df1 = pd.read_excel(data_file, sheet_name=self.sheet_name) df1 = df1.sort_values(by='日期', ascending=True) df1 = df1.set_index('日期', drop=True) date_range = df1.index if len(date_range) >= 2: self.date_range_start = date_range[0][:10] self.date_range_end = date_range[len(date_range) - 1][:10] def get_data(self): self.get_file_status() start_time = self.start_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm") end_time = self.end_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm") # 判断开始时间小于结束时间 d_start_time = datetime.strptime(start_time,"%Y/%m/%d %H:%M") d_end_time = datetime.strptime(end_time,"%Y/%m/%d %H:%M") if d_start_time >= d_end_time: self.fresh_datetime_signal.emit() start_time = self.start_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm") end_time = self.end_dateTimeEdit.dateTime().toString("yyyy/MM/dd hh:mm") df = pd.read_excel(data_file, sheet_name=self.sheet_name) # 数据清洗,缺失值的行要作删除处理,整行为空删除, 日期重复删除,重置索引 df.dropna(inplace=True) df = df.drop_duplicates(['日期'], keep='last').reset_index(drop=True) df = df.sort_values(by='日期', ascending=True) # 设置日期为索引, 然后获取某个区间数据 df = df.set_index('日期', drop=True) df = df[start_time:end_time] self.x = df.index self.cur_text = self.select_cbox.currentText() self.show_cpu = True self.show_mem = True if self.cur_text == '显示CPU': self.show_cpu = True self.show_mem = False elif self.cur_text == '显示内存': self.show_mem = True self.show_cpu = False self.y = df['cpu使用率'] self.y1 = df['内存使用率'] self.show_data_signal.emit() def get_cpu(self): if self.write_data() == 1: return self.get_data() def fresh_date_range(self): # 功能:为了在新的一天自动 start_time = datetime.strptime(str(datetime.now().date()) + '0:00', '%Y-%m-%d%H:%M') end_time = datetime.strptime(str(datetime.now().date()) + '3:00', '%Y-%m-%d%H:%M') now_time = datetime.now() # 判断当前时间是否在范围时间内 if start_time < now_time < end_time: self.fresh_datetime_signal.emit() self.on_fresh() def set_data(self): self.modify_window_title_signal.emit() self.fresh_date_range() self.create_sheet() readbook = xlrd.open_workbook(data_file) row = readbook.sheet_by_name(self.sheet_name).nrows self.total_row = row self.get_cpu() self.draw_signal.emit(self.x, self.y, self.y1, self.show_cpu, self.show_mem) if __name__ == '__main__': app = QApplication([]) server = UI() server.show() sys.exit(app.exec_())