【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题

由于课程设计需要,搞了一个retinanet,现在从ubuntu移植到windows打包成exe方便老师检查,但是遇到了could not get source code,没想到在这里卡了好几天时间,现在解决了,写下来解决过程供有需要的同学参考。

错误信息提示如下:

(ps:如果错误信息长得不一样,那还是悠着点按我这个方法解决吧)

  File "site-packages\torchvision\ops\misc.py", line 135, in <module>
      File "site-packages\torchvision\ops\misc.py", line 148, in FrozenBatchNorm2d
      File "site-packages\torch\jit\__init__.py", line 850, in script_method
      File "site-packages\torch\jit\frontend.py", line 152, in get_jit_def
      File "inspect.py", line 973, in getsource
      File "inspect.py", line 955, in getsourcelines
      File "inspect.py", line 786, in findsource
      OSError: could not get source code

当前环境版本:

pytoch 1.2.0

cuda 9.2

torchvision 0.4.0

遇到这个问题,不少人说了一个解决方案,就是降级torchvision版本 使用如下命令:

pip uninstall torchvision 

pip install torchvision==0.2.2.post3

降级完后,继续打包,再次运行时,可能出现两个错误,一个是torchvision.ops错误,找不到这个模块,第二个是可能还会出现相同的OSError: could not get source code错误。

一个一个来,首先是torchvision.ops错误,这里具体错误原因是torchvision版本降低,低版本没有这个ops,因为在代码里面,用到ops相关的只有nms函数,本来是应该重新写一个nms来解决这个问题,写好了就不用这个模块了,当然也就不会出错了。

这种方法应该可行,但花费时间比较多,也比较麻烦,还有另外一种方法就是直接复制相关库。

anaconda新建一个环境,安装好torchvision0.4.0的版本,找到torchvision在anaconda的env中所在的位置,具体路径可以参考下图,将新环境的相关内容复制到torchvision是0.2.2的环境里去。如下图

【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题_第1张图片
反正复制嘛,直接在pycharm里,在旧环境的torchvision下跑一遍程序看看缺什么,然后复制什么,搞一会就搞完了,这里需要注意的init那个py文件,需要更改它的内容,直接复制替换应该也可以,我没试过,懒得试了

【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题_第2张图片

第二个问题解决方法如下:

进入如下路径

anaconda安装路径\annaconda\envs\你的环境名字\Lib\site-packages\torch\jit

我的是E:\E_program_special\annaconda\envs\testt\Lib\site-packages\torch\jit

找到里面的 frontend.py 文件 打开

找到 get_jit_def() 这个函数 ,大概在150行-156行左右 ,将其第一行改为 ,改之前记得备份一下 免得有问题改不回去了

sourcelines, file_lineno = dill.source.getsourcelines(fn) 

如下图:

【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题_第3张图片

同时需要在最上面import这个dill模块

import __future__
import torch
import sys
import ast
import inspect
import string
from textwrap import dedent
from torch._six import PY2
from torch._C._jit_tree_views import *
import dill ##要导入这个模块!!

为什么要把inspect换成dill?

具体原因可以看

https://stackoverflow.com/questions/57035364/inspect-getsourcelinesobject-shows-oserror-if-run-from-python-shell-but-gives

关于dill相关内容可以看

http://blog.lujun9972.win/blog/2018/05/18/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96python%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%BA%90%E4%BB%A3%E7%A0%81/index.html

这个时候需要到终端把dill安装到环境中,我是直接在pycharm里打开终端,需要注意的是dill是安装到旧环境中,不是新环境,因为最终还是要将就torchvision的版本,要是低版本才行。

使用如下命令

pip install dill==0.2.7.1

如下图,我是已经安装了。

在这里插入图片描述

这个时候可以打包看看了,不出意外还会出现新的错误。

错误提示为:

ModuleNotFoundError: No module named 'scipy.special.cython_special'

这个的原因是scipy版本太高,降级就可以了

pip uninstall scipy

pip install scipy==1.4.1

为什么选这个1.4.1版本,打开 anaconda navigator,里面搜索scipy找到的 ,就尝试用这个版本,我也是试出来的,具体原因不知。。。

【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题_第4张图片

【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题_第5张图片

这个时候应该就能打包然后正常运行起来了,就是有文件读取的话,要注意路径,具体可以看这篇博客

https://blog.csdn.net/vample/article/details/86476822

需要注意的是有时候会提示没有dill这个模块,这种情况就把dist和build两个文件夹还有spec文件全删了,重新打包就可以了

pyinstaller -D XXX.py

我遇到的问题到这里就基本上解决了

运行成功画面:

【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题_第6张图片
【已解决】OSError: could not get source code的问题 ,windows下使用pyinstaller打包遇到此问题_第7张图片

你可能感兴趣的:(pytorch,深度学习,机器学习)