Mayavi: 3D 绘图截图时出现段错误

创建于 2018-09-05  ·  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 上下文(或其他一些东西)是否实际上有效,如果不是,请使用此技巧/hack 来处理事件,使其变为有效的。 不过,似乎有点不确定/太hacky,所以可能不值得。

所有7条评论

我无法重现这一点,但我遇到了另一个问题。 问题是窗口的大小为零。 这确实是一个 Qt 问题,因为主循环没有运行。 你能用%gui qt在 IPython 会话上试试这个吗?

你是这个意思吗?

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

我在我的带有 VTK-8.1.1(来自 pip)、Python 3.6.0、mayavi master、pyqt5 5.10.1 的 ubuntu 机器上尝试了这个,我得到一个错误但没有段错误。 我看到的错误是由于一个更深层次的问题,即没有运行 UI 工具包,没有窗口打开,因此屏幕大小仍然为零,但这不是段错误。 我将努力解决大小为零的另一个问题,但不幸的是,我无法重现您的段错误。

我已经遇到过类似的,如果不一样的段错误两个OSX和Linux机器的错误。 我能够将其缩小到导致错误的潜在mayavi提交。

fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0 是第一个错误提交
提交 fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0
作者:Prabhu Ramachandran [email protected]
日期:2018 年 8 月 3 日星期五 21:38:13 -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.| (默认,2018 年 6 月 28 日,17:14:51)[GCC 7.2.0]
可执行文件:/home/ktavabi/miniconda3/envs/mne/bin/python
CPU:x86_64:24核
内存: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 {后端=Qt5Agg}

sklearn:0.19.2
尼巴​​贝尔:2.4.0dev
mayavi:4.7.0.dev0 4.6.0 {qt_api=pyqt5}
小白:没找到
熊猫:0.23.4
dipy:0.15.0dev
视频:8.1.1

在我的 OSX 机器上,我收到了不同的错误,但没有段错误。

我在另一台机器上遇到了类似/相同的段错误,但非常相似的18.04构建具有以下规格:

平台:Linux-4.15.0-36-generic-x86_64-with-debian-buster-sid
Python:3.6.6 |Anaconda, Inc.| (默认,2018 年 6 月 28 日,17:14:51)[GCC 7.2.0]
可执行文件:/home/nordme/miniconda3/envs/mne/bin/python
CPU:x86_64:12核
内存: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 {后端=Qt5Agg}

sklearn:0.20.0
尼巴​​贝尔:2.3.0
mayavi:4.7.0.dev0 {qt_api=pyqt5}
小白:没找到
熊猫:0.23.4
dipy: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 上下文(或其他一些东西)是否实际上有效,如果不是,请使用此技巧/hack 来处理事件,使其变为有效的。 不过,似乎有点不确定/太hacky,所以可能不值得。

@larsoner - 是的,我想出了同样的事情(请参阅我之前的评论)并希望在某个时候在 mlab 中干净地修复它。 我希望能在某个时候实现它。 此外,从 v 4.6.1 开始,mlab 有一个process_ui_events函数可以调用流程事件,而无需用户导入 GUI 等(http://docs.enthought.com/mayavi/mayavi/auto/changes .html#id10)。

此页面是否有帮助?
0 / 5 - 0 等级