0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用PyQt5设计下载远程服务器日志文件程序

OSC开源社区 来源:OSC开源社区 作者:OSC开源社区 2022-11-15 11:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。

PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI 库之一,使用 PyQt5 我们能够很容易的开发桌面应用,接下来我们将用它来开发一个下载服务器日志文件的小程序。

前期准备

软件- QT5Python 模块- PyQt5==5.15.7- paramiko==2.9.2PyCharm 添加扩展工具 PyUICPyUIC 扩展用于将使用 Qt Designer 生成的 ui 文件转成 py 文件,可以在 PyCharm 中通过 Preferences-Tools-External Tools 进行配置,截图如下:dcd4c4c8-6495-11ed-8abf-dac502259ad0.png
Program:/Users/macbookpro/workspace/projects/DownloadServerLog/venv/bin/python3.9
Arguments:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
Working directory:/Users/macbookpro/workspace/projects/DownloadServerLog/ui

实操步骤

1. 创建项目

创建 DownloadServerLog 项目,设计程序结构如下:
DownloadServerLog
├── app
│   ├── downloadlog.py
│   └── downloadlog_qtui.py
├── main.py
└── ui
│   └── downloadlog_qtui.ui
├── .env
main.py 作为程序入口文件,.env 存放环境变量,ui 存放使用 Qt Designer 设计界面导出的源码文件,app 存放下载程序文件。

2.使用 QtDesigner设计界面

