自从接触了Python后,被它丰富的扩展库所倾倒,于是奋不顾身地投入到科学计算这个大坑。浸淫大概1个半月后,开始尝试一开就非常感兴趣的数据动态可视化,即把数据以动画显示。方案是使用mayavi、moviepy等库。顺便一提,路人皆知的matplotlib虽然也提供动画模块,但是我嫌它不够华丽(注:这是一个flag),于是就没有采用。
实际上,GitHub上的一位大神早已实现,本人便是受其启发开始了这场试验(作死)。讲述这次作死之旅之前先交代一下我的开发环境:
系统:win10专业版
Python版本: Python3.5.1(anaconda发行包)
IPython版本: 4.0.1
Notebook版本:4.0.6
试验前已安装好的库: numpy matplotlib pyqt traits TraitsBackendQt
那么“正式”开始吧!
首先安装扩展库mayavi和moviepy,在cmd命令行里依次键入
conda install moviepy
conda install mayavi
moviepy的安装过程很惬意,然而当我在mayavi后面敲回车后,各种报错让我再也轻松不起来,然后我查询了一下,发现mayavi并不支持Python3,有点失望啊。
但我马上打起精神,因为anaconda自带virtualenv虚拟环境,可以安装别的版本的python,而我之前已经在virtualenv里安装了python2.7。
接下来便进入python2.7,我设置的虚拟环境名称是python2,可以键入
activate python2
这样便进入python2.7了。后面经过conda和pip的连番轰炸,终于装好了mayavi和moviepy。
然后启动notebook,键入
jupyter notebook
正当我满眼期待地盯着黑漆漆的命令行,脑补notebook打开的场景时,又提示了一大堆错误。仔细查看,说的是不能解析配置文件,我看了下它给的文件路径,发现问题了,原来是中文用户名引起的错误,然后我开始冒汗了。这尼玛逗我呢 O-O 既然这样,干脆放弃notebook,在终端里调试程序,于是敲入jupyter qtconsole,希望打开ipython的GUI终端,结果也不行。My gash~
深呼吸,冷静了几秒,我决定刚正面,后来证明这真是作死,虽然实际上从折腾mayavi开始就在作死了。我的计划是修改notebook默认的配置文件路径,于是立即想到环境变量,然并卵,作罢。接着,挪动配置文件到我指定的路径,然并卵,作罢。再然后,按此文所说添加sitecustomize.py文件,然并卵,而且还把pip搞异常了。最后,尝试修复pip,未果。。。。此时我已萌生摔键盘的冲动。
为了避免陷入由问题制造问题的死循环,我决定就此打住,往别的方向考虑,不如换一个虚拟环境吧!既然如此,那么虚拟机自然是可以考虑的,就这么办!打开VirtualBox里安装好的XP,我努力压制自己已然不耐烦的心情,从头开始安装anaconda及相关的环境。所幸的是,安装完成后notebook顺利启动。至此我才正式打开了数据动态可视化的修罗场。
在notebook中新建一个ipynb文件,写入以下代码:
#关闭SSL认证,防止出现SSL_VERIFIED_FAIL
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import numpy as np
import mayavi.mlab as mlab
import moviepy.editor as mpy
duration = 2 #动画的时间区间
#用mayavi构建一个figure容器
fig_myv = mlab.figure(size=(220,220), bgcolor=(1,1,1))
X, Y = np.linspace(-2,2,200), np.linspace(-2,2,200)
XX, YY = np.meshgrid(X, Y)
ZZ = lambda d: np.sinc(XX**2+YY**2)+np.sin(XX+d)
#用movie播放figure里的画面
#同时输出一个GIF图片
def make_frame(t):
mlab.clf() #清除figure容器(重置颜色)
mlab.mesh(YY,XX,ZZ(2*np.pi*t/duration), figure=fig_myv)
return mlab.screenshot(antialiased=True)
animation = mpy.VideoClip(make_frame, duration=duration)
animation.write_gif("sinc.gif", fps=20)
说明一下,关闭SSL认证是为了方便下载缺省的插件,比如此处我在运行脚本时提示缺少ffmepg.win32.exe,那么就要下载,如果不关SSL认证,可能导致认证失败而无法下载。
捣腾完ffmepg,我继续调试程序,然后果然又出现了错误,并且提示我要确认一下是否安装了TraitsBackendWx或者TraitsBackendQt以及WxPython或者PyQt。我比较常用的是Qt库,所以就顺便用conda安装了PyQt和Traits。不知以往安装向来顺利的PyQt此时又出了问题,卡在了SIP上,这是PyQt所依赖的一个库,可是用conda和pip几番尝试后,都装不上,于是我去anaconda的镜像源网站看了下,的确找不到sip相关的包,只好尝试源码安装,依然装不上。此时我怀着近乎绝望的心情又用conda试了下,结果装上了。不信邪的我又去网站确认了下,还真有sip。这件事给我留下了阴影,我不禁开始怀疑人生:难道我真的是像知乎上某位大神说的,在面向运气编程?
闲话略过,继续作死。此时只剩TraitsBackendQt还在作梗,我重拾早已跌入茅坑的信心,强行尝试着安装TraitsBackendQt,按惯例conda和pip双刀试一遍,不行。。。那就源码安装吧,我假装轻松地想着,进入GitHub寻找TraitsBackendQt的源码,当我找到并发现它是Enthought发行包套件中的一个项目时,我心里咯噔了一下,因为据我所知,Enthought是Python的商业发行包,要收费的,真的能直接用吗?而且TraitsBackendQt作为套件中的一个项目,其版本也不一定和我的PyQt相匹配。这样胡思乱想了一顿,我还是觉得试试再说。解压源码压缩包,打开cmd,切换到源码包的目录下,依次键入
python setup.py build
python setup.py install
进行到install时果然还是出了问题,大概也是指版本匹配方面的问题,但是我已找不到别的包了,而且我用conda list查了下,发现竟然装上去了。既然这样,那就死马当活马医吧!
重新运行程序,这回总算不提示缺这缺那的了,可我依然缺信心,因为又报错了。我核对了一下TrackBack给出的内容,发现了这段信息:
Version value has been already 1
同时我按traceback指定的文件路径找到了出错的文件,里面确实把version value设定为2了。虽然不知道这又什么影响,但我认为修改它还是很值得一试的。于是我将它设为1,这样就可以和原先的1相匹配,我是这么想的。怀着紧张的心情按下运行键,我忐忑地等待着运行结果,出乎意料的是,真的产生了动态图像。
不过大神所得到的图像是这样的
而我的是这样的
这就是理想与现实的差距啊!
顺便说下,如果将上述代码中的make_frame改成make_frame_mpl就可以生成平面的sinc动画
这次的经历告诉我还是要踏踏实实地学习基础,不要一味地追求所谓的”华丽“,被打脸的滋味还是不好受的。