python 3+的缓冲函数

Buffer function for python 3+

我正在尝试使用 vtk_show 打开 vtk window,但是每次我这样做时我的 Ipython 控制台都会崩溃,显然这是因为 Ipython 可以't 显示外部 window,这正是 vtk_show 所做的。我在 google 上搜索了解决方案,但它是为 python2 编写的(我使用的是 python 3.6.3)。这是我找到的解决方案:

import vtk
from IPython.display import Image

def vtk_show(renderer, width=400, height=300):
    """
    Takes vtkRenderer instance and returns an IPython Image with the 
    rendering.
    """
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.SetOffScreenRendering(1)
    renderWindow.AddRenderer(renderer)
    renderWindow.SetSize(width, height)
    renderWindow.Render()

    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renderWindow)
    windowToImageFilter.Update()

    writer = vtk.vtkPNGWriter()
    writer.SetWriteToMemory(1)
    writer.SetInputConnection(windowToImageFilter.GetOutputPort())
    writer.Write()
    data = str(buffer(writer.GetResult()))

    return Image(data)

我在尝试使用 python2 的 buffer 内置函数时遇到错误,但由于此函数在 python3+ i' 上不存在我卡住了..如果有人能帮我解决这个问题,我将不胜感激。提前致谢!

至少必须在您的代码中修改这两点才能与 Python 3:

具有相同的行为

所以 data = ... 行应该是:

data = bytes(memoryview(writer.GetResult()))

澄清一下,我认为这个例子是对 informative blog example showing how to extract surfaces from medical images using VTK's marching cubes algorithm. The accompanying Jupyter notebook 的改编,原本是为 Python 2.7 而设计的,并且如前所述,它在 Python 3.6+ 中使用, data=... 部分需要更改。

import vtk
from IPython.display import Image

def vtk_show(renderer, width=400, height=300):
    """
    Takes vtkRenderer instance and returns an IPython Image with the 
    rendering.
    """
    renderWindow = vtk.vtkRenderWindow()
    renderWindow.SetOffScreenRendering(1)
    renderWindow.AddRenderer(renderer)
    renderWindow.SetSize(width, height)
    renderWindow.Render()

    windowToImageFilter = vtk.vtkWindowToImageFilter()
    windowToImageFilter.SetInput(renderWindow)
    windowToImageFilter.Update()

    writer = vtk.vtkPNGWriter()
    writer.SetWriteToMemory(1)
    writer.SetInputConnection(windowToImageFilter.GetOutputPort())
    writer.Write()
    data = memoryview(writer.GetResults()).tobytes()

    return Image(data)

解决方案肯定归功于@MafiaSkafia 和@jcgiret,但我想 post 一个完整的最终解决方案。