Mayavi: Seg-Fehler beim Screenshot des 3D-Plots

Erstellt am 5. Sept. 2018  ·  7Kommentare  ·  Quelle: enthought/mayavi

Diese Datei: minimal_example_fail.py:

import faulthandler
faulthandler.enable()

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

schlägt mit folgendem Stack fehl:

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

Fortpflanzen:

$ 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

Hilfreichster Kommentar

Können Sie bestätigen, dass diese Änderung die Dinge behebt?

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

Oder ein Shell-Einzeiler:

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

Grundsätzlich vermute ich, dass das Problem darin besteht, dass die Ereignisschleife nicht gestartet wurde und sich das System beim Versuch des Screenshots in einem nicht vollständig gerenderten Zustand befindet.

Wir umgehen dies in PySurfer, indem wir das Rendern mit diesem kleinen GUI Trick erzwingen.

@prabhuramachandran Angenommen, dies behebt die Dinge, ist es möglich, zu überprüfen, ob der OpenGL-Kontex (oder etwas anderes) tatsächlich gültig ist, bevor Sie den Screenshot versuchen, und wenn dies nicht der Fall ist, verwenden Sie diesen Trick / Hack, um Ereignisse zu verarbeiten, damit es wird gültig. Scheint jedoch ein bisschen zweifelhaft / zu hacky, also vielleicht nicht wert.

Alle 7 Kommentare

Ich kann das nicht reproduzieren, aber es gibt noch ein anderes Problem, auf das ich stoße. Das Problem ist, dass das Fenster eine Nullgröße hat. Dies ist wirklich ein Qt-Problem, da die Hauptschleife nicht ausgeführt wird. Können Sie dies in einer IPython-Sitzung mit %gui qt ausprobieren und sehen?

Ist es das was du meinst?

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

Ich habe dies auf meinem Ubuntu-Rechner mit VTK-8.1.1 (von pip), Python 3.6.0, mayavi master, pyqt5 5.10.1 versucht und bekomme einen Fehler, aber keinen Segfault. Der Fehler, den ich sehe, ist auf ein tieferes Problem zurückzuführen, dass ohne das Ausführen des UI-Toolkits kein Fenster geöffnet ist, sodass die Bildschirmgröße immer noch Null ist, aber dies führt nicht zu einem Segfault. Ich werde daran arbeiten, das andere Problem zu lösen, wobei die Größe Null ist, aber leider kann ich Ihren Segfault nicht reproduzieren.

Ich habe einen ähnlichen, wenn nicht den gleichen Segfault- Fehler sowohl auf OSX- als auch auf Linux-Rechnern mayavi Commit eingrenzen, der den Fehler verursacht.

fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0 ist das erste schlechte Commit
begehen fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0
Autor: Prabhu Ramachandran [email protected]
Datum: Fr 3. August 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

Ich werde sehen, ob ich mit minimal von @dnacombo
Ich kann das mit dem Minimalbeispiel reproduzieren, aber nur auf meiner Linux-Box.

Plattform: Linux-4.15.0-34-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 |Anaconda, Inc.| (Standard, 28. Juni 2018, 17:14:51) [GCC 7.2.0]
Ausführbare Datei: /home/ktavabi/miniconda3/envs/mne/bin/python
CPU: x86_64: 24 Kerne
Speicher: 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: Nicht gefunden
Pandas: 0.23.4
dipy: 0.15.0dev
vtk: 8.1.1

Auf meinem OSX-Rechner erhalte ich verschiedene Fehler, aber keinen Segfault.

Ich habe einen ähnlichen/gleichen Segfault-Fehler auf einem anderen Computer festgestellt, aber einen sehr ähnlichen 18.04 Build mit den folgenden Spezifikationen:

Plattform: Linux-4.15.0-36-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 |Anaconda, Inc.| (Standard, 28. Juni 2018, 17:14:51) [GCC 7.2.0]
Ausführbare Datei: /home/nordme/miniconda3/envs/mne/bin/python
CPU: x86_64: 12 Kerne
Speicher: 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: Nicht gefunden
Pandas: 0.23.4
dipy: 0.14.0

Der Wechsel zu a19c710c3f61389d79ed05271584e44f9744f6bc 4.6.0 hat den Fehler behoben. LMK, wenn Sie den Trace sehen möchten.

Können Sie bestätigen, dass diese Änderung die Dinge behebt?

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

Oder ein Shell-Einzeiler:

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

Grundsätzlich vermute ich, dass das Problem darin besteht, dass die Ereignisschleife nicht gestartet wurde und sich das System beim Versuch des Screenshots in einem nicht vollständig gerenderten Zustand befindet.

Wir umgehen dies in PySurfer, indem wir das Rendern mit diesem kleinen GUI Trick erzwingen.

@prabhuramachandran Angenommen, dies behebt die Dinge, ist es möglich, zu überprüfen, ob der OpenGL-Kontex (oder etwas anderes) tatsächlich gültig ist, bevor Sie den Screenshot versuchen, und wenn dies nicht der Fall ist, verwenden Sie diesen Trick / Hack, um Ereignisse zu verarbeiten, damit es wird gültig. Scheint jedoch ein bisschen zweifelhaft / zu hacky, also vielleicht nicht wert.

@larsoner - ja, ich habe mir das gleiche gedacht (siehe meinen früheren Kommentar) und möchte es irgendwann sauber in mlab reparieren. Ich hoffe, dass ich irgendwann dazu komme. Außerdem verfügt mlab ab v 4.6.1 über eine process_ui_events Funktion, die Prozessereignisse aufruft, ohne dass der Benutzer GUI usw. importieren muss (http://docs.enthought.com/mayavi/mayavi/auto/changes .html#id10).

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen