分段错误(核心转储),执行一个线程

时间:2012-12-01 18:08:36

标签: python multithreading pyqt

我试图在python中运行一个程序,打开一个程序并从它的stdout读取。当我运行程序代码时,我得到了一个分段错误错误,但是当我将代码放在函数Myfunc中时,它完全可以运行!我不明白发生了什么: 这是我的代码:

class Workspace(QMainWindow, Ui_MainWindow):
    """ This class is for managing the whole GUI `Workspace'.
        Currently a Workspace is similar to a MainWindow
    """

    def __init__(self):
        #p= subprocess.Popen(["java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/', shell=True, stdout=subprocess.PIPE, bufsize= 4024)
        try:
            from Queue import Queue, Empty
        except ImportError:
            while True:
    #from queue import Queue, Empty  # python 3.x
                print "error"

        ON_POSIX = 'posix' in sys.builtin_module_names

        def enqueue_output(out, queue):
            for line in iter(out.readline, b''):
                queue.put(line)
            out.close()

        p= Popen(["java -Xmx256m -jar bin/HelloWorld.jar"],cwd=r'/home/karen/sphinx4-1.0beta5-src/sphinx4-1.0beta5/',stdout=PIPE, shell=True, bufsize= 4024)
        q = Queue()
        t = threading.Thread(target=enqueue_output, args=(p.stdout, q))
        #t = Thread(target=enqueue_output, args=(p.stdout, q))
        t.daemon = True # thread dies with the program
        t.start()

# ... do other things here
        def myfunc(q):
            while True:

                try: line = q.get_nowait()
         # or q.get(timeout=.1)
                except Empty:
                    print('Vacio')
                else: # got line
    # ... do something with line

                    print line  


        thread = threading.Thread(target=myfunc, args=(q,))
        thread.start()

错误:

Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:3)

我最近遇到过同样的问题。我从相关的GUI线程通过子进程调用了很多shell命令,它们正常工作,但是只是拒绝正常工作和段错误。我遇到的不同之处在于我正在尝试从主GUI线程运行它,当我试图发出通常从子线程发出的信号时它就是segfaulting!

我避免segfaulting的解决方案是将需要一些shell参与的对话框部分移动到单独的 QThread ,有效地继承了我的应用程序中其他线程正在使用的相同公共类。问题消失了! QThread 是关键!

代码架构:

class Dialog(QtGui.QDialog):

     def __init__(self):
         ...
         QtCore.QObject.connect(self.ui.listwidget_a, QtCore.SIGNAL("itemClicked(QListWidgetItem)", self.do_work)
         ...

     def do_work(self, qlistwidgetitem):
         ...
         wc = WorkerClass(str(qlistwidgetitem.text()))
         wc.start()
         wc.wait()
         my_result = wc.getResult()


 class WorkerClass(CommonClass):
     string = ""
     result = ""
     def __init__(string)
         super(WorkerClass, self).__init__()
         self.string = string

     def run():
         self.execute_shell(self.string)
         self.result = self.shell_output

     def get_result(self):
         return self.result

  class CommonClass(QtCore.QThread):

     self.shell_output = ""

     def execute_shell(string):
         ...
         p = Popen(...)
         self.shell_output, self.shell_error = p.communicate()
         self.output_ready.emit(self.shell_output) 
# that last line is where i was segfaulting 
# before I made WorkerClass (my dialog class was 
# inherinting CommonClass directly but it wasn't 
# working in separate thread) 

我希望这会有所帮助!