Esempio n. 1
0
def brain_gc(request):
    """Ensure that brain can be properly garbage collected."""
    keys = (
        'renderer_interactive',
        'renderer_interactive_pyvistaqt',
        'renderer_interactive_pysurfer',
        'renderer',
        'renderer_pyvistaqt',
        'renderer_notebook',
    )
    assert set(request.fixturenames) & set(keys) != set()
    for key in keys:
        if key in request.fixturenames:
            is_pv = \
                request.getfixturevalue(key)._get_3d_backend() == 'pyvistaqt'
            close_func = request.getfixturevalue(key).backend._close_all
            break
    if not is_pv:
        yield
        return
    import pyvista
    if LooseVersion(pyvista.__version__) <= LooseVersion('0.26.1'):
        yield
        return
    from mne.viz import Brain
    ignore = set(id(o) for o in gc.get_objects())
    yield
    close_func()
    # no need to warn if the test itself failed, pytest-harvest helps us here
    try:
        outcome = request.node.harvest_rep_call
    except Exception:
        outcome = 'failed'
    if outcome != 'passed':
        return
    _assert_no_instances(Brain, 'after')
    # We only check VTK for PyVista -- Mayavi/PySurfer is not as strict
    objs = gc.get_objects()
    bad = list()
    for o in objs:
        try:
            name = o.__class__.__name__
        except Exception:  # old Python, probably
            pass
        else:
            if name.startswith('vtk') and id(o) not in ignore:
                bad.append(name)
        del o
    del objs, ignore, Brain
    assert len(bad) == 0, 'VTK objects linger:\n' + '\n'.join(bad)
Esempio n. 2
0
 def __call__(self, gallery_conf, fname):
     import matplotlib.pyplot as plt
     try:
         from pyvista import Plotter
     except ImportError:
         Plotter = None
     reset_warnings(gallery_conf, fname)
     # in case users have interactive mode turned on in matplotlibrc,
     # turn it off here (otherwise the build can be very slow)
     plt.ioff()
     plt.rcParams['animation.embed_limit'] = 30.
     _assert_no_instances(Brain, 'running')  # calls gc.collect()
     if Plotter is not None:
         _assert_no_instances(Plotter, 'running')
     # This will overwrite some Sphinx printing but it's useful
     # for memory timestamps
     if os.getenv('SG_STAMP_STARTS', '').lower() == 'true':
         import psutil
         process = psutil.Process(os.getpid())
         mem = sizeof_fmt(process.memory_info().rss)
         print(f'{time.time() - self.t0:6.1f} s : {mem}'.ljust(22))