Pyinstaller 打包exe运行时找不到源码,函数 错误 OSError: could not get source code
今天用pyinstaller将Detectron2的一个文件打包成了exe,可是在程序运行过程中出现了下面错误
Traceback (most recent call last):File "torch\_sources.py", line 21, in get_source_lines_and_filesourcelines, file_lineno = inspect.getsourcelines(obj)File "inspect.py", line 956, in getsourcelinesFile "inspect.py", line 787, in findsource
OSError: could not get source codeThe above exception was the direct cause of the following exception:Traceback (most recent call last):File "cell_analyse.py", line 8, in <module>File "<frozen importlib._bootstrap>", line 983, in _find_and_loadFile "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 677, in _load_unlockedFile "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_moduleFile "detectron2\model_zoo\__init__.py", line 8, in <module>from .model_zoo import get, get_config_file, get_checkpoint_url, get_configFile "<frozen importlib._bootstrap>", line 983, in _find_and_loadFile "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 677, in _load_unlockedFile "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_moduleFile "detectron2\model_zoo\model_zoo.py", line 9, in <module>from detectron2.modeling import build_modelFile "<frozen importlib._bootstrap>", line 983, in _find_and_loadFile "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 677, in _load_unlockedFile "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_moduleFile "detectron2\modeling\__init__.py", line 2, in <module>from detectron2.layers import ShapeSpecFile "<frozen importlib._bootstrap>", line 983, in _find_and_loadFile "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 677, in _load_unlockedFile "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_moduleFile "detectron2\layers\__init__.py", line 2, in <module>from .batch_norm import FrozenBatchNorm2d, get_norm, NaiveSyncBatchNorm, CycleBatchNormListFile "<frozen importlib._bootstrap>", line 983, in _find_and_loadFile "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 677, in _load_unlockedFile "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_moduleFile "detectron2\layers\batch_norm.py", line 4, in <module>from fvcore.nn.distributed import differentiable_all_reduceFile "<frozen importlib._bootstrap>", line 983, in _find_and_loadFile "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 677, in _load_unlockedFile "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_moduleFile "fvcore\nn\__init__.py", line 4, in <module>File "<frozen importlib._bootstrap>", line 983, in _find_and_loadFile "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlockedFile "<frozen importlib._bootstrap>", line 677, in _load_unlockedFile "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_moduleFile "fvcore\nn\focal_loss.py", line 52, in <module>File "torch\jit\_script.py", line 1307, in scriptast = get_jit_def(obj, obj.__name__)File "torch\jit\frontend.py", line 233, in get_jit_defparsed_def = parse_def(fn)File "torch\_sources.py", line 95, in parse_defsourcelines, file_lineno, filename = get_source_lines_and_file(fn, ErrorReport.call_stack())File "torch\_sources.py", line 28, in get_source_lines_and_fileraise OSError(msg) from e
OSError: Can't get source for <function sigmoid_focal_loss at 0x000002038751F9D8>. TorchScript requires source access in order to carry out compilation, make sure original .py files are available.
[75064] Failed to execute script 'cell_analyse' due to unhandled exception!
这个错误是直接提示为sigmoid_focal_loss 这个函数的源代码没有找到,而添加源代码的程序是File “inspect.py”, line 787, in findsource,进一步追踪代码发现可以通过getfile这个函数可以找到程序具体要添加哪些模块,我在这个函数的代码里面添加了下面这行,打印出具体是哪个模块没有添加。
def getfile(object):"""Work out which source or compiled file an object was defined in."""if ismodule(object):if getattr(object, '__file__', None):return object.__file__raise TypeError('{!r} is a built-in module'.format(object))if isclass(object):if hasattr(object, '__module__'):object = sys.modules.get(object.__module__)if getattr(object, '__file__', None):return object.__file__raise TypeError('{!r} is a built-in class'.format(object))if ismethod(object):object = object.__func__if isfunction(object):object = object.__code__**print(object)** **#在这里添加这行代码,打印出到底是哪些源代码没有添加成功**if istraceback(object):object = object.tb_frameif isframe(object):object = object.f_codeif iscode(object):return object.co_filenameraise TypeError('module, class, method, function, traceback, frame, or ''code object was expected, got {}'.format(type(object).__name__))
个人感觉这个坑爹的错误是源代码加载有关的,Detectron2使用了inspect这个模块,加载源代码,导致Pyinstaller在分析文件依赖时,没有把相关的源代码添加进去。
添加好打印代码后,再次编译生成exe,重新运行,产生如下log
<code object norm at 0x0000020384365780, file "torch\functional.py", line 1309>
<code object sigmoid_focal_loss at 0x000002038750B390, file "fvcore\nn\focal_loss.py", line 7>
<code object sigmoid_focal_loss at 0x000002038750B390, file "fvcore\nn\focal_loss.py", line 7>
Traceback (most recent call last):File "torch\_sources.py", line 21, in get_source_lines_and_filesourcelines, file_lineno = inspect.getsourcelines(obj)File "inspect.py", line 956, in getsourcelinesFile "inspect.py", line 787, in findsource
OSError: could not get source code
由此可以看出来,是fvcore这个模块没有被添加到可行exe目录下。当我把源代码库下的fvcore拷贝到生成exe所在的目录后,再次运行,就不在报fvcore找不到错误了,可以报了其它模块源代码找不到错误,我以此拷贝过去,程序便可以顺利运行了。
当然正规的解决办法应该是通过修改.spec 文件,将需要依赖的文件在打包时自动添加到编译生成的文件里面,这一步,可以参考pyinstaller的官方解决方法
Pyinstaller 打包exe运行时找不到源码,函数 错误 OSError: could not get source code相关推荐
- springboot maven打包jar运行,springboot mybatis druid,demo源码
注:本文介绍的mysql版本是5.x ,如果mysql升级到8 有几个地方需要改动 https://blog.csdn.net/a704397849/article/details/108396563 ...
- python / 解决 pyinstaller 打包后运行时提示找不到模块的问题
在打包时候,并没有提示错误,可以顺利打包成 exe 文件.但是在运行打包好的软件时,会提示找不到模块,本人遇到的是找不到第三方模块,例如 requests .这时候需要在打包时指定 -p 参数,后面跟 ...
- Python笔记-解决pyinstaller打包后运行时动态加载模块报错(No module named)
出现的问题就是:No module named 原因是我代码里面使用了这个 importlib.import_module pyinstaller没有检测到. 百度上没有找到解决办法,在外wang找到 ...
- Pyinstaller 打包exe附带资源,运行时自动解压所需资源(图片文本音频等)
前言: 用Pyinstaller 打包exe时,有时候得附带上一些资源,才能让程序不那么单调. 在网上也有很多把依赖文件打包进exe的方法,不过都只能打包一些图片或者文本而已. 还有一个就是通过修改P ...
- pyinstaller打包exe(32位和64位)和运行太慢等问题解决
pyinstaller打包exe(32位和64位)和运行太慢等问题解决 文章目录 pyinstaller打包exe(32位和64位)和运行太慢等问题解决 前言 一.pyinstaller的安装 二.p ...
- python pyinstaller 打包exe文件,(附带图片 + 自己、别人电脑上均可以运行)
python pyinstaller 打包exe文件,(附带图片 + 自己.别人电脑上均可以运行) 科目:windows + python pyinstaller 打包exe 内容:打包程序.图片.视 ...
- matlab找不到exe文件,如何修复pyinstaller在从scrip创建exe文件时找不到matlab文件的问题...
我正试图从我的python脚本中生成一个EXE,以便在没有安装python的机器上使用GUI.目前,我的文件可以很好地调用matlab脚本并发送JSON对象.我的问题是当我试图从python脚本生成一 ...
- python打包exe黑框一闪而过,解决pyinstaller打包exe文件出现命令窗口一闪而过的问题...
用pyinstaller打包的exe文件打开时,命令窗口一闪而过,并且未出现GUI界面,也看不到错误信息,然后去网上搜相关的信息,最多的两种说法: 1.添加raw_input()或者os.system ...
- 解决pyinstaller打包exe文件过大(菜鸟一刀切傻办法)
pyinstaller打包exe文件过大 作为认真学习了Python两个多月的小白,觉得python还是有很多玄学,一直搞不懂明明一毛一样的步骤,为什么我用pyinstaller打包出来的exe有30 ...
- Pyinstaller 打包exe 报错 failed to execute script XXX的一种解决方案
最近用PyQt5写了一个界面小程序,需要打包成exe给到其他windows上使用,一开始使用python 3.7 64位,用pyinstaller打包exe,在64位机上运行正常. 但是目标电脑是32 ...
最新文章
- Eclipse 中maven插件坏死解决办法
- 2022-01-24
- 【黑马程序员 C++教程从0到1入门编程】【笔记6】C++核心编程(文件操作)
- Access常用类型及查询语法 [Access]
- IP地址开启https
- C++/mfc错误总结
- python源码保护之cython
- 编程开发之--java多线程学习总结(4)
- 夏普mx2608n网络扫描到计算机,【转载】夏普复印机网络扫描教程
- 前端请求路径为何不能写成http://localhost:8080/**/** ?
- 600、000、002、200、300、400等开头的股票代表什么?
- python 统计英语文档词汇出现频率,以六级真题为例
- VS2010如何安装MSComm控件
- HD2500显卡驱动linux,Intel HD Graphics 2500/4000驱动免费版
- 无人机基于目标检测的路径规划任务
- 利用Jenkins+蒲公英平台显示二维码 部署Android打包踩过的坑
- From little Cutie to Rockin Beauty(about Hilary Duff and someone concerned.)
- 【电巢】什么是EMC测试?EMC测试又是如何分类的?
- BSGS与扩展BSGS
- java gb18030 转 utf-8_gb18030与utf-8