2017-06-14 68 views
3

我有了2個非常簡單的線程的程序:運行與matplotlib原因蟒蛇崩潰線程

  • 一個用於監聽串口
  • 一個用於文本UI

我也有matplotlibanimation在我main()運行。它有一個scope類,它是從matplotlib的例子。

當程序開始運行,它顯示的情節,一切都OK。問題是,只要用戶輸入密鑰,程序崩潰,python就會退出,並帶有致命錯誤。

ui線程與matplotlibscope類無關。如果我刪除創建圖的代碼,ui線程沒有問題,並且程序運行順利。我也注意到matplotlib我的系統上使用tkinter創建窗口。

你有爲什麼matplotlibanimation導致問題的任何提示或經驗?不能線程與matplotlibplot使用嗎?

我在命令行窗口中Windows7Python 2.7運行此。

matplotlib版本:2.0.2 Tkinter版本:8.5

錯誤:

Fatal Python error: GC object already tracked 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

或者這個錯誤:

TclStackFree: incorrect freePtr. Call out of sequence? 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

代碼:

import threading 
import serial 
from matplotlib.lines import Line2D 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

class listner(threading.Thread): 

     def __init__(self,port): 
      threading.Thread.__init__(self) 
      self.sport=None 
      self.is_running=True 
      self.init_port(port) 

     def run(self): 
      print ' Reading from Port' 
      while self.is_running: 
       try: 
        self.sport.read(1) 
       except: 
        print 'Error reading port' 

     def init_port(self,port): 
      print '1' 
      if self.sport==None or not self.sport.is_open : 
       try: 

        self.sport = serial.Serial(port,115200) 
        self.sport.timeout = 1 
        self.sport.reset_input_buffer() 
        self.sport.reset_output_buffer() 
        self.port_open=True 
       except: 
        print " Port error Listener Initing\n",self.port_open,'\n',self.sport 
      else: 
       pass 

     def process(self): 
      pass 


class ui(threading.Thread): 

     def __init__(self): 
      threading.Thread.__init__(self)  
      self.running = True 

     def run(self): 

      print 'Starting UI:\n' 
      while self.running: 
       print ' Enter input ''S'':\n' 
       user = raw_input() 



def main(port): 

     listner_thread = None 
     try: 
      listner_thread = listner(port) 
      listner_thread.start(); 
     except: 
      print "Listener Thread Failed To Start" 
      return 

     ui_thread=None 
     try: 
      ui_thread = ui() 
      ui_thread.start()   
     except: 
      print "UI Thread Failed To Start" 
      return 

     run_charts() 



def run_charts(): 
     fig, (ax1, ax2) = plt.subplots(2, 1) 

     scope1 = Scope(ax1) 
     ani1 = animation.FuncAnimation(fig, scope1.update, emit_ch1, interval=10,blit=True) 

     scope2 = Scope(ax2) 
     ani2 = animation.FuncAnimation(fig, scope2.update, emit_ch2, interval=10,blit=True) 

     plt.show() 

def emit_ch1(): 
    yield 0.001 

def emit_ch2(): 
    yield -0.001 

class Scope(object): 
     def __init__(self, ax, maxt=2, dt=0.02): 
      self.ax = ax 
      self.dt = dt 
      self.maxt = maxt 
      self.tdata = [0] 
      self.ydata = [0] 
      self.line = Line2D(self.tdata, self.ydata) 
      self.ax.add_line(self.line) 
      self.ax.set_ylim(-.009, 0.009) 
      self.ax.set_xlim(0, self.maxt) 

     def update(self, y): 
      t = self.tdata[-1] + self.dt 
      self.tdata.append(t) 
      self.ydata.append(y) 
      self.line.set_data(self.tdata, self.ydata) 
      return self.line, 



if __name__ == '__main__': 
     main('COM11') 
+0

這可能是人們更容易地調試這個,如果你提供的是仍然有這個問題更小例子。請參閱https:// stackoverflow。COM /幫助/ MCVE – timotree

+0

當我在Python把這個代碼中,我得到的錯誤: 'AttributeError的:對象類型「聽者」有listner'' 因爲這行沒有屬性」: 'listner_thread = listner.listner(端口) ' 你確定你所提供的代碼是工作,直到用戶點擊一個鍵的代碼? – timotree

+0

我更新了代碼。這是完全正常工作並重現問題。 –

回答

2

的第一個錯誤,「致命的Python錯誤:GC對象已跟蹤」,2013年被關閉以「CLOSED WONTFIX」狀態,查看Bugzilla的

看來,當它被再次提出的臨時修訂的bug report 2015年[關於DASK]是use a single thread使用此代碼:

import dask 
    dask.set_options(get=dask.async.get_sync) 

,但這個問題實際上dataframe.read_csv問題所在。

問題是eventually solved在大熊貓的更高版本。如果您升級您的matplotlib版本,那麼問題很可能也會通過類似的修復解決。

希望這有助於

+0

感謝您的信息。我猜'Tkinter'有些問題。我跑另一臺機器上相同的代碼,其使用了'MPL WebAgg' GUI框架和它運行平穩。它在瀏覽器中打開圖形,但是這不是所期望的。 –

+1

導入pyplot之前避免窗洞@dandikain插入此行「matplotlib.use(」 AGG的「)」 - [來源](http://matplotlib.org/1.4.2/faq/howto_faq.html#howto-批次)還建議在show()之前保存圖表,例如plt.savefig(「圖」) –

+0

嘗試,並把它一開始,但它並沒有生效,並警告說,我應該把它叫前後情節!(這是我做的,我之前的一切說法。) –