Qt Designer 使用起来非常简单,可以通过“拖拉拽”的形式生成 UI 界面(文档:https://doc.qt.io/qtcreator/creator-using-qt-designer.html),设计界面如下:dced860c-6495-11ed-8abf-dac502259ad0.png这个程序功能一目了然,左侧几个输入框用于输入必要的信息,右侧一个展示框用于展示程序实时日志。界面设计好后可以将其保存至项目 DownloadServerLog 下的 ui 目录下 downloadlog_qtui.ui,供后续使用。

3. 使用 ui 生成对应的 py 文件

使用 PyCharm 打开项目,在 downloadlog_qtui.ui 文件上右键,选择 External Tools 使用 PyUIC 根据 ui 文件生成对应的 py 文件 downloadlog_qtui.py,将文件存放至 app 目录。dcfed6dc-6495-11ed-8abf-dac502259ad0.png    

4. 新建 main.py 作为程序入口

在项目根目录下创建 main.py 文件:
import sys


from PyQt5 import QtCore
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from threading import Thread


from app.downloadlog_qtui import Ui_Dialog
from app.downloadlog import DownloadLog




class CommunicateSignal(QObject):
    text_print = pyqtSignal(str)




# MyWindow 是主窗口程序,继承自 PyQt5.QtWidgets.QMainWindow
# 和通过 ui 文件生成的 downloadlog_qtui.py 中的 Ui_Dialog 类
class MyWindow(QMainWindow, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.btn_download.clicked.connect(self.click_download)


        # 自定义信号处理函数
        self.comm_signal = CommunicateSignal()
        self.comm_signal.text_print.connect(self.show_text)


        self.set_window_init_data()


    def set_window_init_data(self):
        """设置程序窗体初始值"""
        # 从 .env 读取环境变量
        result_dict = dict()
        with open('.env', 'r', encoding='utf-8') as f:
            for line in f.readlines():
                key = line.split('=')[0].strip()
                value = line.split('=')[-1].strip()
                result_dict[key] = value


        # 设置输入框值
        _translate = QtCore.QCoreApplication.translate
        self.host.setText(_translate("Dialog", result_dict.get("HOST", '')))
        self.port.setText(_translate("Dialog", result_dict.get("PORT", '22')))
        self.username.setText(_translate("Dialog", result_dict.get("USERNAME", 'root')))
        self.password.setText(_translate("Dialog", result_dict.get("PASSWORD", '')))
        self.directory.setPlainText(_translate("Dialog", result_dict.get("DIRECTORY", '')))
        self.startTime.setDate(QtCore.QDate.currentDate())
        self.endTime.setDate(QtCore.QDate.currentDate())




    def get_window_input_value(self):
        """获取程序各「输入框」组件值"""
        return {
            "host": self.host.text(),
            "port": self.port.text(),
            "username": self.username.text(),
            "password": self.password.text(),
            "directory": self.directory.toPlainText(),
            "start_time": self.startTime.date().toString("yyyy-MM-dd"),
            "end_time": self.endTime.date().toString("yyyy-MM-dd"),
            "suffix": ".log",
        }


    def show_text(self, text):
        """将文本内容追加到程序「展示框」"""
        self.textBrowser.append(text)


    def click_download(self):
        """处理点击「下载」按钮事件"""
        params = self.get_window_input_value()


        def run():
            res = DownloadLog(conn_type='ssh', comm_signal=self.comm_signal, **params)
            res.main()


        t = Thread(target=run)
        t.start()




if __name__ == '__main__':
    app = QApplication(sys.argv)
    myWin = MyWindow()
    myWin.show()
    sys.exit(app.exec_())
MyWindow 作为主窗口程序,程序初始化时会将 self.click_download 方法注册到 下载 按钮的点击事件,并自动调用 self.set_window_init_data 方法来设置输入框初始值。

5. 下载

下载日志程序 DownloadLog 定义在 app/downloadlog.py 中,远程下载文件主要步骤有两步:
  • 通过 SSH 登录远程服务器
  • 通过 FTP 进行文件下载
这里采用 paramiko 来实现远程下载功能,paramiko 是一个纯 Python 库,它实现了 SSHv2 协议,提供了 SSH 和 FTP 的能力。核心代码如下,读者可以根据自己的需求实现 DownloadLog:
class DownloadLog(object):
    def __init__(self, **kwargs):
        """初始化一些参数"""
        ...


    def main(self):
        # 获取 Transport 实例
        tran = paramiko.Transport((self.host, int(self.port)))
        # 连接 SSH 服务端
        tran.connect(username=self.username, password=self.password)
        # 创建 SFTP 实例
        self.sftp = paramiko.SFTPClient.from_transport(tran)
        # 下载文件
        # :param str remotepath: the remote file to copy
        # :param str localpath: the destination path on the local host
        self.sftp.get(remotepath=self.remote_path, localpath=self.local_path)

6. 展示下载过程

为了将下载程序执行步骤实时展示到输出框,这里需要引入 PyQt5 的信号处理机制。由于 PyQt 建议只在主线程中操作界面,可以发现我们在 main.py 中调用 DownloadLog.main 方法时创建了一个新的线程。所有的 GUI 程序都是事件驱动的,事件可能由用户触发,比如点击 下载 按钮事件,也可能由程序触发,比如我们现在要实现的展示下载过程的功能,就需要使用程序主动触发事件。在 PyQt5 中通过 Signal 信号来处理事件,其基本使用步骤如下:自定义一个 CommunicateSignal 类,继承自 PyQt5 的 QObject 类,里面封装自定义的 Signal 信号(Signal 实例对象的初始化参数指定的类型,就是发出信号对象时,传递的参数数据类型。因为 PyQt5 底层是 C++ 开发的,必须指定类型)。
class CommunicateSignal(QObject):
    text_print = pyqtSignal(str)
定义主线程执行的函数处理 Signal 信号(通过 connect 方法绑定)。
# 自定义信号处理函数
self.comm_signal = CommunicateSignal()
self.comm_signal.text_print.connect(self.show_text)
在 DownloadLog 线程需要操作界面的时候,就通过自定义对象(CommunicateSignal)发出信号(使用 emit 方法发出信号),所以在实例化 DownloadLog 时会将 comm_signal 传递进去。
# 通过该信号对象的 emit 方法发出信号,emit 方法的参数传递必要的数据。
# 参数类型遵循定义 Signal 时指定的类型。
self.comm_signal.text_print.emit(text)
主线程信号处理函数,被触发执行,获取 Signal 里面的参数,执行必要的更新界面操作,这里将每次通过事件传过来的文本内容展示到输出框内。
def show_text(self, text):
    """将文本内容追加到程序「展示框」"""
    self.textBrowser.append(text)

7. 效果展示

通过以上步骤我们完成的程序设计,现在可以验证下这个下载日志文件的小程序了:dd328d7e-6495-11ed-8abf-dac502259ad0.png查看下载结果:dd47c644-6495-11ed-8abf-dac502259ad0.png    

总结

我们通过 PyQt5 实现了一个下载远程服务器日志文件的小程序,其实它不止可以用来下载日志,同样可以用来下载其他文件。借助 PyQt5 强大的能力,我们可以通过“拖拉拽”的形式很容易地实现桌面端程序,只需要将原来的 Python 脚本绑定到 UI 程序的事件中,就实现了命令行程序到桌面程序的演进。接下来你可以根据自己的需求来定制自己的桌面小程序啦~

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10093

    浏览量

    90887
  • GUI
    GUI
    +关注

    关注

    3

    文章

    693

    浏览量

    42855

原文标题:【实操日记】使用PyQt5设计下载远程服务器日志文件程序

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    服务器远程连接超时以及拒绝连接的真实缘由和解决办法

    ,这类问题在Linux的SSH、Windows的RDP、数据库连接以及API接口访问中都挺常见。 最常见的情形包含:SSH没办法连接服务器、RDP不能远程登录Windows、数据库端口访问超时、内网服务从外网无法访问、
    的头像 发表于 11-19 15:34 452次阅读

    恒讯科技分析:香港服务器如何远程桌面连接和管理?

    对于选择香港服务器的企业和开发者而言,无论身在何处,稳定、安全地远程连接和管理服务器都是首要任务。恒讯科技将详细解析如何通过远程桌面连接(Windows)和SSH(Linux)等主流方
    的头像 发表于 11-06 14:18 315次阅读

    SSH 远程连接内网 Linux 服务器

    利用 ZeroNews,您可对用内网的 Linux 服务器进行统一的 SSH 远程连接管理,当用户外出时,可通过 ZeroNews 分配的公网域名地址,快速访问企业内部、家庭的 Linux
    的头像 发表于 09-17 19:52 281次阅读
    SSH <b class='flag-5'>远程</b>连接内网 Linux <b class='flag-5'>服务器</b>

    华纳云服务器Linux系统日志集中化管理平台搭建

    在云计算时代,企业运维团队面临服务器数量激增带来的日志管理难题。本文详细解析如何基于Linux系统构建高效的云服务器日志集中化管理平台,涵盖日志
    的头像 发表于 09-12 14:11 353次阅读

    怎样在阿里ECS服务器上架设自己的OpenVPN服务器

    需要自己架设服务器,让现场的IR615路由连接自己的服务器。能通过自己的服务器进行数据采集和远程运维。
    发表于 08-06 06:56

    一文解释清楚云服务器系统盘怎么清除垃圾

    在现代云计算的环境中,云服务器已经成为企业和个人用户的主要选择。在使用云服务器的过程中,用户往往会面临系统盘空间不足的问题,这主要是由于各种应用程序下载文件
    的头像 发表于 07-30 14:28 475次阅读

    远程日志errDump调试功能实战教程:案例驱动的故障排查!

    及Air8101开发板实操验证。   一、errDump功能介绍 1.1 errDump有什么用? errDump是LuatOS系统中的错误日志上报模块,主要用于远程调试与故障诊断。 其原理是将模块运行过程中产生的错误信息或者应用日志
    的头像 发表于 06-09 16:51 534次阅读
    <b class='flag-5'>远程</b><b class='flag-5'>日志</b>errDump调试功能实战教程:案例驱动的故障排查!

    服务器数据恢复—Linux系统服务器崩溃的数据恢复案例

    服务器数据恢复环境: linux操作系统服务器中有一组由4块SAS接口硬盘组建的raid5阵列。 服务器故障: 服务器工作过程中突
    的头像 发表于 05-20 15:46 550次阅读

    基于RV1126开发板限制系统日志大小教程

    无论管理什么系统,对日志文件的监控、调用、管理都是其中重要的一部分。服务器问题的解决都是从查看系统(错误)日志开始的。系统日志是记录系统硬件
    的头像 发表于 04-16 11:18 591次阅读
    基于RV1126开发板限制系统<b class='flag-5'>日志</b>大小教程

    使用PyQt5自动初始化OpenVINO™环境出现报错怎么解决?

    编写了一个程序以使用 PyQt5 自动初始化OpenVINO™环境:从 PyQt5 导入 QtWidgets 导入操作系统 #import时间 导入系统 如果__name__
    发表于 03-07 06:35

    服务器数据恢复—服务器raid5阵列硬盘出现坏道掉线如何恢复服务器数据?

    一台服务器中有一组由16块SAS接口的硬盘组建的raid5阵列。 服务器磁盘阵列中有2块硬盘离线,服务器上跑的应用崩溃。 经过后续的分析发现丢失的数据为虚拟机
    的头像 发表于 02-28 13:20 659次阅读
    <b class='flag-5'>服务器</b>数据恢复—<b class='flag-5'>服务器</b>raid<b class='flag-5'>5</b>阵列硬盘出现坏道掉线如何恢复<b class='flag-5'>服务器</b>数据?

    服务器数据恢复—Zfs文件系统服务器数据恢复案例

    服务器数据恢复环境&故障: 一台zfs文件系统的服务器,管理员误操作删除了服务器上的数据。
    的头像 发表于 01-16 17:27 633次阅读

    Flexus 云服务器 X 实例实践:部署 Alist 文件列表程序

    引言 在当今数字化时代,华为云以其卓越的技术实力和可靠的服务品质成为众多企业和开发者的首选。华为云 Flexus 云服务器 X 实例作为新一代柔性算力云服务器,为我们部署 Alist 文件
    的头像 发表于 01-14 09:31 1444次阅读
    Flexus 云<b class='flag-5'>服务器</b> X 实例实践:部署 Alist <b class='flag-5'>文件</b>列表<b class='flag-5'>程序</b>

    ID读卡Python小程序开发

    PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtCore import Qt, QThread, pyqtSignal, QDateTimefrom
    的头像 发表于 01-10 16:05 769次阅读

    termius如何使用,termius如何使用的过程,linux服务器远程连接的实用教程

    桌面的实用教程。    (一).termius如何使用的过程:    先创建连接,填写服务器信息与认证信息后保存。连接成功后在命令行输入命令操作服务器,如“pwd”查路径等。文件传输时,进入SFTP模式,用“put”上传本地
    的头像 发表于 12-19 11:31 1101次阅读
    termius如何使用,termius如何使用的过程,linux<b class='flag-5'>服务器</b><b class='flag-5'>远程</b>连接的实用教程