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)
我想这部分回答了您的问题,但是您可以按照此处的说明在 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 发行版
| 归档时间: |
|
| 查看次数: |
3268 次 |
| 最近记录: |