Mayavi: falha seg quando a captura de tela do gráfico 3D

Criado em 5 set. 2018  ·  7Comentários  ·  Fonte: enthought/mayavi

Este arquivo: minimal_example_fail.py:

import faulthandler
faulthandler.enable()

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

falha com a seguinte pilha:

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

Reproduzir:

$ 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

Comentários muito úteis

Você pode confirmar que esta modificação corrige as coisas?

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

Ou um one-liner shell:

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

Basicamente, suspeito que o problema é que o loop de eventos não foi iniciado e, portanto, o sistema está em algum estado não totalmente renderizado quando a captura de tela é tentada.

Nós contornamos isso no PySurfer forçando a renderização com este pequeno truque GUI .

@prabhuramachandran presumindo que isso corrige as coisas, é possível que haja alguma maneira de verificar se o contexto OpenGL (ou alguma outra coisa) é realmente válido antes de tentar a captura de tela, e se não for, use este truque / hack para processar eventos para que se torne válido. Parece um pouco duvidoso / muito hacky, então talvez não valha a pena.

Todos 7 comentários

Não consigo reproduzir isso, mas há outro problema com o qual me deparo. O problema é que a janela tem tamanho zero. Este é realmente um problema do Qt já que o mainloop não está rodando. Você pode tentar isso em uma sessão IPython com %gui qt e ver?

É isto que você quer dizer?

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

Eu tentei isso em minha máquina ubuntu com VTK-8.1.1 (do pip), Python 3.6.0, mayavi master, pyqt5 5.10.1 e recebo um erro, mas sem segfault. O erro que estou vendo é devido a um problema mais profundo que, sem o kit de ferramentas de IU em execução, não há nenhuma janela aberta, então o tamanho da tela ainda é zero, mas isso não gera segfault. Vou trabalhar para resolver o outro problema com o tamanho zero, mas, infelizmente, não consigo reproduzir o seu segfault.

Encontrei um erro de falha de segmento semelhante, se não o mesmo, em máquinas OSX e Linux. Consegui restringi-lo a um possível commit de mayavi causando o erro.

fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0 é o primeiro commit incorreto
commit fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0
Autor: Prabhu Ramachandran [email protected]
Data: Sex, 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

Vou ver se consigo reproduzir com o mínimo de @dnacombo
Posso reproduzir usando o exemplo mínimo, mas apenas na minha caixa Linux.

Plataforma: Linux-4.15.0-34-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 | Anaconda, Inc. | (padrão, 28 de junho de 2018, 17:14:51) [GCC 7.2.0]
Executável: / home / ktavabi / miniconda3 / envs / mne / bin / python
CPU: x86_64: 24 núcleos
Memória: 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: Não encontrado
pandas: 0.23.4
dipy: 0.15.0dev
vtk: 8.1.1

Na minha máquina OSX recebo erros diferentes, mas nenhum segfault.

Encontrei um erro de falha de segmento semelhante / igual em uma máquina diferente, mas 18.04 build muito semelhante com as seguintes especificações:

Plataforma: Linux-4.15.0-36-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 | Anaconda, Inc. | (padrão, 28 de junho de 2018, 17:14:51) [GCC 7.2.0]
Executável: / home / nordme / miniconda3 / envs / mne / bin / python
CPU: x86_64: 12 núcleos
Memória: 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: Não encontrado
pandas: 0.23.4
dipy: 0.14.0

Mudar para a versão a19c710c3f61389d79ed05271584e44f9744f6bc 4.6.0 resolveu o erro. LMK se você quiser ver o traço.

Você pode confirmar que esta modificação corrige as coisas?

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

Ou um one-liner shell:

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

Basicamente, suspeito que o problema é que o loop de eventos não foi iniciado e, portanto, o sistema está em algum estado não totalmente renderizado quando a captura de tela é tentada.

Nós contornamos isso no PySurfer forçando a renderização com este pequeno truque GUI .

@prabhuramachandran presumindo que isso corrige as coisas, é possível que haja alguma maneira de verificar se o contexto OpenGL (ou alguma outra coisa) é realmente válido antes de tentar a captura de tela, e se não for, use este truque / hack para processar eventos para que se torne válido. Parece um pouco duvidoso / muito hacky, então talvez não valha a pena.

@larsoner - sim, descobri a mesma coisa (veja meu comentário anterior) e quero consertar de forma limpa no mlab em algum momento. Espero chegar lá em algum momento. Além disso, a partir da v 4.6.1, o mlab tem uma função process_ui_events que chama eventos de processo sem que o usuário tenha que importar a GUI etc. (http://docs.enthought.com/mayavi/mayavi/auto/changes .html # id10).

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

stefanoborini picture stefanoborini  ·  11Comentários

ktavabi picture ktavabi  ·  15Comentários

aestrivex picture aestrivex  ·  9Comentários

rahulporuri picture rahulporuri  ·  3Comentários

PennyQ picture PennyQ  ·  4Comentários