Python PyQT分段错误(有时)

Python PyQT分段错误(有时),python,multithreading,qt,pyqt,pyqt5,Python,Multithreading,Qt,Pyqt,Pyqt5,我正在创建一个界面来管理一些服务器,基本功能如重新启动服务,我在QTCreator中创建了界面,在PyQT5中编程,它工作正常(有时) 有时它也能正常工作,但有时我会遇到分段错误或QObject::connect:无法对“QTextCursor”类型的参数进行排队 (确保使用qRegisterMetaType()注册了“QTextCursor”。 当我在main窗口中点击restart\u nginx时会发生这种情况,可能是线程管理有问题,这是我使用的第一个项目PyQT/QT 多谢各位 #/us

我正在创建一个界面来管理一些服务器,基本功能如重新启动服务,我在
QTCreator
中创建了界面,在
PyQT5
中编程,它工作正常(有时)

有时它也能正常工作,但有时我会遇到
分段错误
QObject::connect:无法对“QTextCursor”类型的参数进行排队
(确保使用qRegisterMetaType()注册了“QTextCursor”。

当我在
main窗口中点击
restart\u nginx
时会发生这种情况,可能是线程管理有问题,这是我使用的第一个项目
PyQT/QT

多谢各位

#/usr/bin/env python
#-*-编码:utf-8-*-
从未来导入unicode文字
进口帕拉米科
导入线程
从PyQt5.QtCore导入*
从PyQt5.QtGui导入*
从PyQt5.QtWidgets导入*
从ui\u主窗口导入ui\u主窗口
服务器={
“火星”:“198.58.112.**”,
“土星”:“198.58.116.**”
}
绿色=“rgb(8323617)”
default=“rgb(154154154154)”
黄色=“黄色”
red=“red”
pw=‘通过’
def格式_状态(颜色):
返回“背景色:+颜色+”;边框:1px纯黑色
班级工作人员(QObject):
def u uu init uuuuu(self、ui、server、command=None、sudo=False、*args、**kwargs):
QObject.\uuuuu初始化(self,*args,**kwargs)
self.ssh=paramiko.SSHClient()
self.ssh.set_缺少主机_密钥_策略(paramiko.AutoAddPolicy())
self.ui=ui
self.command=命令
self.sudo=sudo
self.server=server
finished=pyqtSignal()
@pyqtSlot()
def执行(自我):
self.ui.status\u restart\u nginx.setStyleSheet(格式\u status(颜色=黄色))
尝试:
self.ssh.connect(self.server,username='hercules',password=pw)
除了paramiko.SSHException作为e:
self.ui.log.append(“错误:无法连接:%s”,e)
self.ui.status\u restart\u nginx.setStyleSheet(格式\u status(颜色=红色))
尝试:
session=self.ssh.get_transport().open_session()
session.get_pty()
f=session.makefile()
session.exec_命令(“ls-lh”)
#如果self.sudo:
#session.send(pw+'\n')
对于f.readlines()中的行:
self.ui.log.append(第行)
f、 关闭()
self.ssh.close()
self.ui.status\u restart\u nginx.setStyleSheet(格式\u status(颜色=绿色))
例外情况除外,如e:
self.ui.status\u restart\u nginx.setStyleSheet(格式\u status(颜色=红色))
打印“errinho:”,e
self.finished.emit()
类主窗口(QMainWindow、Ui\u主窗口):
def uuu init uuuu(self,parent=None,**kwargs):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.setupUi(self)
self.btn\u restart\u nginx.clicked.connect(self.restart\u nginx)
self.thread\u worker=无
self.obj_worker=无
def create_worker(self、server、command=None、sudo=False):
self.thread\u worker=QThread(父线程=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\u worker.started.connect(self.obj\u worker.execute)
self.thread\u worker.start()
def重启_nginx(自):
self.status\u restart\u nginx.setStyleSheet(格式\u status(颜色=黄色))
self.log.append(“(Mars)Nginx:正在尝试重新启动前端…”)
self.create_worker(服务器[“Mars”],命令=“sudo service nginx restart”,sudo=True)
如果名称=“\uuuuu main\uuuuuuuu”:
从系统导入argv中退出
app=QApplication(argv)
m=主窗口()
m、 show()
m、 提出()
退出(app.exec_389;()

切勿尝试在工作线程内更改GUI。只能从主GUI线程中更新GUI,不要将对GUI元素的引用传递给工作线程

GUI线程和工作线程之间最简单、最安全的通信方式是发出。当信号以这种方式发送时,它们将排队,一旦控制返回到它的事件循环,就会在接收器的线程中调用插槽


在PyQt中,通常建议在跨线程进行连接时使用,原因如下。

可能先用谷歌搜索错误信息;)