Python脚本在mayavi场景窗口关闭之前不会继续运行。

3
以下代码(除了导入部分)是在一个循环中执行的,在该循环中打开了4个图形并绘制了简单的图表。然而,当mayavi场景被创建时,程序停止运行,只有在!所有!图形关闭后才会继续执行!它会在print命令之前/之后停止:
from mayavi import mlab as mayavi_mlab


plot_extent = (-20, 20, 0, 30, 0, 1)
s= mayavi_mlab.surf(x, y, z, colormap='PuBu',extent=plot_extent, vmin=-0.5, vmax=0.5)

mayavi_mlab.axes(s, color=(.7, .7, .7), extent=plot_extent,ranges=(-120, 120, 0, 10J,0,1), xlabel='site i', ylabel='energy E',x_axis_visibility=True, y_axis_visibility=True, z_axis_visibility=False)
mayavi_mlab.view(azimuth=-90, elevation=35, distance=70, focalpoint=None)

print('before')        
mayavi_mlab.show()
print('after')

我做错了什么吗? 平台:OS X 10.9.5

Python 2.7.9 | Anaconda 2.1.0(x86_64)|(默认值,2014年12月15日,10:37:34) [GCC 4.2.1(Apple Inc. build 5577)] 在 Darwin 上运行

1个回答

0

Mayavi.mlab.show的文档中指出:

默认情况下,此函数仅创建GUI并在需要时启动其事件循环。

因此,mayavi_mlab.show()将启动主事件循环,并且直到此循环完成后才会返回。但是,这只是在所有图形都已关闭且没有UI需要显示的情况下才成立。

如果您不希望代码的这部分阻塞,应使用线程, 多进程或任何其他并发库或方法。如果您想快速实现此目标,os.fork()可能足够:

print('before')
if os.fork() == 0:
    try:
        mayavi_mlab.show()
    finally:
        os._exit(os.EX_OK)
print('after')

但请记住,这会留下 僵尸进程


因此,threading 是列表中的第一个。但是也可以使用 os.fork。根据需要,它甚至可能比使用线程更具有优势。 - tynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接