2015-05-28 110 views
1

以下代碼(導入除外)在循環中執行,其中有4個數字打開並繪製簡單圖形。但是,當mayavi場景創建時,程序將停止並且只會繼續,一次!all!數字已關閉! 它停止打印之間命令前/後:Python腳本不會繼續,直到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') 

我在做什麼錯? 平臺:操作系統x 10.9.5

Python 2.7.9 | Anaconda 2.1.0(x86_64)| (默認情況下,2014年12月15日,10點37分34秒) [GCC 4.2.1(蘋果公司建立5577)對達爾文

回答

0

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

+0

爲什麼你會使用'os.fork'而不是'threading' – aestrivex

+0

因此'threading'是列表中的第一個。但是'os.fork'也可以使用。根據需要,它甚至可能比使用線程有一些優勢。 – tynn