为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程

为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程_第1张图片

由于工作需要,要把自己写的代码打包成软件发给其他人使用。之前在我自己电脑上使用Github上的开发版Pyinstaller,一直没有问题。没想到前两天重置电脑以后悲剧就来了。打包程序一直出现各种莫名其妙的错误。

经过三天的不断尝试和摸索,融合了各个方法,终于搞定了软件打包的方法。我的方法不一定有通用性,但是确实解决了我遇到的问题。在这里给大家分享一下。如果有大神指出更好更简单的方法,那就更好了

平台:亲测win10及win7有效,Anaconda3 + Python3.6

先上步骤

① 在Anaconda Navigator中安装Python3.5,我这里将其命名为python35

② 在Anaconda Prompt中输入 activate python35,进入到python3.5环境

③ 在Anaconda Prompt中,将代码中所有用到的库通过 pip install 库名 的方式安装到 python3.5 环境中。这里注意观察一下库的安装路径。在我的电脑中,安装路径是C:UsersftxunAppDataLocalContinuumanaconda3Libsite-packages

④ 在Anaconda Prompt中,使用 pip install pyinstaller 安装 pyinstaller3.3.1

⑤ 打开库的安装路径,将用到的库文件夹复制出来,和需要打包的代码放在同一个文件夹内。这里我为了打包方便,在Anaconda的根目录下创建了一个新文件夹,将用到的库和源代码都放在了文件夹内。

⑥ 在Anaconda Prompt中,activate python3.5环境后,cd到需要打包的文件夹,然后用pyinstaller进行打包。

关于pyinstaller打包,网上资料很多也很全,这里就不介绍了。有兴趣的可以戳:

PyInstaller用法 - CSDN​blog.csdn.net

注意事项

注 意 1:相对路径

打包时,程序中引用的相对路径会被改成绝对路径!比如,我有一个文件是要放在软件目录下的ANALYSIS子文件夹中,生成的exe被放在了c:userdist文件夹。那这个ANALYSIS子文件夹的相对路径就会被锁定为C:userdistANALYSIS!这个问题非常隐蔽,如果exe文件位置不改变的话,不会发现问题。

如果你的代码里出现了相对路径,建议在程序中先用os.getcwd()获取当前文件夹位置,然后把所有的相对路径变成绝对路径。

注意 2:多次打包

不知道为什么,打包完成一次之后,如果只是代码改动而文件名字不变,再次生成的exe文件会和原来一样,重启Anaconda Prompt也不行。建议每次打包的时候换一个不同的名字。

========== 分割线 ==========

一些碎碎念

搞定完程序打包之后我脑海里只有一句话 ——

为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程_第2张图片
真的,坑太多了。真的,太不Pythonic了

一开始,我用Python3.6,下载Pyinstaller,再用Github上面的测试版替代。然而无解,用不了。打包一直提示迭代次数超过限制。

程序里已经设置了迭代次数为9999999,结果就是程序会运行好几十分钟,然后报错。

Win7换Win10,换了三四台电脑,依旧不行,心里凉了一截。

为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程_第3张图片

之后尝试使用Py2exe,依旧不行,Python3.5也不行。网上说支持Python3.3及以上,实际上只支持Python3.3和3.4,还有很大概率运行失败。完全不建议使用。

然后试着在Python3.5环境中使用Pyinstaller,很快就打包出来了软件。当时非常开心,然而一看打包出来的软件,只有7MB。当时心都凉了(以前我打包出来的都是几十MB起的)

一打开生成的exe,果不其然,直接闪退。用cmd打开程序,显示报错:缺少pandas组件。

为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程_第4张图片

上网一查,果然很多人都遇到过这个问题,看来是Pyinstaller的通病。网上找到两种办法:

① 将Pandas的库文件放到打包文件的同目录下;
② 修改打包时的spec文件,通过spec文件执行打包命令。

这里我采用了第二种,打包出来的软件有50M。嗯,感觉应该可以了。

但是,我还是太年轻 太拿衣服,exe打开依旧闪退。这次报错告诉我,缺少sympy库。这次再去网上查,发现遇到这个问题的好像少了很多。没办法,只好自己硬着头皮解决了。

为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程_第5张图片

本想是不是要按之前Pandas库的方法, 照葫芦画瓢改一下spec文件。这时我灵光一现,想到了上面所说的第一种方法。于是,我将代码中用到的所有库(简单粗暴)全都拷贝到了打包文件目录里面。再在Python3.5里面用Pyinstaller打包。终于——成功了!

为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程_第6张图片

你可能感兴趣的:(为什么用pyinstaller打包后打不开_Py打包exe(上篇): Python3.6环境下的坑路历程)