ヘッドレスモードでjupyterノートブックの一部としてレンダリングを実行したいので、MesaOSドライバーでvtkを使用します。パッケージ構成の詳細については、次を参照してください。
https://github.com/conda-forge/vtk-feedstock/issues/20
VTKオフスクリーンの例を使用すると、正常に機能しています。
#! ./local/bin/python
from vtk import (vtkSphereSource, vtkPolyDataMapper, vtkActor, vtkRenderer,
vtkRenderWindow, vtkWindowToImageFilter, vtkPNGWriter)
sphereSource = vtkSphereSource()
mapper = vtkPolyDataMapper()
mapper.SetInputConnection(sphereSource.GetOutputPort())
actor = vtkActor()
actor.SetMapper(mapper)
renderer = vtkRenderer()
renderWindow = vtkRenderWindow()
renderWindow.SetOffScreenRendering(1)
renderWindow.AddRenderer(renderer)
renderer.AddActor(actor)
renderer.SetBackground(1, 1, 1)
renderWindow.Render()
windowToImageFilter = vtkWindowToImageFilter()
windowToImageFilter.SetInput(renderWindow)
windowToImageFilter.Update()
writer = vtkPNGWriter()
writer.SetFileName("sphere.png")
writer.SetInputConnection(windowToImageFilter.GetOutputPort())
writer.Write()
しかし、mayaviの画面外の例をテストすると、機能しません。
# Author: Prabhu Ramachandran <[email protected]>
# Copyright (c) 2007, Enthought, Inc.
# License: BSD Style.
from os.path import join, abspath, dirname
# The offscreen Engine.
from mayavi.api import OffScreenEngine
# Usual MayaVi imports
from mayavi.scripts.util import get_data_dir
from mayavi.sources.api import VTKXMLFileReader
from mayavi.modules.api import Outline, ScalarCutPlane, Streamline
def main():
# Create the MayaVi offscreen engine and start it.
e = OffScreenEngine()
# Starting the engine registers the engine with the registry and
# notifies others that the engine is ready.
e.start()
# Create a new scene.
win = e.new_scene()
# Now setup a normal MayaVi pipeline.
src = VTKXMLFileReader()
src.initialize(join(get_data_dir(dirname(abspath(__file__))),
'fire_ug.vtu'))
e.add_source(src)
e.add_module(Outline())
e.add_module(ScalarCutPlane())
e.add_module(Streamline())
win.scene.isometric_view()
# Change the size argument to anything you want.
win.scene.save('offscreen.png', size=(800, 800))
if __name__ == '__main__':
main()
私が受け取るエラーメッセージは次のとおりです。
ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 301
vtkXOpenGLRenderWindow (0x30ced20): bad X server connection. DISPLAY=Aborted
だから私には、画面外の初期化がVTKに正しく転送されていないようです。 残念ながら、私はmayavi内でVTKの初期化を見つけることができませんでした。 私にはそれがtvtk_access.py
で起こっているように見えますが、それでもオフスクリーンレンダリングを直接強制するオプションは表示されません。
ETS_TOOLKIT='null'
を設定することで、次のコマンドを使用してこのエラーを再現できることがわかりました。
>>> from mayavi import mlab
>>> mlab.options.offscreen = True
>>> mlab.test_plot3d()
ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 301
vtkXOpenGLRenderWindow (0x2e027d0): bad X server connection. DISPLAY=Aborted (core dumped)
ETS_TOOLKIT='null'
が設定されていない場合、インポートも機能しません。 したがって、シーンnew_scene()
を作成しようとすると、今のところ上記のスクリプトは失敗します
@ jan-janssen-最新のマスターでテストしていただけませんか。今すぐ修正する必要があります。 export ETS_TOOLKIT=null
は引き続き必要ですが、残りは機能するはずです。
osmesa conda-forge vtkパッケージを使用してこれをテストしましたが、Xサーバーなしでは機能しません。 私はenvが正しく設定されていると思います。
私がしたことは:
$ export ETS_TOOLKIT='null'
$ conda create -n mayavi_osmesa -c conda-forge mesalib pyqt numpy vtk
$ pip install git+https://github.com/enthought/mayavi
$ python -c "from mayavi import mlab; mlab.options.offscreen=True; mlab.test_plot3d(); mlab.savefig('test.png')"
ERROR: In ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, line 445
vtkXOpenGLRenderWindow (0x1c58c80): bad X server connection. DISPLAY=Aborted (core dumped)
わかりました、実際にはOPで与えられた純粋なVTKの例も機能しないので、私の環境に何か問題があると思います。 ストレートのpip install git+https://github.com/enthought/mayavi
でも同じことがわかるので、vtkのどこかに何かが足りないと思います。
テストしていただきありがとうございます。インストールされているVTKにvtkOSOpenGLRenderWindow
があるかどうかを確認できますか?
import vtk; print(hasattr(vtk, 'vtkOSOpenGLRenderWindow'))
。 そうでない場合、VTKはおそらくosmesaサポートで構築されていません。 もしそうなら、私は注意深く調査する必要があります。
それはありません。 それが存在するかどうかを制御するものをあなたが知っているとは思いませんか?!
VTKを構築するときは、 VTK_OPENGL_HAS_OSMESA
をONに設定する必要があります。
うーん、私が言うことができる限り、conda-forgeosmesaパッケージはそれを行うべきです。 そこで問題を開きます。
新しいmesaリリースではmesaとosmesaの両方が許可されていないため、vtk_use_xがオンになると、最近のVTKリリースではosmesaが自動的にオフになる場合があります。 しかし、多くのことが変わった可能性があるので、私はこれについて完全にはわかりません...
可能であれば、VTK-7.xのような古いバージョンで、またはこれが機能することがわかっているときはいつでも試すことができますか?
Ubuntu 18、vtk 8.1.2、mayavi4.6.2で同じエラーメッセージが表示されます
私もマヤビでこの問題を抱えています。 誰かが解決策を見つけましたか? サーバーでmayaviを使用しているときにこの問題が発生しますが、ディスプレイがローカルコンピューターに転送されています。
リモートのJupyter-Hubサーバーが提供するJupyter-NotebookでMayaviを使用した場合も、まったく同様の問題が発生しました。 問題は、Xサーバーが実行されていないことでした。
xvfbwrapperとXvfbバックエンドをインストールして解決しました。 mayaviで何かをする前に、ディスプレイを開始します。
例
#The following 3 lines must be before doing anything with mayavi (even importing)
from xvfbwrapper import Xvfb
vdisplay = Xvfb(width=1920, height=1080)
vdisplay.start()
from mayavi import mlab
mlab.init_notebook()
s = mlab.test_plot3d()
s
これ以上エレガントな方法がない場合は、マニュアルに記載しておくとよいと思います。
@ max9111他に何かしたことを覚えていますか? xvfbwrapper
インストールした後、コードを試しました。 しかし、-Xフラグを使用してサーバーにSSH接続した後でも、エラーが発生します。
エラー:../ Rendering / OpenGL2 / vtkXOpenGLRenderWindow.cxxの606行目
vtkXOpenGLRenderWindow(0x55b43e61d590):GLXコンテキストを作成できません。 中絶。
@tjiagoM xfb自体をインストールするのを忘れたのではないでしょうか(sudo apt-get install xvfb)?
@ max9111ああ、いや、最初はその間違いを犯したが、xvfbが見つからなかった/アクティブではない(または同様のもの)というエラーがスローされた
@ max9111同じセットアップ、リモートjupyterhubのmayaviで苦労しています。 ハブで使用されるサンプルのDockerイメージはありますか? あなたが提案したようにxvfbwrapper
を使ってみましたが、うまくいきませんでした。 前もって感謝します!
@mirestrepo
残念ながら、Dockerイメージはありません。
私の設定は次のとおりです。
CentOS7で実行されるリモートワークステーション上のKubuntu18.04(Virtual Boxを使用)で実行される仮想マシン。
The LittlestJupyterHubをインストールし
Jupyterhubを外部から利用できるようにする(ポートフォワーディング、Firewallsetup)
そのような仮想マシンにXfVBをインストールしました
ここでの重要なポイントは、X-Serverを機能させることです(Dockerイメージに関連するGUIを実行する一般的なチュートリアルも役立つ場合があります)。リンクから簡単なスクリプトを試して、これを確認することをお勧めします。 この場合、意味のあるエラーメッセージも表示されます。
これが機能する場合は、上記の例に示すように、mayavi関連の処理を実行する前にX-Serverを起動することが重要です。 X-Serverを初期化する前にmayavi from mayavi import mlab
をインポートすると、mayaviがクラッシュします。
@ MAX9111は、私が起動してXVFBラッパーをスキップするために管理xvfb
私のドッキングウィンドウのエントリポイントでENTRYPOINT ["tini", "-g", "--", "xvfb-run"]
が、私はのみ取得することができますmlab
で仕事にpng
バックエンド... OSMesa
vtk
をビルドしようとしたことはありませんが...
xvfb-runがあなたの助けになるかもしれません:
xvfb-run python your-py-script.py
上記のコマンドを実行する前に、xvfbをインストールする必要があることに注意してください。
最も参考になるコメント
リモートのJupyter-Hubサーバーが提供するJupyter-NotebookでMayaviを使用した場合も、まったく同様の問題が発生しました。 問題は、Xサーバーが実行されていないことでした。
xvfbwrapperとXvfbバックエンドをインストールして解決しました。 mayaviで何かをする前に、ディスプレイを開始します。
例
これ以上エレガントな方法がない場合は、マニュアルに記載しておくとよいと思います。