一 前言
python脚本的执行对于不懂计算机的人来说非常痛苦,因此他们想要一个windows下能执行的exe程序,来满足在没搭建python环境的主机上执行对应的这段python程序。一个愉快的周末,本来可以愉快的打机看剧的,却被老姐叫来干活,要求将python转成exe,因为她boss电脑上没有满足的python环境,然后我就开始周末的忙碌了,因为网络上的文档太散太杂,没有一篇满足我的整个需求。最终用了两天才完成整个流程,可能我比较菜的原因 :( ,为了给亲爱的老姐学习,因此我特写此篇文档,将主要讲解如何从无到有地完成python转exe。
二 环境
- 系统: win10虚拟机
- python版本:3.5.2
- pyinstaller版本:3.4
三 环境搭建
因为exe只能在windows执行,而我本机为macos系统,因此只能利用虚拟机,然后下载镜像文件iso来实现win10系统。这里用的虚拟机软件为virtualBox,镜像文件为官网下载的win10(64bit)。
一切准备完毕后,开始搭建python环境,这里很重要,在我搭建环境的时候,整个搭建过程的大部分坑都是因为python环境引起的,不要问我为啥会这样,因为我只是一个拧螺丝的,除了毕业设计用到python之后两年基本与之绝缘。因此在这里我建议大家一步到位,直接使用anaconda来搭建,直接去官网下载3.7版本的即可,(如果下载太慢,可以考虑各大大学的镜像)因为anaconda内部可以满足各个版本切换。安装完成后将anaconda目录和anaconda目录下的Scripts加入环境变量的Path下即可。
win10 我的电脑->属性->高级系统设置->环境变量->Path,如下图所示,加上最后两行,路径为你本机anaconda目录
切换python版本,因为下载的anaconda自带版本是3.7,可能有些小伙伴需要较低版本的python,稍微介绍切换python版本命令,本文参考Anaconda多版本Python管理以及TensorFlow版本的选择安装,在开始菜单中打cmd进入命令提示符。
#查看anaconda下的python版本
conda info --envs
#如果默认源下载过慢,建议使用国内源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
#下载python版本,这里我下载3.5.2,python352为自定义名字
conda create --name python352 python=3.5.2
#再次查看anaconda下的python版本,可以发现多处python352这个snapshot
conda info --envs
#使用3.5.2版本
activate python352
#版本已切换
python -V
下面进行pyinstaller安装
pip install pyinstaller
到此整个环境已经搭建完成。如果搭建完成发现原来的脚本无法执行,缺少类库,比如numpy。使用pip命令重装类库即可。
pip install numpy
四 测试
按理来说,现在已经完成了整个环境的搭建可以开始玩耍了,已经可以完成一些简单脚本的转换了,比如以下这个helloworld脚本。
print("Hello World")
input()
保存在随便一个不含中文路径的目录下(养成好习惯,防止因为路径中文乱码问题被自己坑),然后在cmd下用pyinstaller命令打包成exe即可。pyinstaller命令及参数解释
#cd到刚刚写的helloworld.py目录
cd path
#使用installer命令安装,这里指定生成一个可执行exe文件即可
pyinstaller -F helloworld.py
#如果生成成功,会在当前目录的dist下生成一个可执行exe文件
cd dist
#运行exe测试
helloword.exe
#成功即完成
五 常见问题以及解决方案
5.1生成exe异常
13207 INFO: Processing pre-safe import module hook setuptools.extern.six.moves
Traceback (most recent call last):
File "<string>", line 2, in <module>
ImportError: No module named 'setuptools._vendor'
解决方案:升级setuptools即可
pip install -U setuptools
5.2成功生成exe但是执行异常
ImportError: No module named 'numpy.core._dtype_ctypes'
[6084] Failed to execute script sh50_0118_final
解决方案:首先先进入本地库的仓库,如果是通过anaconda安装的,python路径\Lib\site-packages\PyInstaller\hooks,python路径可以通过cmd命令where python来查询。
找到对应的hook-numpy.py,编辑
#如果文件中存在hiddenimports则在后面加上对应的类
#否则文件在最后新建数组hiddenimports,然后加上对应的类
hiddenimports=[
#all your previous hidden imports
'numpy.core._dtype_ctypes'
]
然后重新打包py文件至exe,再次执行如果依旧报类似问题,依次处理直到成功。这里要加上--clean命令,清理之前生成的文件。
pyinstaller -F --clean *.py
在这里要感谢打包时遇到pandas库报错处理(转)的帮助,解决了这个卡了近乎一天的问题。
六 总结
花了整个周末的时间来完成了这个工作,从弄虚拟机再到搭环境,坑很多,还有很多问题没有罗列出来(因为这是事后整理的,具体问题懒得重现了- -),只是取了几个具有代表性的、很难百度or谷歌出来的疑难杂症来说,希望对后来者有所启发。这样虽然已经完成工作,但是打包出来的exe非常大,紧紧一个helloworld就生成了6MB的exe文件,如果我还有空,并且我姐还有需求,可能会继续完善,减小exe的体积。完结撒花?