如何使用PyInstaller打包Python代码为执行档-2

工作环境:
-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被覆盖掉了哭哭。那我们有办法透过修改配置文件来达到目的吗,答案是可以的,我的方法如下:

建立一个简单的simple.py档,里面就写个hellow world而已:
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


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章