21

I'm using flask, matplotlib to save image and tensorflow to create a session. I'm getting the above error when I run the following code. Does the flask route run on a separate thread? How can I make fig.saveFig piece of code run on the Main thread. Thanks a lot

 @app.route('/open', methods = ['GET', 'POST'])
 def sendOutput():
     global loss,a2,xP,yP,scale,sess,fig
     test_X,test_Y = own_model.getEvaluateData(scale)
     cost,ans = sess.run([loss,a2],feed_dict={xP:test_X,yP:test_Y})
     d = np.array(ans) - np.array(test_Y)
     val = hist(d,100)
     sess.close()
     fig.saveFig('abc.png') //Errror on this line
Mihir Prabhudesai
  • 221
  • 1
  • 2
  • 3

2 Answers2

67

I was on the same situation, Flask with Matplotlib combo. What worked for me is to specify Agg as Matplotlib backend.

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

# Your code here

You can refer to Matplotlib documentation (Matplotlib in a web application server) for the details.

CpK
  • 781
  • 7
  • 9
  • 12
    Note you need to put this code *before* any other imports, which might be already importing matplotlib or setting the Tkinter backend. – ZeitPolizei Jul 05 '18 at 17:08
  • 5
    This works like a charm, Btw what does `Agg` actually do? – Sundeep Pidugu Nov 22 '19 at 09:20
  • 2
    Hey, thanks for the answer. My code works now but I still get a Warning UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail. Do you know about anything I could do to not get this warning? – Riptide Nov 02 '20 at 10:07
3

apparently this is an issue with TKinter. You don't have your full error message posted (you really should do that), but I'm working on something very similar so I'm 99.9% sure your problem is the same as mine. I'm building an app with tensorflow, flask, blah blah. I get the same error, intermittently (sometimes it works). Here are some links to similar questions. I hope this helps! I think my solution will be moving away from matplotlib.

squalor
  • 33
  • 5