pyinstaller遇到的问题总结
1.RecursionError: maximum recursion depth exceeded
解决步骤:
1)pyinstaller -F xxx.py
这一步肯定会报上述错误导致失败,但是会产生一个xxx.spec文件
2)在xxx.spec文件中增加两行(添加在原文件第二行):
import sys
sys.setrecursionlimit(5000)
3)pyinstaller xxx.spec
打包成功。
2.UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position
解决方法:在你打包的命令行中先输入chcp 65001
然后再输入打包命令。
3.WARNING: file already exists but should not: C:\…\…\…\Local\Temp_MEI58962\include\pyconfig.h
报错内容可能不同,但都是xxx已存在,问题的原因是pyinstaller打包时pyconfig.h多打了一次,所以会报已经存在了。这个解决方案就是把多余的pyconfig.h去掉。具体解决方法如下:
在自动生成的xxx.spec中,添加如下代码,去掉多余依赖项:
#add_begin
for d in a.datas:
if 'pyconfig' in d[0]:
a.datas.remove(d)
break
#add_end
位置在a后面,pyz前面。
4.WARNING: file already exists but should not: C:\…\…\…\Local\Temp_MEI165842\torchvision_C.cp37-win_amd64.pyd
这个试了挺多办法,还未解决,有解决了的大哥麻烦告知一下,感激不尽!!!
5.最麻烦的,torch和torchvision打包问题,exe在自己电脑上能用,在其他电脑上就报错如下:
其实主要问题是pyinstaller不支持torchvision在0.3.0以上的版本。但是,要给torchvision降级什么的·····不多说了,懂的都懂!!!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rT1z876E-1600249368225)(https://user-images.githubusercontent.com/34004152/74804720-5e0c1680-5324-11ea-8974-ce18e0692b42.png)]
所以,真解决方案:在GitHub上找到了大佬的解决方法:
这里详细说一下:在主文件,也就是你要打包的文件头部添加
def script_method(fn, _rcb=None):
return fn
def script(obj, optimize=True, _frames_up=0, _rcb=None):
return obj
import torch.jit
torch.jit.script_method = script_method
torch.jit.script = script
不过记得添加在import torch后面,否则会报错。
有的可能在这一步就好了,但是,可能会发现打包出来的exe文件没有变大,因为torch和torchvision之类的库并没有打包进exe,于是在其他电脑上运行依然报错。这里就要修改spec文件了,在a = Analysis里修改path和hiddenimports:
datas=[(path.join(site_packages,"torch"), "torch"),
(path.join(site_packages,"torchvision"), "torchvision"),
(path.join(site_packages,"cv2"), "cv2")],
hiddenimports=['torch', 'torchvision', 'cv2'],
这里我的site_packages在"F:\Anaconda3\Lib\site-packages",即自己电脑anaconda里的拓展库位置。
其实这不可能也不行,但是这时候我正好注意到了pyinstaller xxx.spec时所报的信息:
注意到那一堆warning没,这张图是没问题的图,这些warning暂时没发现有啥影响,但在之前还有其他warning的,是torch和torchvision报的,也是缺少dll,不过这些dll在电脑上其实都有,只是pyinstaller太蠢了,找不到,都在"site-packages"里,把他们一个个找到复制到要打包文件目录就行了,我这里需要的文件如下图:
这些dll都是我一个个搜索,然后复制过来的,每个人的torch和torchvision版本都可能不一样,大家各找各的就行了。
顺带一提,我的环境是:
cuda = 10.0
torch = 1.1.0
torchvision = 0.3.0
这样应该就么得问题了,我看见有人OpenCV打包也遇到类似问题,我这里也收集一下解决方法:
首先也是把opencv_videoio_ffmpeg430_64.dll复制到主文件夹下,这个也是每个人的版本都不一样的,然后在主代码里加上一段:
import ctypes
try:
temp = ctypes.windll.LoadLibrary('opencv_videoio_ffmpeg430_64.dll')
except:
pass
应该就好了。
是不是以为完了????????
我还遇见其他问题了,,,,
因为我需要用到mmcv这个库,但它只要一打包就绝对出问题,,,
顺藤摸瓜,File “setuptools\depends.py”, line 6, 在这里,我们进去看看:
长得不咋地,,,挺能折腾我。
是因为绝对路径问题吧,好像pyinstaller可以冻结路径,懒得搞了,改成这样子就行了,不过事后记得改回来,不然在自己电脑上以后可能会报错!!!!
from py33compat import Bytecode
from py27compat import find_module, PY_COMPILED, PY_FROZEN, PY_SOURCE
import py27compat
到这里就告一段落了,如果有类似问题可以给我留言,万一我那天想起这个账号了随手登录看见了可以一起讨论下!