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()"

基本的に、問題はイベントループが開始されていないことであると思われます。そのため、スクリーンショットを試行すると、システムは完全にレンダリングされていない状態になります。

この小さなGUIトリックでレンダリングを強制することにより、PySurferでこれを回避します。

@prabhuramachandranこれで問題が解決すると仮定すると、スクリーンショットを試す前にOpenGLコンテックス(または他の何か)が実際に有効かどうかを確認する方法がある可能性があります。そうでない場合は、このトリック/ハックを使用してイベントを処理し、次のようにします。有効。 少し気難しい/ハッキーすぎるようですが、それだけの価値はないかもしれません。

全てのコメント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)

UbuntuマシンでVTK-8.1.1(pipから)、Python 3.6.0、mayavi master、pyqt5 5.10.1を使用してこれを試しましたが、エラーが発生しましたが、セグメンテーション違反は発生しませんでした。 私が見ているエラーは、UIツールキットが実行されていない場合、ウィンドウが開いていないため、画面サイズがゼロのままであるというより深い問題が原因ですが、これはセグメンテーション違反ではありません。 サイズがゼロの別の問題の解決に取り組みますが、残念ながら、セグメンテーション違反を再現できません。

OSXマシン両方で、同じではないにしても同様のセグメンテーション違反エラーが発生しました。 エラーの原因となる可能性のあるmayaviコミットに絞り込むことができました。

fd9a515a9563d81a42b84514c1fb4ce5f81ac9a0は最初の悪いコミットです
コミットfd9a515a9563d81a42b84514c1fb4ce5f81ac9a0
著者:プラブー・ラマチャンドラン
日付: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 {backend = 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
vtk: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 {backend = 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()"

基本的に、問題はイベントループが開始されていないことであると思われます。そのため、スクリーンショットを試行すると、システムは完全にレンダリングされていない状態になります。

この小さなGUIトリックでレンダリングを強制することにより、PySurferでこれを回避します。

@prabhuramachandranこれで問題が解決すると仮定すると、スクリーンショットを試す前にOpenGLコンテックス(または他の何か)が実際に有効かどうかを確認する方法がある可能性があります。そうでない場合は、このトリック/ハックを使用してイベントを処理し、次のようにします。有効。 少し気難しい/ハッキーすぎるようですが、それだけの価値はないかもしれません。

@ larsoner-はい私は同じことを考えました(私の以前のコメントを参照してください)そしてある時点でmlabでそれをきれいに修正したいと思います。 私はいつかそれに到達したいと思っています。 また、v 4.6.1以降、mlabにはprocess_ui_events関数があり、ユーザーがGUIなどをインポートしなくてもプロセスイベントを呼び出すことができます(http://docs.enthought.com/mayavi/mayavi/auto/changes .html#id10)。

このページは役に立ちましたか?
0 / 5 - 0 評価