使用pyinstaller 发布py文件为exe。遇到的问题总结(tensorflow,gpu)

1,ModuleNotFoundError:No module named 'tensorflow.python._pywrap_tensorflow_internal.pyd'

参考:https://stackoverflow.com/questions/49620638/tensorflow-gpu-with-pyinstaller

修改dist下文件名:_pywrap_tensorflow_internal.pyd为tensorflow.python._pywrap_tensorflow_internal.pyd

(执行pyinstaller命令去掉 -F)若是生成一个文件

请参考:https://stackoverflow.com/questions/49732801/windows-10-pyinstaller-tensorflow-missing-modules/50580345

 

2,AttributeError: type object 'pandas._libs.tslibs.conversion._TSObject' has no attribute '__reduce_cython__'

参考:https://blog.csdn.net/Roanlys/article/details/80951185

参考:https://blog.csdn.net/qq_41185868/article/details/80601983

我的python 3.6.6  执行pip install pandas==0.20.0

上面是我遇到的问题。

 

3 utf-8错误

chcp 65001

 

完整命令:

在cpu版本下运行

代码加入

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"  
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

我的cuda 64 9.0

pyinstaller -F -c XXX_cpu.py --add-data tensorflow.python._pywrap_tensorflow_internal.pyd;. --add-data cudart64_90.dll;.

 

Windows安装pycocotools出现错误“cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp””的解决办法:

https://github.com/philferriere/cocoapi

 

 

参考:https://www.jianshu.com/p/b0e3a74ca97b

2.打包错误:ModuleNotFoundError: No module named 'setuptools._vendor'

更新 setuptools

 

pip install --upgrade setuptools

3.打包错误:AttributeError: module 'enum' has no attribute 'IntFlag'

卸载enum34包

 

pip uninstall enum34

4.运行错误:ImportError:No Module Nameed "pywt._extensions._cwt"

注意,以上的pywt._extensions._cwt可能是其他库

解决办法:

 

pyinstaller -F aaa.py --hidden-import pywt._extensions._cwt 

如果有多个库那就在在后面在加几个--hidden-import xxxx

5.运行错误:ModuleNotFoundError: No module named 'tensorflow.python._pywrap_tensorflow_internal'

使用tensorflow1.7以上版本会有这个问题

解决方法:

假如是文件夹生成模式生成的,比较简单,在生成的dist/[exe_name]/文件夹中,找到“_pywrap_tensorflow_internal.pyd”文件,剪切,在这个文件夹中新建一个tensorflow文件夹,并在tensorflow文件夹中新建一个python文件夹,将刚刚剪切的pyd文件黏贴到python文件夹中,再次运行exe,问题解决。

假如是单文件exe模式,可用以下方法,首先在python库文件夹中找到_pywrap_tensorflow_internal.pyd(懒得找就用文件夹模式生成一次,在exe所在的文件夹中就有),然后使用以下命令生成。

 

pyinstaller -F aaa.py --add-data="/path/to/the/pyd/_pywrap_tensorflow_internal.pyd;tensorflow/pyth

参考:
[1] https://blog.csdn.net/qq_39360343/article/details/82772916 setuptools问题
[2] https://blog.csdn.net/qq_15969343/article/details/84872743 enum问题
[3] https://blog.csdn.net/qq_40587575/article/details/86500445 pywt问题
[4] https://stackoverflow.com/questions/49620638/tensorflow-gpu-with-pyinstaller "_pywrap_tensorflow_internal"问题
[5] https://stackoverflow.com/questions/49732801/windows-10-pyinstaller-tensorflow-missing-modules?r=SearchResults 单文件"_pywrap_tensorflow_internal"问题

 

 

参考:https://blog.csdn.net/qq_20906467/article/details/108627021?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242

1.RecursionError: maximum recursion depth exceeded

解决步骤:

1)pyinstaller -F xxx.py

​ 这一步肯定会报上述错误导致失败,但是会产生一个xxx.spec文件

2)在xxx.spec文件中增加两行(添加在原文件第二行):

import sys
sys.setrecursionlimit(5000)
  • 1
  • 2

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

位置在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

不过记得添加在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'],
  • 1
  • 2
  • 3
  • 4

这里我的site_packages在"F:\Anaconda3\Lib\site-packages",即自己电脑anaconda里的拓展库位置。

其实这不可能也不行,但是这时候我正好注意到了pyinstaller xxx.spec时所报的信息:

image-20200916172325903

注意到那一堆warning没,这张图是没问题的图,这些warning暂时没发现有啥影响,但在之前还有其他warning的,是torch和torchvision报的,也是缺少dll,不过这些dll在电脑上其实都有,只是pyinstaller太蠢了,找不到,都在"site-packages"里,把他们一个个找到复制到要打包文件目录就行了,我这里需要的文件如下图:

image-20200916172719088

这些dll都是我一个个搜索,然后复制过来的,每个人的torch和torchvision版本都可能不一样,大家各找各的就行了。

顺带一提,我的环境是:

cuda = 10.0
torch = 1.1.0
torchvision = 0.3.0
  • 1
  • 2
  • 3

这样应该就么得问题了,我看见有人OpenCV打包也遇到类似问题,我这里也收集一下解决方法:

首先也是把opencv_videoio_ffmpeg430_64.dll复制到主文件夹下,这个也是每个人的版本都不一样的,然后在主代码里加上一段:

import ctypes

try:
    temp = ctypes.windll.LoadLibrary('opencv_videoio_ffmpeg430_64.dll')

except:
    pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

应该就好了。

是不是以为完了????????

我还遇见其他问题了,,,,

因为我需要用到mmcv这个库,但它只要一打包就绝对出问题,,,

image-20200916173610493

顺藤摸瓜,File “setuptools\depends.py”, line 6, 在这里,我们进去看看:

image-20200916173717746

长得不咋地,,,挺能折腾我。

是因为绝对路径问题吧,好像pyinstaller可以冻结路径,懒得搞了,改成这样子就行了,不过事后记得改回来,不然在自己电脑上以后可能会报错!!!!

from py33compat import Bytecode
from py27compat import find_module, PY_COMPILED, PY_FROZEN, PY_SOURCE
import py27compat
  • 1
  • 2
  • 3

到这里就告一段落了,如果有类似问题可以给我留言,万一我那天想起这个账号了随手登录看见了可以一起讨论下!

 


--------------------- 
作者:dreamflywhere 
来源:CSDN 
原文:https://blog.csdn.net/dreamFlyWhere/article/details/82463902?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值