PyInstaller打包exe可执⾏⽂件详细教程
⽂章⽬录
写本⽂的初衷是,⾃⼰在使⽤PyInstaller过程中踩了很多坑,花了很多时间搜了很多教程,最后才实现了打包的exe软件能够在⾃⼰以及其他⼈的Windows PC上都正常运⾏。
代码是⼀个交互式的医学影像标注软件,GUI通过PyQt 5,深度学习算法基于PyTorch实现,调⽤了基于TensorFlow的crop_and_resize 实现的⼀个外部包RoIAlign。
⼤致描述⼀下要打包的代码包含哪些元素:
1. 代码及代码中import的包(PyInstaller会⾃动打包进来)
2. 外部包RoIAlign(⼿动修改.spec⽂件)
3. 模型的checkpoint.pth.tar(⼿动修改.spec⽂件)
描述⼀下踩到的坑,希望可以帮到看到这篇⽂章的⼈。
1. checkpoint没有被⾃动打包,需⼿动修改spec⽂件,然后通过spec重新进⾏打包。
2. 外部包RoIAlign没有被⾃动打包,需⼿动修改spec⽂件,然后通过spec重新进⾏打包。
3. spec的属性在其⽣成时已经被决定,所以在运⾏spec重新打包时,即使改变了参数,如-D变为-F,是⽆效的。
4. 在⾃⼰的PC上可以运⾏,但在别⼈的PC上运⾏就闪退。
我这边的开发环境是:
Window 10
Anaconda3
Python 3.6.10
PyTorch 1.2.0
PyInstaller
基本上
PyInstaller安装
pip安装
pip install pyinstaller
pip升级
pip install --upgrade pyinstaller
PyInstaller使⽤
PyInstaller的使⽤还是⾮常简单的,假设主程序代码是main.py, 只需要使⽤以下代码即可实现。
pyinstaller main.py
官⽅⽂档可以点击
当然可以按照按照⾃⼰的需求修改参数,这⾥列⼀下常⽤参数对应的含义。
参数含义
-h, --help显⽰PyInstaller帮助信息并退出
-
v, --version显⽰PyInstaller版本信息
–clean在打包前清除PyInstaller缓存和临时⽂件
-D, --onedir创建⼀个包含可执⾏⽂件的⽂件夹包(默认)
-F, --onefile创建⼀个可执⾏的⽂件包
-n, --name更改打包⽣成的⽂件的⽂件名
-c, --console, --
nowindowed
打开⽤于标准I / O的控制台窗⼝(默认)。 在Windows上,如果第⼀个脚本是“ .pyw”⽂件,则此选项⽆效。
-w, – windowed, --noconsole Windows和Mac OS X:不提供标准I / O的控制台窗⼝。 在Mac OS X上,这也会触发构建OS X .app捆绑软件。 在Windows上,如果第⼀个脚本是“ .pyw”⽂件,则将设置此选项。 在* NIX系统中,此选项被忽略。
其他的⼀些参数可以点击 查询。
其中,What to bundle,where to bundle部分,更建议通过spec⽂件来修改。
这边有个⼩建议,就是尽量不是⽤-F这个指令。将全部⽂件打包到⼀个可执⾏exe中,很容易遇到问题,且不容易debug。在⽤PyInstaller 时,先使⽤-D,将⽂件打包到⼀个⽂件夹⾥,后⾯我再介绍⽤什么⽂件将这个⽂件夹转化为⼀个exe,易调试,简单,且可以压缩⽂件夹的⼤⼩。
需要调试时,⽤
pyinstaller -D -c main.py
这样在运⾏exe时,控制台窗⼝会弹出,⽅便进⾏调试。
调试完成,⽤
pyinstaller -D -w main.py
这样在运⾏exe时,控制台窗⼝不会弹出,⽅便使⽤。
python安装教程非常详细如何让PyInstaller把额外的⽂件打包进来
上⾯提到我的应⽤⾥需要把深度学习模型的权重⽂件,就是checkpoint.pth.tar⼀起打包起来。
假设将打包⽂件放置在release⽂件夹中,则按照上⾯的操作,release⽂件夹中将包含以下3个⽂件/⽂件
夹:build
release
main.spec
此时我们需要修改Main.spec⽂件。
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['..\\main.py'],
pathex=['E:\\release'],
binaries=[],
datas=[],
hiddenimports=[],
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,
[],
exclude_binaries=True,
name='Controller',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='Controller')
修改Analysis中的datas即可。将要添加的⽂件的路径和添加后的路径给出即可。
a = Analysis(['..\\main.py'],
pathex=['E:\\release'],
binaries=[],
datas=[('..\\checkpoint.pth.tar','checkpoint.pth.tar')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
然后重新⽤main.spec打包⼀次。前⾯说过了,⽤.spec打包的话,更改参数⽆效。因此只需要
pyinstaller main.spec
即可。
完成后,在dist⽂件夹中,应该能到checkpoint.pth.tar⽂件了。
当然了,更简单的⽅法,就是直接拷贝到dist⾥。。。也没问题
如何让PyInstaller把外部包打包进来
下⾯我们还是以使⽤了外部包的情况来说明。
尽管roi_align已经出现在了dist⽂件夹中,但我在运⾏中依然遇到了不到roi_align-0.0.的报错,我是通过以下⽅式来解决,让需要的包和依赖⽂件都被添加到dist⽂件夹中。
**核⼼还是根据报错信息添加对应的依赖⽂件。**这边只是⼀个⽰例
依然是需要修改.spec⽂件。
# -*- mode: python ; coding: utf-8 -*-
import sys
sys.setrecursionlimit(5000)
from os import path
site_packages = next(p for p in sys.path if 'site-packages' in p)
block_cipher = None
a = Analysis(['..\\main.py'],
pathex=['E:\\release'],
binaries=[],
datas=[('..\\checkpoint.pth.tar','checkpoint.pth.tar') ,(path.join(site_packages,'roi_align-0.0.'),'roi_align-0.0.2-py3.')],
hiddenimports=['roi_align','crop_and_resize.py','crop_and_resize_cpu','hon_special'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
解决⾃⼰的PC可以运⾏打包好的exe,别⼈PC却⽆法运⾏的问题
这个问题困扰了我好久。后来发现是问题出在缺少 Visual C++ Redistributable。解决⽅法是:
1. ⾸先,请先确认 Windows 操作系统为 32 位还是 64 位(可参考该链接进⾏查询);
2. 确定系统版本之后
a) 32 位系统:"vc_”进⾏配置;
b) 64 位系统:“vc_”进⾏配置;
微软官⽅有提供这两个安装包,⽹上搜索 ⼀下也有很多。
将打包⽣成的⽂件夹转成⼀个单⼀exe