pyinstaller 是目前被认为比较好使的python程序打包工具。在初次使用pyinstaller打包.py文件时,往往会遇到很多意想不到的问题,下面结合我的经历来讲讲如何使用pyinstaller打包.py文件。
作用:生成不依赖python环境的,可以直接执行的程序,使用Pyinstaller打包python程序为单文件exe
常用的参数:
- -h 查看帮助
- -F 生成的文件不依赖其他库,可以单独执行
- -D 或者–onedir 生成程序放置的文件夹
- –clean 清理打包过程中的临时文件
一般会主要使用l-F,或者-D。
- 当使用 xxx.py当前文件夹>pyinstaller -F xxx.py 会在xxx.py当前文件夹下生成一个dist文件夹,且dist文件夹下有一个xxx.exe文件,
- 当使用 xxx.py当前文件夹>pyinstaller -D xxx.py 会在xxx.py当前文件夹下生成一个dist文件夹,dist文件夹下有一个xxx.exe文件和一堆依赖文件,这些依赖文件就是自己源程序中调用的模块和环境依赖。
我在打包中遇到的问题:python环境是Anconda+Python3.7.2,64位系统
1、网上有很多人遇到pyinstaller装错32位或64位版本的,在这里提供一个最简单的方法,写一个hello world的py程序,如果这个能成功打包exe文件并成功运行,说明和pyinstaller无关,你的环境是对的,只是缺少“一些”第三方依赖文件。
2、因为pyinstaller只有3.4版本,所以用3.7版的python打包出现兼容问题~~,刚开始打包失败,然后就换了3.5版本的python,然后,,就没有然后了,后来发现其实3.7也可以打包成功,所以我走了一些弯路,网上的东西有很多都是不适用自己现在遇到的问题的。
3、报"RuntimeError: maximum recursion depth exceeded in comparison "
出现原因:python默认迭代次数有限(大概是1000左右),如果你引用了plot画图,或者某个循环方法超出此限制,就会报这个错误。
解决方法:打包失败,也会生成一个spec文件,如你的主python文件叫做Main.py,则修改Main.spec:
添加代码行: import sys
sys.setrecursionlimit(1000000)
然后在命令行中用此spec文件打包python程序:pyinstaller -F Main.spec
4、打包失败回滚,然后报了一次代码乱码问题,我忘记了具体的错误提示,解决是在命令行先输入chcp 65001,转到utf-8代码页,
5、打包后生成.exe文件,但是双击会打印一些错误日志,然后退出。在命令行执行会提示: ModuleNotFoundError:No module named typedefs之类的问题
解决方法:需要把提示中缺少的模块放到.spec文件中的 hiddenimports=[]中然后再去pyinstaller -F Main.spec 再次执行打包操作。比如缺少sklearn 就hiddenimports = ['sklearn']
目前就遇到这些问题。