【问题标题】:Python script doesn't continue until mayavi scene window closedPython 脚本在 mayavi 场景窗口关闭之前不会继续
【发布时间】:2015-05-28 10:06:42
【问题描述】:

以下代码(导入除外)在循环中执行,其中打开了 4 个图形并绘制了简单的图形。然而,当 mayavi 场景被创建时,程序停止并且只继续,一次!全部!数字已关闭! 它在打印命令之前/之后停止:

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 上

【问题讨论】:

    标签: python matplotlib mayavi


    【解决方案1】:

    docs for mayavi.mlab.show 状态:

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

    因此mayavi_mlab.show() 将启动主事件循环,并且在此循环完成之前不会返回。但这只是这种情况,当 所有 个图形都已关闭且没有 UI 可显示时。

    如果您不希望这部分代码被阻塞,您应该使用threadingmultiprocessing 或任何其他并发库或方法。如果您想快速实现这一目标,os.fork() 可能就足够了:

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

    但请记住,这会给您留下Zombie processes

    【讨论】:

    • 因此threading 是列表中的第一个。但是os.fork 也可以使用。根据需要,它甚至可能比使用线程有一些优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多