昨天(2018/4/6)花了几乎一天的时间打包我的桌面应用“标注器”。下午3点完成最后的编写之后,准备在女朋友雅喻的电脑上配环境打包(我的电脑不能用pyinstaller打包,重装也不行,玄学错误。)。雅喻的电脑上缺少scikit-image这个包,然后我就下了一个。但是主程序不能运行,报错,traceback最后一行具体说的是str变量没有read()属性。我以为是包有问题(怀疑是PIL),所以还是去张辽电脑上打包。因为上次我在他电脑上打包成功了。
一顿操作之后,我选择的打包为单个路径而不是单个文件(为了执行能快一点),但是提示错误:
然后百度,各种骚答案都出来了。试了大概一个小时,到了下午6点,都不行。我尝试着打包一个helloworld级别的pyqt5应用,结果成功了,那么说明这个锅pyqt5不背(当时完全懵逼了,根本不知道哪出错),然后从张辽那拷贝了原始的代码进行打包,结果成功。(一次打包过程接近15分钟,可以说提心吊胆)
猜测是后面代码优化的时候使用了导致这次错误的包。于是去掉了import skimage的语句,结果打包成功。
现在说明问题只能出在skimage这个包了。于是新建一个测试文件,将其打包为-c的控制台应用,执行后出现以下错误:
定位到最后,也就是 ModuleNotFoundError: No module named 'pywt._extensions._cwt' 这个错误。
百度之后,应该是hiddenimport的解决方法。测试之后应用到“标注器”的打包上,测试成功。
这个时候已经是晚上10点了。但是在其他电脑上依然有以下问题:
这就比较好解决了。百度之后是环境变量的问题。设置之后果然点亮成功
今天的经历可谓一波三折,并且浪费了大量的时间。总结起来的话,当时就应该先设置“-c -D”的参数进行打包,方便定位错误。但是这一波操作下来至少也长了很多见识。pyqt5桌面应用的发布,或者说python在Windows系统上的打包发布,的确是个深坑。python也应该有他自己的作用域,下次,我会尽量选择Qt而不是PyQt5进行桌面应用的开发。