Title: Matplotlib picks a headless backend on Linux if Wayland is available but X11 isn't · Issue #18377 · matplotlib/matplotlib · GitHub
Open Graph Title: Matplotlib picks a headless backend on Linux if Wayland is available but X11 isn't · Issue #18377 · matplotlib/matplotlib
X Title: Matplotlib picks a headless backend on Linux if Wayland is available but X11 isn't · Issue #18377 · matplotlib/matplotlib
Description: Bug report Bug summary I've been running code using Matplotlib on a Linux computer using a Wayland compositor with X11 disabled. The environment variable DISPLAY is thus not present, although WAYLAND_DISPLAY (or WAYLAND_SOCKET) are. Matp...
Open Graph Description: Bug report Bug summary I've been running code using Matplotlib on a Linux computer using a Wayland compositor with X11 disabled. The environment variable DISPLAY is thus not present, although WAYLA...
X Description: Bug report Bug summary I've been running code using Matplotlib on a Linux computer using a Wayland compositor with X11 disabled. The environment variable DISPLAY is thus not present, although W...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/18377
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Matplotlib picks a headless backend on Linux if Wayland is available but X11 isn't","articleBody":"\u003c!--To help us understand and resolve your issue, please fill out the form to the best of your ability.--\u003e\r\n\u003c!--You can feel free to delete the sections that do not apply.--\u003e\r\n\r\n### Bug report\r\n\r\n**Bug summary**\r\n\r\nI've been running code using Matplotlib on a Linux computer using a Wayland compositor with X11 disabled. The environment variable DISPLAY is thus not present, although WAYLAND_DISPLAY (or WAYLAND_SOCKET) are. Matplotlib falls back to a headless backend (agg), even though a working display system (Qt5Agg) is available.\r\n\r\n\u003c!--A short 1-2 sentences that succinctly describes the bug--\u003e\r\n\r\n**Code for reproduction**\r\n\r\nAny simple code that uses plt.show() should exhibit this behavior.\r\n\r\n```python\r\nimport matplotlib.pyplot as plt\r\nimport matplotlib\r\nprint(matplotlib.get_backend())\r\nplt.plot([1,2],[3,4])\r\nplt.show()\r\n```\r\n\r\n**Actual outcome**\r\n\r\nNo window appears, code prints \"agg\".\r\n\r\n**Expected outcome**\r\n\r\nExpect a window with the plot to appear, code prints \"Qt5Agg\"\r\n\r\n\u003c!--A description of the expected outcome from the code snippet--\u003e\r\n\u003c!--If this used to work in an earlier version of Matplotlib, please note the version it used to work on--\u003e\r\n\r\n**Matplotlib version**\r\n\r\n\u003c!--Please specify your platform and versions of the relevant libraries you are using:--\u003e\r\n * Operating system: Linux\r\n * Matplotlib version: 3.3.1\r\n * Python version: 3.8.5\r\n * Wayland compositor: tested with Sway, or Weston\r\n * Installed via package manager\r\n\r\n**Current workaround:**\r\n\r\nTo ensure that a GUI backend is selected, instead of a headless one:\r\n```diff\r\ndiff -r /usr/lib/python3.8/site-packages/matplotlib/cbook/__init__.py ./cbook/__init__.py\r\n74c74\r\n\u003c if sys.platform.startswith(\"linux\") and not os.environ.get(\"DISPLAY\"):\r\n---\r\n\u003e if sys.platform.startswith(\"linux\") and not os.environ.get(\"DISPLAY\") and not os.environ.get(\"WAYLAND_DISPLAY\") and not os.environ.get(\"WAYLAND_SOCKET\"):\r\n```\r\nWhy do I check for WAYAND_DISPLAY or WAYLAND_SOCKET to be set, instead of removing this line? It turns out that if these are unset, libwayland (and thus toolkits using it) will by default try to connect to the display \"wayland-0\". This behavior is horrible when one uses computers with multiple sessions, graphical and not, running, because a script run from an ssh connection might (or might not) lock up and accidentally display something on a monitor in another building.\r\n\r\nTo ensure that the Qt5Agg backend loads, remove the extra check for DISPLAY's presence. (The code dates back to https://github.com/matplotlib/matplotlib/commit/9bed01614814b2bc76d32110e1c6a3f9aa773971 and https://github.com/matplotlib/matplotlib/commit/5c222dfe49dbb9e760e09150fef3d4c01783e3bb, where apparently trying and failing to open a Qt4 window was fatal; maybe newer Qt versions let us use the standard try-except approach?)\r\n\r\n```diff\r\ndiff -r /usr/lib/python3.8/site-packages/matplotlib/backends/backend_qt5.py backend_qt5.py\r\n105,120d104\r\n\u003c # check for DISPLAY env variable on X11 build of Qt\r\n\u003c if QtCore.qVersion() \u003e= \"5.\":\r\n\u003c try:\r\n\u003c importlib.import_module(\r\n\u003c # i.e. PyQt5.QtX11Extras or PySide2.QtX11Extras.\r\n\u003c f\"{QtWidgets.__package__}.QtX11Extras\")\r\n\u003c is_x11_build = True\r\n\u003c except ImportError:\r\n\u003c is_x11_build = False\r\n\u003c else:\r\n\u003c is_x11_build = hasattr(QtGui, \"QX11Info\")\r\n\u003c if is_x11_build:\r\n\u003c display = os.environ.get('DISPLAY')\r\n\u003c if display is None or not re.search(r':\\d', display):\r\n\u003c raise RuntimeError('Invalid DISPLAY variable')\r\n\u003c \r\n```\r\n\r\n\r\n","author":{"url":"https://github.com/mstoeckl","@type":"Person","name":"mstoeckl"},"datePublished":"2020-08-30T03:50:28.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/18377/matplotlib/issues/18377"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:a2f3b19e-f108-7a74-0246-494fb15b7272 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 82D4:323BC4:471F8D:5D94C6:6A52FEDD |
| html-safe-nonce | 54fca39945a1e8c394970353551c87860e23ab16dbcbb7c267dc3612657f4b4f |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI4MkQ0OjMyM0JDNDo0NzFGOEQ6NUQ5NEM2OjZBNTJGRUREIiwidmlzaXRvcl9pZCI6IjM0MDM2NTgyMTI1OTA5NDM5NjUiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | ccbb2e2a32c84c623751e28646a71f8e5863f03d6a9a656506c86b7bdfad1e60 |
| hovercard-subject-tag | issue:688647342 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/18377/issue_layout |
| twitter:image | https://opengraph.githubassets.com/1dbb459adff1ab25eb216b1dd20a4af62099ea8e3595cd43cbe12a67e22899e6/matplotlib/matplotlib/issues/18377 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/1dbb459adff1ab25eb216b1dd20a4af62099ea8e3595cd43cbe12a67e22899e6/matplotlib/matplotlib/issues/18377 |
| og:image:alt | Bug report Bug summary I've been running code using Matplotlib on a Linux computer using a Wayland compositor with X11 disabled. The environment variable DISPLAY is thus not present, although WAYLA... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | mstoeckl |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width