由于课程设计需要,搞了一个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的环境里去。如下图
反正复制嘛,直接在pycharm里,在旧环境的torchvision下跑一遍程序看看缺什么,然后复制什么,搞一会就搞完了,这里需要注意的init那个py文件,需要更改它的内容,直接复制替换应该也可以,我没试过,懒得试了
第二个问题解决方法如下:
进入如下路径
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)
如下图:
同时需要在最上面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找到的 ,就尝试用这个版本,我也是试出来的,具体原因不知。。。
这个时候应该就能打包然后正常运行起来了,就是有文件读取的话,要注意路径,具体可以看这篇博客
https://blog.csdn.net/vample/article/details/86476822
需要注意的是有时候会提示没有dill这个模块,这种情况就把dist和build两个文件夹还有spec文件全删了,重新打包就可以了
pyinstaller -D XXX.py
我遇到的问题到这里就基本上解决了
运行成功画面: