嵌入Mayavi时,在vtkOutputWindow中禁用或捕获VTK警告

flu*_*ak7 6 logging vtk enthought python-2.7 mayavi

我想要禁用VTK警告窗口,或者更好的是,抓住它们来处理我的应用程序的日志记录系统.我的应用程序使用嵌入式mayavi视图,我不希望错误窗口弹出,我无法控制.以下代码演示了警告窗口.

import numpy as np
from mayavi import mlab

x1 = np.array([1, 1, 2, 3])
y1 = np.array([1, 1, 4, 2])
z1 = np.array([1, 1, 5, 1])

mlab.plot3d(x1, y1, z1)

mlab.show()
Run Code Online (Sandbox Code Playgroud)

好的,我做了一些研究,发现vtk.vtkObject.GlobalWarningDisplayOff()将完全禁用窗口,这很好.更好的是,下面的代码会将警告记录到文件中(在此处找到):

def redirect_vtk_messages ():
    """ Can be used to redirect VTK related error messages to a
    file."""
    import tempfile
    tempfile.template = 'vtk-err'
    f = tempfile.mktemp('.log')
    log = vtkpython.vtkFileOutputWindow()
    log.SetFlush(1)
    log.SetFileName(f)
    log.SetInstance(log)
Run Code Online (Sandbox Code Playgroud)

虽然这很好,但我仍然无法将警告直接传递给日志记录处理程序.我宁愿不必在常规日志文件旁边有一个vtk_log文件.此外,我可能想以某种方式处理我的GUI中的警告,或者让用户选择如何处理它们,并且不断观察日志文件的变化似乎是一种糟糕的方式.

关于在嵌入mayavi/vtk的应用程序中处理vtk警告的强大pythonic方法的任何建议?

小智 7

我不知道这是否适用于 Mayavi 环境,但这适用于 Python 包装到 VTK

# pipe vtk output errors to file
errOut = vtk.vtkFileOutputWindow()
errOut.SetFileName("VTK Error Out.txt")
vtkStdErrOut = vtk.vtkOutputWindow()
vtkStdErrOut.SetInstance(errOut)
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是最好的解决方案,因为接受的答案使用了仅在 Windows 上可用的 SendToStdErrOn。为了避免生成文件,还可以使用 StringOutput:`errOut = vtk.vtkStringOutputWindow()` (2认同)

lib*_*lib 5

我想这部分回答了您的问题,但是您可以按照此处的说明在 python 中实现错误观察器http://public.kitware.com/pipermail/vtkusers/2012-June/074703.html并将其添加到您所在的 vtk 类中感兴趣的。

在 C++ 中,我发现将输出重定向到 stderr 更简单(此示例适用于 Windows):

vtkSmartPointer<vtkWin32OutputWindow> myOutputWindow = vtkSmartPointer<vtkWin32OutputWindow>::New(); 
myOutputWindow->SetSendToStdErr(true);
vtkOutputWindow::SetInstance(myOutputWindow);
Run Code Online (Sandbox Code Playgroud)

在python中我试过

ow = vtk.vtkOutputWindow()
ow.SendToStdErrOn()
Run Code Online (Sandbox Code Playgroud)

它将错误发送到控制台,但我仍然看到 vtk 窗口并且它似乎并没有真正捕捉到错误。

另一种选择是在关闭 VTK_USE_DISPLAY 的情况下重新编译 vtk(http://osdir.com/ml/python-enthought-devel/2009-11/msg00164.html)。我不打算尝试这个,因为我使用的是已经在 paraview 中编译的 vtk 发行版