解决Python脚本打包遇到的各种问题
故事背景
某日隔壁部门同事请领导帮忙写个脚本,能够完成excel上的高重复度繁复的工作。
领导随手交给我,“这个东西简单的,日天你去做吧”
正在b站摸鱼的我:
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1568897268519&di=3c37c736899b2b4ff2e25bc338bc1058&imgtype=0&src=http%3A%2F%2Fspider.nosdn.127.net%2F08dcde09abcfd1961327a0c198d65b88.jpeg)
行吧这还能不干吗,还好不难
花了一上午完成脚本,忽然想到,糟了,怕不是中了圈套了,还要负责教会没有编程基础的同事怎么使用,不过机智如我立即想到了解决方案——封装成exe
![](https://i-blog.csdnimg.cn/blog_migrate/c1b41216686cb9cfdff4b04786baad8a.jpeg)
通过百度得悉,常用python封装不过py2exe、PyInstaller、cx_Freeze等工具,最后确定使用 PyInstaller ,毕竟教程多,教程少我怕根本学不会……
以下开始花里胡哨的错误操作
那么开始了
首先当然是安装
进入cmd命令行
pip install pyinstaller -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
这一步的目的是防止出现国外源下载慢或者无法下载
若出现pip不是内部命令之类的,需要手动配置一下环境变量,可自行百度
接下来输入pyinstaller,若出现相关信息则安装成功。
若成功则可直接通过以下pyinstaller指令完成封装
至此,任务完成!
# 打包成一个文件
pyinstaller -F test.py
# 打包成文件夹(默认)
pyinstaller test.py
要是能那么简单就好了……大多数人在这一步都是要爆炸的
常见问题可概括为以下两种:
- 封装过程中出现错误,显示各种importerror
- 封装正常完成,但是双击后没有运行
我遇到的情况是importerror:unable to import required ……
![](https://i-blog.csdnimg.cn/blog_migrate/8f361d5a4abc0b7e6aa649f02adda2b6.png)
在百度上得到的解决方案是,降级适应大法:给numpy降级,降级到1.16.1版本
pip uninstall numpy
pip install numpy==1.16.2
以及另一种解决方案,缺啥补啥大法:既然你import不了,大爷我给你人为在脚本内引入
import numpy.random.common
import numpy.random.bounded_integers
import numpy.random.entropy
我很负责任地告诉你,这两种方法除了让你有一种“本宝宝一下午都在忙碌”的充实感外,毫无作用!
而后我手贱又封装了一次,发现出现了截然不同的错误……
![](https://i-blog.csdnimg.cn/blog_migrate/8aadf885eff536755664619e8b581b90.png)
至此,卒
遂尝试第二个包,cx_Freeze
同样pip安装后,封装。
这玩意儿不仅时间长,封装后还特别大
但是!没有报错了!
成功封装了!
然而双击无反应……
通过命令行得知,仍然是numpy的问题
![](https://i-blog.csdnimg.cn/blog_migrate/228cb9e209147a8fb84a8c7c9547d534.png)
百度后又发现一种解决方案
安装python拓展库numpy-mkl
然而该网站下载速度感人,20min后,12M/200M
心态爆炸
![](https://i-blog.csdnimg.cn/blog_migrate/7cf7498dc00e8b5595ae7631eb244e11.jpeg)
认怂,询问公司大佬
正确方法
大佬审题30s后表示可能是因为版本冲突或者某些包不兼容的原因。
五分钟后大佬发来了封装好的exe,并且告诉我
“我帮你封装好了,顺便帮你改善了一下你脚本里的一些逻辑问题”
![](https://i-blog.csdnimg.cn/blog_migrate/30dfeffe6d9749c45db44fc15cdd7262.jpeg)
虚心请教以后,方法如下:
原理:通过python虚拟环境来配置一个干净的环境,里面没有各种乱七八糟的包,这样不容易出现版本问题。
第一步安装
virtualenv --version #若已安装,查看版本
pip install virtualenv==16.1 # 安装指定版本的virtualenv
若已安装,查看版本号若是16.4,则最好pip uninstall掉,否则容易出现
ModuleNotFoundError: No module named ‘distutils’
(此处又是一个坑,原因是在“加载模块挂钩”序列期间,hook-distutils.py缺少并且distutils模块不包含在最终的可执行二进制文件中。因此最好使用16.1版本)
virtualenv --no-site-packages myenv
通过以上命令行建立名字为myenv的虚拟环境(文件夹),注意,请在想放置的目录下执行该操作。
通过参数 --no-site-packages,就可以得到一个不带任何第三方包的干净的python运行环境。
随后可以在pycharm中直接open这个文件夹,并在终端中cd进入Script文件夹,执行activate操作,命令提示符就变了,会有(myenv)的前缀,表示当前环境是一个名为myenv的python环境。
接着就可以装需要的包以及试运行一下脚本了。
无误后,终端输入
pyinstaller -F xxxx.py #xxxx是你的要封装的脚本
在终端中运行一下无误!
完美!
![](https://i-blog.csdnimg.cn/blog_migrate/ed34a571fd0a612fbd46bababc59b569.jpeg)
记得一定要在封装后自己试运行一下,有时候出exe也无法成功运行的,到时候给了同事没法用就尴尬了。