Mayavi: seg falla cuando captura de pantalla de la trama 3D

Creado en 5 sept. 2018  ·  7Comentarios  ·  Fuente: enthought/mayavi

Este archivo: minimal_example_fail.py:

import faulthandler
faulthandler.enable()

from mayavi import mlab
mlab.test_plot3d()
mlab.screenshot()

falla con la siguiente pila:

$ python minimal_example_fail.py 
Fatal Python error: Segmentation fault

Current thread 0x00007f2c3107e740 (most recent call first):
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/tvtk/tvtk_base.py", line 568 in _wrap_call
  File "tvtk_classes/open_gl_render_window.py", line 79 in get_pixel_data
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/mayavi/tools/figure.py", line 348 in screenshot
  File "minimal_example_fail.py", line 15 in <module>
Segmentation fault (core dumped)

Reproducir:

$ conda deactivate
$ conda create -n test python=3.6 numpy "pyqt>=5" matplotlib traits pyface traitsui
$ conda activate test
$ pip install vtk
$ pip install mayavi
$ python minimal_example_fail.py

@larsoner @agramfort

Comentario más útil

¿Puede confirmar que esta modificación corrige las cosas?

from pyface.api import GUI
from mayavi import mlab
mlab.test_plot3d()
GUI().process_events()
mlab.screenshot()

O un caparazón de una sola línea:

python -c "from pyface.api import GUI; from mayavi import mlab; mlab.test_plot3d(); GUI().process_events(); mlab.screenshot()"

Básicamente, sospecho que el problema es que el bucle de eventos no se inicia y, por lo tanto, el sistema se encuentra en un estado no representado por completo cuando se intenta la captura de pantalla.

Trabajamos alrededor de esto en PySurfer forzando el renderizado con este pequeño truco GUI .

@prabhuramachandran asumiendo que esto soluciona las cosas, es posible que haya alguna forma de verificar si el contexto OpenGL (o alguna otra cosa) es realmente válido antes de intentar la captura de pantalla, y si no lo es, use este truco / truco para procesar eventos para que se convierta en válido. Sin embargo, parece un poco dudoso / demasiado hacky, así que tal vez no valga la pena.

Todos 7 comentarios

No puedo reproducir esto, pero hay otro problema con el que me encuentro. El problema es que la ventana tiene un tamaño cero. Esto es realmente un problema de Qt ya que el mainloop no se está ejecutando. ¿Puedes probar esto en una sesión de IPython con %gui qt y ver?

¿Es esto lo que quieres decir?

$ ipython 
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 17:14:51) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: %gui qt

In [2]: %run ./minimal_example_fail.py
Qt WebEngine seems to be initialized from a plugin. Please set Qt::AA_ShareOpenGLContexts using QCoreApplication::setAttribute before constructing QGuiApplication.
Fatal Python error: Segmentation fault

Thread 0x00007fb7eef88700 (most recent call first):
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/threading.py", line 295 in wait
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/threading.py", line 551 in wait
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/history.py", line 829 in run
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/history.py", line 58 in needs_sqlite
  File "<decorator-gen-24>", line 2 in run
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/threading.py", line 916 in _bootstrap_inner
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/threading.py", line 884 in _bootstrap

Current thread 0x00007fb7f5710740 (most recent call first):
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/tvtk/tvtk_base.py", line 568 in _wrap_call
  File "tvtk_classes/open_gl_render_window.py", line 79 in get_pixel_data
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/mayavi/tools/figure.py", line 348 in screenshot
  File "/home/maximilien.chaumon/owncloud/Lab/Projects/CTPS/code/minimal_example_fail.py", line 15 in <module>
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/utils/py3compat.py", line 188 in execfile
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2527 in safe_execfile
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/magics/execution.py", line 761 in run
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/magics/execution.py", line 775 in run
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/magic.py", line 187 in <lambda>
  File "<decorator-gen-60>", line 2 in run
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2131 in run_line_magic
  File "<ipython-input-2-f514c016d8ee>", line 1 in <module>
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2963 in run_code
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2909 in run_ast_nodes
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2785 in _run_cell
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2662 in run_cell
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py", line 476 in interact
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py", line 485 in mainloop
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/terminal/ipapp.py", line 356 in start
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/traitlets/config/application.py", line 658 in launch_instance
  File "/home/maximilien.chaumon/anaconda3/envs/mne/lib/python3.6/site-packages/IPython/__init__.py", line 125 in start_ipython
  File "/home/maximilien.chaumon/anaconda3/envs/mne/bin/ipython", line 11 in <module>
Segmentation fault (core dumped)

