Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

[Bug]: test_other_signal_before_sigint fails with Qt on macOS CI #27984

Copy link
Copy link
Open
@QuLogic

Description

@QuLogic
Issue body actions

Bug summary

We've previously not been installing Qt wrappers such as PyQt6 or PySide. #27723 adds those back, but we have discovered that test_other_signal_before_sigint fails on CI. The subprocess appears to segfault somewhere in the Qt event loop.

I had tried to debug it with c1afbac, but then it stopped failing. Reverting that change then failed again, though one time it passed. So this seems to be fairly flaky.

I went through all CI runs, and found that this is not particularly limited to any parametrization:

      4 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PyQt6-BACKEND_DEPS=PyQt6,cairocffi] _
      3 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PySide6-BACKEND_DEPS=PySide6,cairocffi] _
      3 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PyQt5-BACKEND_DEPS=PyQt5,cairocffi] _
      3 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PyQt6-BACKEND_DEPS=PyQt6] _
      2 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PySide2-BACKEND_DEPS=PySide2,cairocffi] _
      2 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide6-BACKEND_DEPS=PySide6] _
      1 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide2-BACKEND_DEPS=PySide2] _

Unfortunately, I don't think @tacaswell was able to reproduce the crash, and @ksunden was only able to reproduce once, but only as part of a full test suite, and never again later in a smaller run.

So as part of #27723, I've marked these as xfail, but if we can figure out a way to reproduce, we should be able to fix this.

Code for reproduction

pytest -k test_other_signal_before_sigint lib/matplotlib/tests/test_backends_interactive.py

Actual outcome

_ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide6-BACKEND_DEPS=PySide6] _
[gw1] darwin -- Python 3.12.2 /Library/Frameworks/Python.framework/Versions/3.12/bin/python

env = {'BACKEND_DEPS': 'PySide6', 'MPLBACKEND': 'qtagg', 'QT_API': 'PySide6'}
target = 'show', kwargs = {'block': True}
request = <FixtureRequest for <Function test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide6-BACKEND_DEPS=PySide6]>>

    @pytest.mark.skipif(sys.platform == 'win32',
                        reason='No other signal available to send on Windows')
    @pytest.mark.parametrize("env", _get_testable_interactive_backends())
    @pytest.mark.parametrize("target, kwargs", [
        ('show', {'block': True}),
        ('pause', {'interval': 10})
    ])
    def test_other_signal_before_sigint(env, target, kwargs, request):
        backend = env.get("MPLBACKEND")
        if not backend.startswith(("qt", "macosx")):
            pytest.skip("SIGINT currently only tested on qt and macosx")
        if backend == "macosx":
            request.node.add_marker(pytest.mark.xfail(reason="macosx backend is buggy"))
        proc = _WaitForStringPopen(
            [sys.executable, "-c",
             inspect.getsource(_test_other_signal_before_sigint_impl) +
             "\n_test_other_signal_before_sigint_impl("
                f"{backend!r}, {target!r}, {kwargs!r})"])
        try:
            proc.wait_for('DRAW')
            os.kill(proc.pid, signal.SIGUSR1)
            proc.wait_for('SIGUSR1')
            os.kill(proc.pid, signal.SIGINT)
            stdout, _ = proc.communicate(timeout=_test_timeout)
        except Exception:
            proc.kill()
            stdout, _ = proc.communicate()
            raise
        print(stdout)
>       assert 'SUCCESS' in stdout
E       AssertionError

/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/tests/test_backends_interactive.py:790: AssertionError
----------------------------- Captured stdout call -----------------------------

----------------------------- Captured stderr call -----------------------------
Fatal Python error: Segmentation fault

Current thread 0x00000001d88a9c40 (most recent call first):
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/backends/qt_compat.py", line 159 in _exec
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/backends/backend_qt.py", line 633 in start_main_loop
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/backend_bases.py", line 3536 in show
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/pyplot.py", line 590 in show
  File "<string>", line 21 in _test_other_signal_before_sigint_impl
  File "<string>", line 25 in <module>

Extension modules: numpy.core._multiarray_umath, numpy.core._multiarray_tests, numpy.linalg._umath_linalg, numpy.fft._pocketfft_internal, numpy.random._common, numpy.random.bit_generator, numpy.random._bounded_integers, numpy.random._mt19937, numpy.random.mtrand, numpy.random._philox, numpy.random._pcg64, numpy.random._sfc64, numpy.random._generator, PIL._imaging, kiwisolver._cext, PyQt6.QtCore, PyQt6.QtGui, PyQt6.QtWidgets (total: 18)

Expected outcome

Tests pass

Additional information

No response

Operating system

macOS

Matplotlib Version

main

Matplotlib Backend

QtAgg

Python version

3.10 or 3.12

Jupyter version

No response

Installation

git checkout

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      Morty Proxy This is a proxified and sanitized view of the page, visit original site.