FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Make matplotlib fail more gracefully in headless environments · Issue #6739 · matplotlib/matplotlib · GitHub

Repository navigation

Make matplotlib fail more gracefully in headless environments #6739

Closed

Description

This is reproducible on any headless environment using matplotlib 1.5.1. On my system, the following script:

from matplotlib import pyplot as plt
plt.plot([1, 2], [1, 2])

Will produce the following traceback:

---------------------------------------------------------------------------
TclError                                  Traceback (most recent call last)
<ipython-input-2-8dd816f9ddc7> in <module>()
----> 1 plt.plot([1, 2], [1, 2])

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in plot(*args, **kwargs)
   3145 @_autogen_docstring(Axes.plot)
   3146 def plot(*args, **kwargs):
-> 3147     ax = gca()
   3148     # allow callers to override the hold state by passing hold=True|False
   3149     washold = ax.ishold()

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in gca(**kwargs)
    926     matplotlib.figure.Figure.gca : The figure's gca method.
    927     """
--> 928     return gcf().gca(**kwargs)
    929
    930 # More ways of creating axes:

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in gcf()
    576         return figManager.canvas.figure
    577     else:
--> 578         return figure()
    579
    580

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/pyplot.pyc in figure(num, figsize, dpi, facecolor, edgecolor, frameon, FigureClass, **kwargs)
    525                                         frameon=frameon,
    526                                         FigureClass=FigureClass,
--> 527                                         **kwargs)
    528
    529         if figLabel:

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.pyc in new_figure_manager(num, *args, **kwargs)
     82     FigureClass = kwargs.pop('FigureClass', Figure)
     83     figure = FigureClass(*args, **kwargs)
---> 84     return new_figure_manager_given_figure(num, figure)
     85
     86

/home/goldbaum/.virtualenvs/yt-dev/local/lib/python2.7/site-packages/matplotlib/backends/backend_tkagg.pyc in new_figure_manager_given_figure(num, figure)
     90     """
     91     _focus = windowing.FocusManager()
---> 92     window = Tk.Tk()
     93     window.withdraw()
     94

/usr/lib/python2.7/lib-tk/Tkinter.pyc in __init__(self, screenName, baseName, className, useTk, sync, use)
   1765                 baseName = baseName + ext
   1766         interactive = 0
-> 1767         self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
   1768         if useTk:
   1769             self._loadtk()

TclError: no display name and no $DISPLAY environment variable

I think it would be much nicer if backends somehow detected these sorts of errors, fell back to the Agg backend (probably with a warning) and then goes ahead and makes the plot.

Activity

  1. modified the milestones: , on Jul 14, 2016
  2. tacaswell commented on Jul 14, 2016

    Member

    This is to some degree a configuration/packaging issue. On servers that are known to be headless, the system wide configuration file should be set to Agg as the default backend.

    A way to do this is to require something on the backend be queryable if there are sufficient run-time requirements (which also makes sense for the GUI backends more generally as we do not know until we try if the python wrappers for the backend are even installed).

    This should probably be done in pylab_setup in backend.__init__. Maybe add a function backend_usable( ) -> bool to the backends (and fall back to lambda : True if it does not exist).

  3. WeatherGod commented on Jul 14, 2016

    Member

    One place where this is not a configuration/packaging issue (at least, not
    immediately obvious) is user crontabs. Program works fine from the command
    line, but can then fail in the crontab. Not a hard problem to solve (set
    the MPLBACKEND variable at the top of the crontab to "agg"), but that may
    not be obvious to many people. But a solution of setting the matplotlibrc
    file to "agg" wouldn't be advisable in this situation because the user may
    still want the GUI for their account.

    On Thu, Jul 14, 2016 at 3:47 PM, Thomas A Caswell notifications@github.com
    wrote:

    This is to some degree a configuration/packaging issue. On servers that
    are known to be headless, the system wide configuration file should be set
    to Agg as the default backend.

    A way to do this is to require something on the backend be queryable if
    there are sufficient run-time requirements (which also makes sense for the
    GUI backends more generally as we do not know until we try if the python
    wrappers for the backend are even installed).

    This should probably be done in pylab_setup in backend.init. Maybe
    add a function backend_usable( ) -> bool to the backends (and fall back
    to lambda : True if it does not exist).

    —
    You are receiving this because you are subscribed to this thread.
    Reply to this email directly, view it on GitHub
    #6739 (comment),
    or mute the thread
    https://github.com/notifications/unsubscribe/AARy-P5kjUCMOEfZzoeeN9HfIOBV6TLqks5qVpJcgaJpZM4JMuJE
    .

  4. con-f-use commented on Mar 6, 2017

    As and avid user, I just want to say a built-in fallback should be in place here. +1

    So far I'm using this in my scripts:

    if 'DISPLAY' not in os.environ: matplotlib.use('agg')
    

    Is there a better workaround?

  5. anntzer commented on Jul 30, 2017

    Contributor

    #8613 (comment) would also solve the issue: one would just need to put Agg at the end of the list of backends, rather than having even more specific fallback code.

  6. modified the milestones: , on Oct 3, 2017
  7. modified the milestones: needs sorting, v3.0 on Sep 19, 2018
  8. anntzer commented on Sep 19, 2018

    Contributor

    Closed by #9795 + following PRs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions


      Back | FazBrowse Home | New Git URL