首先,先自学了pyqt5编写界面,编写的过程就下次再说吧。
编写完之后,文件夹中包括权重文件和两张图片。pyinstaller打包不能打包图片和权重文件,百度了好几圈终于知道了,/(ㄒoㄒ)/~~
然后这些图片如何处理呢,后来看到了大佬写的代码,把图片先转成py文件,再从py文件中解码出来。代码如下:
1.图片转py文件代码:
import base64
def pic2py(picture_name):
"""
将图像文件转换为py文件
:param picture_name:
:return:
"""
open_pic = open("%s" % picture_name, 'rb')
b64str = base64.b64encode(open_pic.read())
open_pic.close()
# 注意这边b64str一定要加上.decode()
write_data = 'img = "%s"' % b64str.decode()
f = open('%s.py' % picture_name.replace('.', '_'), 'w+')
f.write(write_data)
f.close()
if __name__ == '__main__':
pics = ["background.tif", "single_back.tif"]
for i in pics:
pic2py(i)
print("ok")
接下来,在你使用图片的py文件中加入如下:
from single_back_tif import img as single_back
from background_tif import img as background
tmp = open('single_back.tif', 'wb') # 创建临时的文件
tmp.write(base64.b64decode(single_back)) ##把这个one图片解码出来,写入文件中去。
tmp.close()
ok,图片解决了~~~
接下来权重文件怎么办呢,首先在界面中加一个按键,自己选择权重文件路径进行加载(后来实验发现此方法不可行,可行方法在下面介绍)
比如,我定义了一个按键功能,如下:
def openpth(self):
global openfile_name_pth
openfile_name_pth, _ = QFileDialog.getOpenFileName(self.open_pth, '选择权重文件', '/home/',
'pb_files(*.pth)')
终于把这些摸清楚了,往下走,就是生成exe文件~~
但是!又出现了问题,显示成功生成,但是打不开啊打不开。并且在dist文件夹下还有一个文件夹,这个文件夹中包含了一个exe文件,这种是不对的,dist文件夹下应该直接就是exe文件了(打包命令为:pyinstaller -F -w 主文件.py)也不知道哪里出错了,为了快点整好,我就换了一个anaconda环境,没想到真的直接在dist下生成了exe,但是!报错了,好多错,也不知道是哪里出错了,就使用排除法排除是否有安装包出错。
先新建一个hello.py
输入:
from PyQt5 import QtGui, QtWidgets
print('Hello Python!')
将hello.py打包,看是不是这里有错,发现没错。
然后再写入:
import cv2
from PyQt5 import QtGui, QtWidgets
print('Hello Python!')
再将hello.py打包,出错!
错误1:
File "site-packages/pkg_resources/__init__.py", line 86, in
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[30130] Failed to execute script pyi_rth_pkgres
解决方法:降低setuptool的版本,降低方法自行百度~~
错误2:
File "site-packages/cv2/__init__.py", line 5, in
ImportError: numpy.core.multiarray failed to import
[32464] Failed to execute script hello
解决方法:降低numpy的版本,具体降低多少,大家试试吧,比你原先的降点试试~~
在这里,虽然顺利生成了exe,但在测试时,发现exe会闪退,说是有这个毛病:
AttributeError: 'list' object has no attribute 'seek'. You can only torch.load from a file that is seekable. Please pre-load the data into a buffer like io.BytesIO and try to load from it instead.
Aborted (core dumped)
但是,在加载权重文件进行下一步时,出现了闪退,为了解决这个问题,我还是重新加了路径:
在该文件夹下新建一个文件夹pth放置我的权重文件,然后在调用权重文件之前,加入如下命令:
if getattr(sys, 'frozen', False):
cur_path = sys._MEIPASS
else:
cur_path = os.path.dirname(__file__)
PATH_TO_FROZEN_PTH = os.path.join(cur_path, 'pth/039.pth') # ui.openpb()
然后生成exe。再修改生成的.spec文件,修改为:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
added_files = [('/home/1/GUI/mkgui/pth', 'pth')]
a = Analysis(['recog_vis.py'],
pathex=['/home/1/_GUI/mkgui'],
binaries=[],
datas=added_files,
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,
a.binaries,
a.zipfiles,
a.datas,
[],
name='recog_vis',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True )
最后使用pyinstaller -F -w **.spec 重新打包
至此,全部问题解决!感谢之前的博友的博客,看了好多,也不记得原先的链接,没法贴出来了,感谢大家!
——————————————————————我是分割线————————————————————————
如果不想这么麻烦,有一个很快捷的打包方法,就是用pyinstaller -D **.py
这样打包生成的话不是一个文件,而是很多依赖文件,
然后将所有的所需要的图片、py文件、权重文件等全放到dist文件夹下,即与可执行文件一个文件夹。
找到dist下相应的可执行文件,运行即可。