У меня очень простой интерфейс PyQt, вкладки и кнопки. Я добавил текстовое поле, чтобы показать результаты выполнения, всплывающие, в фоновом режиме, в другой теме. На моей производственной машине происходит только сегментация, в то время как на разрабатываемых машинах (все виртуальные) работают как положено.
Все машины, как виртуальные, так и физические, представляют собой Ubuntu 16.04.6 LTS из 32 бит. Python2.7, PyQt4, все установлено с apt. (Я должен использовать аппаратное обеспечение, чтобы оно работало только в 32 битах).
Я пытался выполнить код EXACT на разных машинах, и на всех них он работает более или менее хорошо, меньше на производстве, он дает сбой.
import os, sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import pyqtSlot
from PyQt4.QtGui import *
from subprocess import Popen, PIPE
from time import sleep
from nbstreamreader import NonBlockingStreamReader as NBSR
import threading
from time import sleep
class MainWindow(QtGui.QWidget):
textbox=""
def __init__(self):
QtGui.QWidget.__init__(self)
self.setGeometry(0,0, 500,650)
self.setWindowTitle("Xarxa Rescat")
self.setWindowIcon(QtGui.QIcon("icon.png"))
self.resize(500,650)
self.setMinimumSize(500,650)
self.center()
......
self.textbox = QPlainTextEdit(self)
self.textbox.move(20, 20)
self.textbox.resize(280,300)
......
def addText(self, text):
self.textbox.appendPlainText(text)
app = QtGui.QApplication(sys.argv)
frame = MainWindow()
frame.show()
def outputs(nbsrObj,qtframe):
while True:
output = nbsr.readline(0.1)
# 0.1 secs to let the shell output the result
if output is not None:
frame.addText(output)
return
sleep(1)
p = Popen(['sudo', 'ls', '-lisah'],
stdin = PIPE, stdout = PIPE, stderr = PIPE, shell = False, bufsize = 1)
nbsr = NBSR(p.stdout)
t = threading.Thread(target=outputs, args=(nbsr,frame,))
t.start()
sys.exit(app.exec_())
Ожидается: выполнение ls, что мой класс NBSR получит stdout и вызовет функцию addText, которая добавит результат ls в текстовое поле.
Пример работы на виртуальной машине:
На изображении вы можете видеть в терминале, как первое выполнение запускается при ошибке сегментации, которая приводит к автоматическому завершению программы. Это именно то, что всегда происходит со мной на физической машине.