一.前言
在本次这个模块,我将针对pycharm上使用pyinstaller打包exe文件的过程进行分析,包括一些bug的改正。
本次环境是:python 3.8
打包的类:matplotlib、numpy、cv2
二.pyinstaller安装
2.1 pycharm打开Terminal对话框:
View->Tool Windows->Terminal
2.2 安装pyinstaller
pip install pyinstaller
2.3 相关参数
-F 打包成一个exe文件,小项目可以采用,打开比较慢,多个.py打包时不能使用
-D 默认参数,打包结果放入到创建的文件夹中,可以看到里面有很多的依赖文件
-w 使用项目的GUI界面,无cmd控制台
-c 默认参数,使用cmd控制台 如果打包文件执行报错,可尝试用-c 显示控制台
-n 执行项目的名称,默认.py的文件名
-i 将ico图标打包到exe文件中
--onefile 将结果打包成一个可执行文件
--onedir 将所有结果打包到一个文件夹中,该文件夹包括一个可执行文件和可执行文件执行时需要的依赖文件(默认)
--paths=DIR 设置导入路径
--distpath=DIR 设置将打包的结果文件放置的路径
--specpath=DIR 设置将spec文件放置的路径
--windowed 使用windows子系统执行,不会打开命令行(只对windows有效)
--nowindowed 使用控制台子系统执行(默认)(只对windows有效)
--icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对windows有效)
如果脚本导入了模块,需要加入选项--hidden-import=(模块名)
三. pyinstaller使用(以cv_1.py为例子)
pyinstaller -F -w cv_1.py
大多数情况下,这种即可实现,会生成三个文件,build、dist、cv_1.spec
cv_1.spec详细细节
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['cv_1.py'],
pathex=['D:\\Pycharmdetail\\venv\\Lib\\site-packages'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
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='cv_1',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
在dist中存在有自己的exe可执行文件,运行即可
四.可能遇到的debug
主要是针对我在打包遇到的情况
4.1 exe屏幕闪退
这种情况可以在Terminal中来运行exe文件,即可把结果保留。
4.2 no module named "XXX"
我这边的情况是没有把相对应的包打包进去,pycharm这边是自己存在有lib,里面存放了site-packages,我们需要在settings中找到包所在的地方
改正代码如下:
pyinstaller -F cv_1.py -p D:\Pycharmdetail\venv\Lib\site-packages
4.3 numpy无法导入
首先是显示
问题
这个问题很艹蛋,我查阅了好多资料,后来仔细一看是numpy上面出现了问题
1.numpy版本过高,不匹配【未解决】
2.在上面的spec文件中, hiddenimports=['numpy']来加入所缺的类【未解决】
3.后来可能是觉得numpy的多重版本问题,我发现本电脑python中存在D:\python\Lib\site-packages,其中存在有numpy, 之前pycharm的库中,同样存在numpy,我发现这两个版本是不一样的,我直接将pycharm中numpy1.16.1的版本直接覆盖python中,同样的操作,发现最后实现打包。
5. 结果
本实验是简单实现一个canny的功能,最终呈现结果。
简单用小学妹的照片尝试一下!开心!