Intenté esto en mi máquina ubuntu con VTK-8.1.1 (de pip), Python 3.6.0, mayavi master, pyqt5 5.10.1 y obtengo un error pero no segfault. El error que veo se debe a un problema más profundo que, sin el kit de herramientas de la interfaz de usuario en ejecución, no hay ninguna ventana abierta, por lo que el tamaño de la pantalla sigue siendo cero, pero esto no se produce por defecto. Trabajaré para resolver el otro problema con el tamaño cero, pero desafortunadamente, no puedo reproducir su error de segmentación.

He encontrado un error de segfault similar, si no el mismo, en máquinas OSX y Linux. Pude reducirlo a una posible confirmación de mayavi que causa el error.

fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0 es la primera confirmación incorrecta
cometer fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0
Autor: Prabhu Ramachandran [email protected]
Fecha: viernes 3 de agosto 21:38:13 2018-0400

Modify module manager to work with composite data.

This uses the dataset_adapter code from VTK and requires VTK >= 6.3.

: 04000004000088baad8a26a7fc9d06fc95979441b4cd436e26962eca99efb8a7de37c75d3113fe194c16403b269d M mayavi

Voy a ver si puedo reproducir con un mínimo de @dnacombo
Puedo reproducir usando el ejemplo mínimo, pero solo en mi caja de Linux.

Plataforma: Linux-4.15.0-34-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 | Anaconda, Inc. | (predeterminado, 28 de junio de 2018, 17:14:51) [GCC 7.2.0]
Ejecutable: / home / ktavabi / miniconda3 / envs / mne / bin / python
CPU: x86_64: 24 núcleos
Memoria: 94,4 GB

mne: 0.17.dev0
numpy: 1.15.1 {blas = mkl_rt, lapack = mkl_rt}
scipy: 1.1.0
matplotlib: 2.2.2 {backend = Qt5Agg}

sklearn: 0.19.2
nibabel: 2.4.0dev
mayavi: 4.7.0.dev0 4.6.0 {qt_api = pyqt5}
cupy: No encontrado
pandas: 0.23.4
dipy: 0.15.0dev
vtk: 8.1.1

En mi máquina OSX obtengo diferentes errores, pero no segfault.

Encontré un error de segfault similar / mismo en una máquina diferente pero muy similar 18.04 build con las siguientes especificaciones:

Plataforma: Linux-4.15.0-36-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 | Anaconda, Inc. | (predeterminado, 28 de junio de 2018, 17:14:51) [GCC 7.2.0]
Ejecutable: / home / nordme / miniconda3 / envs / mne / bin / python
CPU: x86_64: 12 núcleos
Memoria: 15,5 GB

mne: 0.17.dev0
numpy: 1.15.2 {blas = mkl_rt, lapack = mkl_rt}
scipy: 1.1.0
matplotlib: 2.2.2 {backend = Qt5Agg}

sklearn: 0.20.0
nibabel: 2.3.0
mayavi: 4.7.0.dev0 {qt_api = pyqt5}
cupy: No encontrado
pandas: 0.23.4
dipy: 0.14.0

Cambiar a la versión a19c710c3f61389d79ed05271584e44f9744f6bc 4.6.0 resolvió el error. LMK si quieres ver el rastro.

¿Puede confirmar que esta modificación corrige las cosas?

from pyface.api import GUI
from mayavi import mlab
mlab.test_plot3d()
GUI().process_events()
mlab.screenshot()

O un caparazón de una sola línea:

python -c "from pyface.api import GUI; from mayavi import mlab; mlab.test_plot3d(); GUI().process_events(); mlab.screenshot()"

Básicamente, sospecho que el problema es que el bucle de eventos no se inicia y, por lo tanto, el sistema se encuentra en un estado no representado por completo cuando se intenta la captura de pantalla.

Trabajamos alrededor de esto en PySurfer forzando el renderizado con este pequeño truco GUI .

@prabhuramachandran asumiendo que esto soluciona las cosas, es posible que haya alguna forma de verificar si el contexto OpenGL (o alguna otra cosa) es realmente válido antes de intentar la captura de pantalla, y si no lo es, use este truco / truco para procesar eventos para que se convierta en válido. Sin embargo, parece un poco dudoso / demasiado hacky, así que tal vez no valga la pena.

@larsoner : sí, pensé lo mismo (ver mi comentario anterior) y quiero arreglarlo limpiamente en mlab en algún momento. Espero llegar a eso en algún momento. Además, a partir de la versión 4.6.1, mlab tiene una función process_ui_events que llama a eventos de proceso sin que el usuario tenga que importar GUI, etc. (http://docs.enthought.com/mayavi/mayavi/auto/changes .html # id10).

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

stefanoborini picture stefanoborini  ·  11Comentarios

aestrivex picture aestrivex  ·  9Comentarios

yassersouri picture yassersouri  ·  5Comentarios

Kekushke picture Kekushke  ·  9Comentarios

thoth291 picture thoth291  ·  10Comentarios