1.使用pyinstaller可以方便的实现Py文件转exe文件,这里是它的manual: http://www.pythonhosted.org/PyInstaller/
2.使用命令行:
1)首先cmd进入要转换的py文件所在目录
2)执行命令:pyinstaller myscript.py 即可
3)可能你的工程包含多个py文件,只要在命令中指明入口所在的py文件就行
4)默认的执行,像2)中的命令,采用One Folder模式,打包后所有的文件都放到一个文件夹中
5)可以通过“-F”选项实现打包到一个大exe文件,即One File模式:pyinstaller -F myscript.py
6)如果是带GUI的窗口程序,可以带“-w”选项,将默认带的stdout控制台去掉了:pyinstaller -F -w myscript.py
3.调试:
1)命令行执行时增加“-d”选项,可在允许exe文件时,看到Pyinstaller架构运行的相关信息,对调试很有用
2)如果带了“-w”选项,调试信息以对话框形式出现,启动exe时,不断弹出对话框显示调试信息
3)如果没有“-w”选项,则通过stdout输出调试信息,这时需要在cmd中启动exe文件
4)调试时一般采用One Folder模式
5)即便是有窗口的应用(如利用了wxPython等GUI)一般先在调试模式下,通过stdout调试生成的exe文件,没有问题再生成正式发布exe;
6)调试:pyinstaller -d myscript.py
7)发布:pyinstaller -F -w myscript.py
4.调试常见问题:
1)在-w模式下,得到了对话框输出:pyi_rth_pkgres returned -1;不知道为什么,搜索也未果;重新打包加-d,去掉-w,控制台中启动生成的exe,得到调试信息:ImportError: The 'packaging' package is required; normally this is bundled with this package so if you get this warning, consult the packager of your distribution.
pyi_rth_pkgres returned -1
2)搜索得到答案:http://blog.csdn.net/kongxx/article/details/51037331
开发环境
python3.6.4
pyinstaller
tensorflow
PyAudio-0.2.11
需求分析:
python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件,降低脚本对环境的依赖性,同时运行更加迅速。
当然打包的脚本似乎不是在所有的win平台下都能使用,win7有一部分不能使用,我在win10能够很好的运行。
准备:
pyinstaller(http://www.pyinstaller.org/) 首先还是去官网看支持的python版本,不然会很尴尬的
#安装方法1:
#安装pyinstaller和pywin32
#使用一下命令将自动安装两个包,在cmd用pip命令
#pip install -i https://pypi.douban.com/simple/ pyinstaller(豆瓣源)
安装方法二:
pip install pyinstaller (会自动下载future,pywin32,pyinstaller)
如何使用Pyinstaller
方法一:
1.cmd到/python/scripts 找到pyinstaller.exe
2.输入命令
1 |
|
方法二:
1.进入pyinstaller的解压包,输入命令
2."python pyinstaller.py -F path:demo.py"
从cmd最后一行输出可查找到生成的文件
12468 INFO: Appending archive to EXE D:\Documents\Downloads\PyInstaller-3.2\down
load\dist\download.exe
后记:
1.程序设置自定义图标:pyinstaller -F -i ico_path py_path
首先需要下载一张正常的ico,不能用直接修改后缀的。
下载图片: https://www.easyicon.net
图片改为ico: http://www.ico.la/
输入命令 pyinstaller -F -i "demo.ico" "main.py"
2.报错提示:
pyinstaller -F -i "demo.ico" "main.py" 命令格式一定是先图标路径,再程序路径。
路径最好为英文,没有中文字符;脚本名称里没有特殊字符如 .
使用utf8编码
图标文件必须是正常格式,不能直接更改后缀。
tuble index out of range ---》pyinstaller版本尚未支持python的版本
3.窗口程序
使用 pyinstaller -F -w -i ico_path py_path ,这样脚本不会弹出命令窗,前提是用了GUI库.
4.导入模块问题
pyinstaller -F -w -i --hidden-import queue ico_path py_path 加上选项
使用pyinstaller可以把python程序打包成exe可执行文件,这样就能在其他人的电脑上运行你的程序了。这是我首次使用遇到的坑和一些经验总结。
1、pyinstaller打包exe文件时,递归太深:RecursionError: maximum recursion depth exceeded。
解决方法:
第一步:使用pyi-makespec [option] name.py,生成name.spec文件。(这里,我的name.py是control_gui.spec)
可以参考官方文档:点击打开链接
第二步:将以下代码添加到上面生成的spec文件中。
-
import sys
-
sys.setrecursionlimit(5000)#5000这个数字可以随便设
第三步:使用pyinstaller [option] name.spec进行打包。
2、打包成exe文件后,点击exe文件,提示:Failed to execute [程序名]。
这个问题用了比较久的时间去解决,我这里出错的主要原因是使用了tensorflow,然后对应的pandas版本不正确,才导致了错误,下面我会详细说明一下。
首先,分析错误的步骤。建议一开始先使用-D命令对程序进行打包,这样在生成的build文件夹中也会有一个exe文件,点击这个exe文件可以调出控制台,上面会给出错误信息,控制台给出错误信息的时间特别短,所以有必要进行录屏,然后仔细观察错误,以下给出我的程序中出现的错误。
很明显,上面给出错误是:type object 'pandas._libs.tslibs.conversion._TSObject'has no attribute '_reduce_cython__'。
其中,以下两个作者给出了解决方案,我是按照第二个作者的博客修改成功的,因为我的Python版本是3.6。第三个文章是github上针对这一问题的讨论,有兴趣的也可以参与一下。
第一个:成功解决打包时不能import自定义的包或库出现运行exe时No module named 缺少包;
第二个:成功解决pyinstaller打包AttributeError:type object pandas._TSObject has no attribute _reduce_cython_。
第三个:no attribute __reduce_cython__
具体说一下我的问题所在。我用的python版本是3.X是一个原因,其中一个重要的原因是我的Pandas版本是0.23.0,应该把安装0.20.0版本。因此,我把pandas版本使用pip install pandas==0.20.0安装之后,问题就解决了!