在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    9717

    瀏覽量

    87372
  • GUI
    GUI
    +關注

    關注

    3

    文章

    677

    瀏覽量

    40811

原文標題:【實操日記】使用PyQt5設計下載遠程服務器日志文件程序

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    遠程日志errDump調試功能實戰教程:案例驅動的故障排查!

    及Air8101開發板實操驗證。 ? 一、errDump功能介紹 1.1 errDump有什么用? errDump是LuatOS系統中的錯誤日志上報模塊,主要用于遠程調試與故障診斷。 其原理是將模塊運行過程中產生的錯誤信息或者應用日志
    的頭像 發表于 06-09 16:51 ?101次閱讀
    <b class='flag-5'>遠程</b><b class='flag-5'>日志</b>errDump調試功能實戰教程:案例驅動的故障排查!

    手機APP遠程控制,智能家居監測、智能控制系統(STM32L4、服務器、安卓源碼)實例項目打包下載

    手機APP遠程控制,智能家居監測、智能控制系統(STM32L4、服務器、安卓源碼)實例項目打包,推薦下載
    發表于 05-29 21:47

    服務器數據恢復—Linux系統服務器崩潰的數據恢復案例

    服務器數據恢復環境: linux操作系統服務器中有一組由4塊SAS接口硬盤組建的raid5陣列。 服務器故障: 服務器工作過程中突
    的頭像 發表于 05-20 15:46 ?105次閱讀

    基于RV1126開發板限制系統日志大小教程

    無論管理什么系統,對日志文件的監控、調用、管理都是其中重要的一部分。服務器問題的解決都是從查看系統(錯誤)日志開始的。系統日志是記錄系統硬件
    的頭像 發表于 04-16 11:18 ?165次閱讀
    基于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 ?299次閱讀
    <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 ?342次閱讀

    Flexus 云服務器 X 實例實踐:部署 Alist 文件列表程序

    引言 在當今數字化時代,華為云以其卓越的技術實力和可靠的服務品質成為眾多企業和開發者的首選。華為云 Flexus 云服務器 X 實例作為新一代柔性算力云服務器,為我們部署 Alist 文件
    的頭像 發表于 01-14 09:31 ?966次閱讀
    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 ?433次閱讀

    termius如何使用,termius如何使用的過程,linux服務器遠程連接的實用教程

    桌面的實用教程。 ? ?(一).termius如何使用的過程: ? ?先創建連接,填寫服務器信息與認證信息后保存。連接成功后在命令行輸入命令操作服務器,如“pwd”查路徑等。文件傳輸時,進入SFTP模式,用“put”上傳本地
    的頭像 發表于 12-19 11:31 ?650次閱讀
    termius如何使用,termius如何使用的過程,linux<b class='flag-5'>服務器</b><b class='flag-5'>遠程</b>連接的實用教程

    Windows連接P2Link的FTP服務——遠程操作文件

    FTP協議允許用戶通過客戶端軟件連接到FTP服務器,進行文件的上傳、下載、刪除、重命名等操作。P2Link可快速為本地文件目錄提供公網FTP服務
    的頭像 發表于 11-13 11:48 ?636次閱讀
    Windows連接P2Link的FTP<b class='flag-5'>服務</b>——<b class='flag-5'>遠程</b>操作<b class='flag-5'>文件</b>

    如何使用 Mobaxterm 建立 Linux 服務器連接

    不同的會話類型。為了連接到 Linux 服務器,你可以選擇以下會話類型之一: SSH :用于安全地連接到遠程服務器。 Telnet :不安全的連接方式,不推薦使用,
    的頭像 發表于 11-11 09:06 ?1472次閱讀

    服務器數據恢復—raid5陣列+reiserfs文件系統數據恢復案例

    服務器數據恢復環境: 一臺服務器中有一組由4塊SAS硬盤組建的RAID5陣列,上層安裝linux操作系統統。分區結構:boot分區+LVM卷+swap分區(按照順序),LVM卷中劃分了一個
    的頭像 發表于 11-07 13:15 ?470次閱讀

    服務器數據恢復—xfs文件系統服務器數據恢復案例

    某公司一臺服務器,連接了一臺存儲。該服務器安裝linux操作系統,文件系統為xfs。 在運行過程中該服務器出現故障,管理員使用xfs_repair工具試圖對xfs
    的頭像 發表于 08-19 10:49 ?551次閱讀

    如何在阿里ECS服務器上架設自己的OpenVPN服務器

    需要自己架設服務器,讓現場的IR615路由連接自己的服務器。能通過自己的服務器進行數據采集和遠程運維。
    發表于 07-25 06:14
    主站蜘蛛池模板: 久久手机看片你懂的日韩1024 | 成人爽a毛片在线视频网站 成人窝窝午夜看片 | 真实子伦视频不卡 | 九九51精品国产免费看 | 午夜神马 | 国产精品第9页 | 色狠狠狠色噜噜噜综合网 | 欧美一级精品 | 国产色视频网站 | 婷婷丁香色 | 亚洲成人黄色网址 | 国内精品一区二区在线观看 | 成人免费看黄页网址大全 | 成人一二 | 男女透逼视频 | 亚洲羞羞裸色私人影院 | 国产精品久久久久久久久免费 | 久久亚洲国产精品五月天 | china3p单男精品自拍 | 一级特黄性生活大片免费观看 | 亚洲黄色官网 | 天堂bt在线 | 一级黄视频 | 国产精品美女久久久久网 | 成人精品综合免费视频 | 亚洲天堂二区 | 亚洲五月综合网色九月色 | 日本一本高清 | 成人午夜性视频欧美成人 | 欧美日韩性高爱潮视频 | 久久影院朴妮唛 | 精品亚洲综合在线第一区 | 色网站在线看 | 日本黄色录象 | 亚洲一区二区在线视频 | 国产精品亚洲玖玖玖在线靠爱 | 亚洲一区免费在线观看 | 亚洲婷婷综合网 | 亚洲经典乱码在线播 | 欧美大片xxxxbbbb | 午夜看一级特黄a大片黑 |