工作环境:
-Windows 10, Windows Server 2019
-Anaconda 2020.02
-Python 3.6.10
问题描述:
饿死抬头,上一篇分享了关于如何用PyInstaller打包.py为.exe。但是有个问题,这个执行档其实并不是独立的,如果我们将main.exe挪到其他位置,可以发现他无法开启,对于习惯用免安装程式的我来说是不能允许的,所以这篇就分享一下怎么能做一个真正独立的.exe。
常见的教学文章都会用下面代码步骤搞定我们碰到的问题,-F代表把所有需要的套件和主代码都浓缩为一个档案(就是.exe);-w代表关闭执行时不要显示Windows的命令提示视窗(虽然这个可以用来Debug)[1]
pyinstaller -F -w 我的程式码.py
我们先保留上一篇好不容易调教出来的.spec档,并且运行上面那行代码:
(keras4) C:\Users\*\Documents\GUI-20200323>pyinstaller -F -w main.py193 INFO: PyInstaller: 3.6193 INFO: Python: 3.6.10 (conda)193 INFO: Platform: Windows-10-10.0.18362-SP0213 INFO: wrote C:\Users\*\Documents\GUI-20200323\main.spec215 INFO: UPX is not available.218 INFO: Extending PYTHONPATH with paths['C:\\Users\\*\\Documents\\GUI-20200323', 'C:\\Users\\*\\Documents\\GUI-20200323']219 INFO: checking Analysis.....中间省略..... File "c:\users\*\appdata\local\continuum\anaconda3\envs\keras4\lib\ast.py", line 263, in generic_visit self.visit(value) File "c:\users\*\appdata\local\continuum\anaconda3\envs\keras4\lib\ast.py", line 253, in visit return visitor(node) File "c:\users\*\appdata\local\continuum\anaconda3\envs\keras4\lib\ast.py", line 263, in generic_visit self.visit(value) File "c:\users\*\appdata\local\continuum\anaconda3\envs\keras4\lib\ast.py", line 253, in visit return visitor(node) File "c:\users\*\appdata\local\continuum\anaconda3\envs\keras4\lib\ast.py", line 257, in generic_visit for field, value in iter_fields(node):RecursionError: maximum recursion depth exceeded
解决方法:
为什么递迴限制的问题又发生了,原来是因为main.spec被覆盖掉了哭哭。那我们有办法透过修改配置文件来达到目的吗,答案是可以的,我的方法如下:
import osprint('Hellow World!!!')os.system('pause')
利用pyinstaller -F -w simple.py打包他比较一下simple.spec和main.spec,接下来我们要开始修改simple.spec把simple.spec里面的simple字眼替换为simple参考main.spec,把simple.spec里面的hiddenimports填写一致参考main.spec,把simple.spec里面的pathex填写一致simple.spec最上面要补上这行代码:import syssys.setrecursionlimit(9000000)
把simple.spec改名为main.spec执行下面代码,搞定收工,整个dist资料夹就只有一个main.exe档:pyinstaller main.spec
下面就附上修改完毕的.spec:
# -*- mode: python ; coding: utf-8 -*-import sys# 这边要注意sys.setrecursionlimit(9000000)# 这边要注意block_cipher = Nonea = Analysis(['main.py'],# 这边要注意 pathex=['C:\\Users\\e10832\\Documents\\GUI-20200323'], #这边要注意 binaries=[], datas=[], hiddenimports=['pkg_resources.py2_warn', 'sklearn.utils._cython_blas'], # 这边要注意 hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False)pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='main', # 这边要注意 debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False )
补充说明:
虽然我们顺利完成了独立的.exe档,但是有够肥(280MB),而且开启速度有够慢!!!等我研究完怎么瘦身再跟大家分享~
参考资料:
[1]https://www.yuanrenxue.com/tricks/pyinstaller-spec.html