Mayavi: erreur de segmentation lors de la capture d'écran du tracé 3D

Créé le 5 sept. 2018  ·  7Commentaires  ·  Source: enthought/mayavi

Ce fichier : minimal_example_fail.py :

import faulthandler
faulthandler.enable()

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

échoue avec la pile suivante :

$ 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)

Reproduire:

$ 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

Commentaire le plus utile

Pouvez-vous confirmer que cette modification corrige les choses ?

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

Ou un shell one-liner :

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

Fondamentalement, je soupçonne que le problème est que la boucle d'événements n'est pas démarrée et que le système est donc dans un état non entièrement rendu lorsque la capture d'écran est tentée.

Nous contournons cela dans PySurfer en forçant le rendu avec cette petite astuce GUI .

@prabhuramachandran en supposant que cela corrige les choses, il est possible qu'il existe un moyen de vérifier si le contexte OpenGL (ou une autre chose) est réellement valide avant de tenter la capture d'écran, et si ce n'est pas le cas, utilisez cette astuce / hack pour traiter les événements afin qu'il devienne valide. Cela semble un peu incertain / trop hacky, alors peut-être que ça ne vaut pas le coup.

Tous les 7 commentaires

Je ne suis pas en mesure de reproduire cela, mais il y a un autre problème que je rencontre. Le problème est que la fenêtre a une taille nulle. C'est vraiment un problème Qt car la boucle principale n'est pas en cours d'exécution. Pouvez-vous essayer cela sur une session IPython avec %gui qt et voir ?

C'est ce que tu veux dire?

$ 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)

J'ai essayé ceci sur ma machine Ubuntu avec VTK-8.1.1 (de pip), Python 3.6.0, mayavi master, pyqt5 5.10.1 et j'obtiens une erreur mais pas de segfault. L'erreur que je vois est due à un problème plus profond selon lequel sans l'exécution de la boîte à outils de l'interface utilisateur, aucune fenêtre n'est ouverte, donc la taille de l'écran est toujours égale à zéro, mais cela n'est pas une erreur de segmentation. Je vais travailler sur la résolution de l'autre problème avec la taille zéro mais malheureusement, je ne suis pas en mesure de reproduire votre erreur de segmentation.

J'ai rencontré une erreur similaire sinon la même erreur de segmentation sur les machines mayavi provoquant l'erreur.

fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0 est le premier mauvais commit
commettre fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0
Auteur : Prabhu Ramachandran [email protected]
Date : ven. 3 août 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

Je vais voir si je peux reproduire avec un minimum de @dnacombo
Je peux reproduire en utilisant l'exemple minimal, mais uniquement sur ma machine Linux.

Plate-forme : Linux-4.15.0-34-generic-x86_64-with-debian-buster-sid
Python : 3.6.6 |Anaconda, Inc.| (par défaut, le 28 juin 2018, 17:14:51) [GCC 7.2.0]
Exécutable : /home/ktavabi/miniconda3/envs/mne/bin/python
Processeur : x86_64 : 24 cœurs
Mémoire : 94,4 Go

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 : introuvable
pandas : 0,23,4
dipy: 0.15.0dev
vtk : 8.1.1

Sur ma machine OSX, j'obtiens différentes erreurs, mais aucune erreur de segmentation.

J'ai rencontré une erreur de segmentation similaire/même sur une autre machine mais une construction de 18.04 très similaire avec les spécifications suivantes :

Plate-forme : Linux-4.15.0-36-generic-x86_64-with-debian-buster-sid
Python : 3.6.6 |Anaconda, Inc.| (par défaut, le 28 juin 2018, 17:14:51) [GCC 7.2.0]
Exécutable : /home/nordme/miniconda3/envs/mne/bin/python
Processeur : x86_64 : 12 cœurs
Mémoire : 15,5 Go

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 : introuvable
pandas : 0,23,4
dipy: 0.14.0

Le passage à la version a19c710c3f61389d79ed05271584e44f9744f6bc 4.6.0 a résolu l'erreur. LMK si vous voulez voir la trace.

Pouvez-vous confirmer que cette modification corrige les choses ?

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

Ou un shell one-liner :

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

Fondamentalement, je soupçonne que le problème est que la boucle d'événements n'est pas démarrée et que le système est donc dans un état non entièrement rendu lorsque la capture d'écran est tentée.

Nous contournons cela dans PySurfer en forçant le rendu avec cette petite astuce GUI .

@prabhuramachandran en supposant que cela corrige les choses, il est possible qu'il existe un moyen de vérifier si le contexte OpenGL (ou une autre chose) est réellement valide avant de tenter la capture d'écran, et si ce n'est pas le cas, utilisez cette astuce / hack pour traiter les événements afin qu'il devienne valide. Cela semble un peu incertain / trop hacky, alors peut-être que ça ne vaut pas le coup.

@larsoner -- oui, j'ai compris la même chose (voir mon commentaire précédent) et je veux le réparer proprement dans mlab à un moment donné. J'espère y arriver à un moment donné. De plus, à partir de la version 4.6.1, mlab dispose d'une fonction process_ui_events qui appelle les événements de processus sans que l'utilisateur n'ait à importer l'interface graphique, etc. (http://docs.enthought.com/mayavi/mayavi/auto/changes .html#id10).

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Kekushke picture Kekushke  ·  9Commentaires

Make42 picture Make42  ·  7Commentaires

anntzer picture anntzer  ·  7Commentaires

relyativist picture relyativist  ·  16Commentaires

yassersouri picture yassersouri  ·  5Commentaires