Mayavi: Не работает рендеринг Mayavi вне экрана для VTK 7.1.0

Созданный на 18 янв. 2017  ·  21Комментарии  ·  Источник: enthought/mayavi

Я использую 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 , но я не вижу возможности напрямую принудительно отрисовывать вне экрана.

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

У меня была аналогичная проблема при использовании 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

Если нет более элегантного способа, думаю, было бы хорошо упомянуть об этом в инструкции.

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

Я обнаружил, что, установив 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 перед выполнением указанной выше команды.

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

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

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

stefanoborini picture stefanoborini  ·  11Комментарии

relyativist picture relyativist  ·  16Комментарии

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

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