Я использую vtk с драйвером MesaOS, так как хочу запустить рендеринг как часть ноутбука jupyter в безголовом режиме, некоторые дополнительные сведения о конфигурации пакета можно найти здесь:
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. К сожалению, мне не удалось найти инициализацию VTK внутри Mayavi. Мне кажется, что это происходит в 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)
хорошо, на самом деле пример чистого VTK, приведенный в OP, тоже не работает, поэтому я предполагаю, что с моим env что-то не так. Я получаю то же самое с прямым 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-forge osmesa должен это делать. Я открою там вопрос.
Я думаю, что более новые выпуски mesa не допускают одновременного использования mesa и osmesa, поэтому последние выпуски VTK могут автоматически отключать osmesa при включении vtk_use_x. Но я не совсем уверен в этом, так как многое могло измениться ...
Если возможно, не могли бы вы попробовать более старую версию, например VTK-7.x, или когда это было известно, что она работает?
У меня такое же сообщение об ошибке на Ubuntu 18, vtk 8.1.2, mayavi 4.6.2
У меня тоже проблема с Mayavi. Кто-нибудь нашел решение? У меня возникает эта проблема при использовании Mayavi на сервере, хотя отображение перенаправляется на мой локальный компьютер.
У меня была аналогичная проблема при использовании Mayavi в Jupyter-Notebook, предоставляемом удаленным сервером Jupyter-Hub. Проблема заключалась в том, что X-сервер не запущен.
Я решил это с помощью установки xvfbwrapper и
Пример
#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
. Но после ssh'ing на мой сервер с флагом -X я все равно получаю сообщение об ошибке:
ОШИБКА: в ../Rendering/OpenGL2/vtkXOpenGLRenderWindow.cxx, строка 606
vtkXOpenGLRenderWindow (0x55b43e61d590): невозможно создать контекст GLX. Прерывание.
@tjiagoM Может быть, вы забыли установить сам xfb (sudo apt-get install xvfb)?
@ max9111 о, нет, изначально я допустил эту ошибку, но они выдают ошибку, говоря, что xvfb не был найден / активен (или что-то подобное)
@ max9111 Я xvfbwrapper
как вы предложили, но мне это не помогло. Заранее спасибо!
@mirestrepo
К сожалению, нет образа докера.
Моя установка:
Виртуальная машина, работающая на Kubuntu 18.04 (с использованием Virtual Box) на удаленной рабочей станции, работающей на CentOS7.
Установлен The Littlest JupyterHub
Сделайте Jupyterhub доступным извне (перенаправление портов, настройка брандмауэра)
Установленная XfVB в виртуальной машине , как что
Решающим моментом здесь является получение работающего X-сервера (так что общие руководства, как сделать что-то, связанное с графическим интерфейсом пользователя в образе Docker, также могут помочь). Я бы предложил попробовать простой скрипт из ссылки, чтобы проверить это. В этом случае вы также получите значимое сообщение об ошибке.
Если это сработает, важно, чтобы вы запустили X-сервер, прежде чем выполнять какие-либо действия, связанные с Mayavi, как показано в примере выше. Если вы импортируете mayavi from mayavi import mlab
перед инициализацией X-Server, mayavi выйдет из строя.
@ max9111 Мне удалось пропустить оболочку xvfb, запустив xvfb
в точке входа для моего докера ENTRYPOINT ["tini", "-g", "--", "xvfb-run"]
но я могу получить только mlab
для работы с png
backend ... Я не пробовал собрать vtk
с OSMesa
хотя ...
Вам на помощь может прийти xvfb-run:
xvfb-run python your-py-script.py
Обратите внимание, что вам необходимо установить xvfb перед выполнением указанной выше команды.
Самый полезный комментарий
У меня была аналогичная проблема при использовании Mayavi в Jupyter-Notebook, предоставляемом удаленным сервером Jupyter-Hub. Проблема заключалась в том, что X-сервер не запущен.
Я решил это с помощью установки xvfbwrapper и
Пример
Если нет более элегантного способа, думаю, было бы хорошо упомянуть об этом в инструкции.