Mayavi: seg fault при скриншоте 3D-сюжета

Созданный на 5 сент. 2018  ·  7Комментарии  ·  Источник: enthought/mayavi

Этот файл: minimal_example_fail.py:

import faulthandler
faulthandler.enable()

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

не работает со следующим стеком:

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

Воспроизвести:

$ 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

Самый полезный комментарий

Можете ли вы подтвердить, что эта модификация исправляет ситуацию?

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

Или оболочка однострочная:

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

В основном я подозреваю, что проблема в том, что цикл событий не запущен, и поэтому система находится в не полностью отрисованном состоянии при попытке сделать снимок экрана.

Мы работаем над этим в PySurfer, принудительно выполняя рендеринг с помощью этого небольшого трюка GUI .

@prabhuramachandran, предполагая, что это что-то исправляет, возможно, есть способ проверить, действительно ли контекст OpenGL (или что-то еще) действительно действителен, прежде чем пытаться сделать снимок экрана, и если это не так, используйте этот трюк / хак для обработки событий, чтобы он стал действительный. Кажется немного сомнительным / слишком хакерским, так что, возможно, оно того не стоит.

Все 7 Комментарий

Я не могу воспроизвести это, но есть еще одна проблема, с которой я столкнулся. Проблема в том, что окно имеет нулевой размер. Это действительно проблема Qt, поскольку основной цикл не работает. Можете ли вы попробовать это в сеансе IPython с %gui qt и посмотреть?

Это то, что вы имеете в виду?

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

Я пробовал это на своей машине ubuntu с VTK-8.1.1 (из pip), Python 3.6.0, mayavi master, pyqt5 5.10.1, и я получаю сообщение об ошибке, но без segfault. Ошибка, которую я вижу, связана с более глубокой проблемой, заключающейся в том, что без запущенного инструментария пользовательского интерфейса нет открытого окна, поэтому размер экрана по-прежнему равен нулю, но это не ошибка. Я буду работать над решением другой проблемы с нулевым размером, но, к сожалению, я не могу воспроизвести ваш segfault.

Я столкнулся с похожей, если не с той же ошибкой segfault на машинах OSX и Linux. Мне удалось сузить его до потенциального коммита mayavi вызывающего ошибку.

fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0 - первая плохая фиксация
совершить fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0
Автор: Прабху Рамачандран [email protected]
Дата: Пт 3 августа 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

Посмотрим, смогу ли я воспроизвести с минимумом от @dnacombo
Я могу воспроизвести, используя минимальный пример, но только на моем компьютере с Linux.

Платформа: Linux-4.15.0-34-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 | Anaconda, Inc. | (по умолчанию, 28 июня 2018 г., 17:14:51) [GCC 7.2.0]
Исполняемый файл: / home / ktavabi / miniconda3 / envs / mne / bin / python
Процессор: x86_64: 24 ядра
Память: 94,4 ГБ

mne: 0.17.dev0
число: 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}
купи: не найдено
панды: 0.23.4
dipy: 0.15.0dev
vtk: 8.1.1

На моей машине OSX я получаю разные ошибки, но не segfault.

Я столкнулся с аналогичной / такой же ошибкой segfault на другом компьютере, но очень похожей сборкой 18.04 со следующими характеристиками:

Платформа: Linux-4.15.0-36-generic-x86_64-with-debian-buster-sid
Python: 3.6.6 | Anaconda, Inc. | (по умолчанию, 28 июня 2018 г., 17:14:51) [GCC 7.2.0]
Исполняемый файл: / home / nordme / miniconda3 / envs / mne / bin / python
Процессор: x86_64: 12 ядер
Оперативная память: 15,5 ГБ

mne: 0.17.dev0
число: 1.15.2 {blas = mkl_rt, lapack = mkl_rt}
scipy: 1.1.0
matplotlib: 2.2.2 {backend = Qt5Agg}

sklearn: 0.20.0
нибабель: 2.3.0
mayavi: 4.7.0.dev0 {qt_api = pyqt5}
купи: не найдено
панды: 0.23.4
дипы: 0,14,0

Переход на выпуск a19c710c3f61389d79ed05271584e44f9744f6bc 4.6.0 устранил ошибку. LMK, если хотите увидеть след.

Можете ли вы подтвердить, что эта модификация исправляет ситуацию?

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

Или оболочка однострочная:

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

В основном я подозреваю, что проблема в том, что цикл событий не запущен, и поэтому система находится в не полностью отрисованном состоянии при попытке сделать снимок экрана.

Мы работаем над этим в PySurfer, принудительно выполняя рендеринг с помощью этого небольшого трюка GUI .

@prabhuramachandran, предполагая, что это что-то исправляет, возможно, есть способ проверить, действительно ли контекст OpenGL (или что-то еще) действительно действителен, прежде чем пытаться сделать снимок экрана, и если это не так, используйте этот трюк / хак для обработки событий, чтобы он стал действительный. Кажется немного сомнительным / слишком хакерским, так что, возможно, оно того не стоит.

@larsoner - да, я понял то же самое (см. мой предыдущий комментарий) и хочу в какой-то момент исправить это в mlab. Я надеюсь добраться до этого в какой-то момент. Кроме того, начиная с версии 4.6.1, mlab имеет функцию process_ui_events которая вызывает события процесса без необходимости импорта графического интерфейса пользователя и т. Д. (Http://docs.enoughtt.com/mayavi/mayavi/auto/changes .html # id10).

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

anntzer picture anntzer  ·  7Комментарии

kitchoi picture kitchoi  ·  10Комментарии

rahulporuri picture rahulporuri  ·  3Комментарии

yassersouri picture yassersouri  ·  5Комментарии

scottstanie picture scottstanie  ·  4Комментарии