我正在创建一个用于管理一些服务器的界面,基本功能包括重新启动服务等等。我使用
当我在
谢谢。
QTCreator
制作了此界面,并采用PyQT5
进行编程。它正常工作(有时候)。但是有时候会出现Segmentation Fault
或者QObject::connect: Cannot queue arguments of type 'QTextCursor'(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
的问题。当我在
MainWindow
中点击restart_nginx
时会发生这种情况,可能是线程管理方面的某些问题,这是我第一次使用PyQT/QT
进行开发。谢谢。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import paramiko
import threading
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from ui_mainwindow import Ui_MainWindow
servers = {
"Mars": "198.58.112.***",
"Saturn": "198.58.116.***"
}
green = "rgb(83, 236, 17)"
default = "rgb(154, 154, 154)"
yellow = "yellow"
red = "red"
pw = 'pass'
def format_status(color):
return "background-color: " + color + "; border: 1px solid black;"
class Worker(QObject):
def __init__(self, ui, server, command=None, sudo=False, *args, **kwargs):
QObject.__init__(self, *args, **kwargs)
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ui = ui
self.command = command
self.sudo = sudo
self.server = server
finished = pyqtSignal()
@pyqtSlot()
def execute(self):
self.ui.status_restart_nginx.setStyleSheet(format_status(color=yellow))
try:
self.ssh.connect(self.server, username='hercules', password=pw)
except paramiko.SSHException as e:
self.ui.log.append("ERRO: Impossible to connect: %s", e)
self.ui.status_restart_nginx.setStyleSheet(format_status(color=red))
try:
session = self.ssh.get_transport().open_session()
session.get_pty()
f = session.makefile()
session.exec_command("ls -lh")
#if self.sudo:
# session.send(pw + '\n')
for line in f.readlines():
self.ui.log.append(line)
f.close()
self.ssh.close()
self.ui.status_restart_nginx.setStyleSheet(format_status(color=green))
except Exception as e:
self.ui.status_restart_nginx.setStyleSheet(format_status(color=red))
print 'errinho: ', e
self.finished.emit()
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None, **kwargs):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.btn_restart_nginx.clicked.connect(self.restart_nginx)
self.thread_worker = None
self.obj_worker = None
def create_worker(self, server, command=None, sudo=False):
self.thread_worker = QThread(parent = self)
self.obj_worker = Worker(ui = self, server = server, command = command, sudo = sudo)
self.obj_worker.moveToThread(self.thread_worker)
self.obj_worker.finished.connect(self.thread_worker.quit)
self.thread_worker.started.connect(self.obj_worker.execute)
self.thread_worker.start()
def restart_nginx(self):
self.status_restart_nginx.setStyleSheet(format_status(color=yellow))
self.log.append("(Mars) Nginx: trying to restart front-end...")
self.create_worker(servers["Mars"], command = "sudo service nginx restart", sudo = True)
if __name__=="__main__":
from sys import argv, exit
app = QApplication(argv)
m = MainWindow()
m.show()
m.raise_()
exit(app.exec_())