使用scrapy的日志有一大半的报错都是下面这个,错误原因很简单,记录一下找错的过程

Traceback (most recent call last):File "/opt/miniconda/envs/app/lib/python3.8/site-packages/scrapy/utils/defer.py", line 55, in mustbe_deferredresult = f(*args, **kw)File "/opt/miniconda/envs/app/lib/python3.8/site-packages/scrapy/core/spidermw.py", line 52, in _process_spider_inputreturn scrape_func(response, request, spider)File "/opt/miniconda/envs/app/lib/python3.8/site-packages/scrapy/core/scraper.py", line 149, in call_spiderwarn_on_generator_with_return_value(spider, callback)File "/opt/miniconda/envs/app/lib/python3.8/site-packages/scrapy/utils/misc.py", line 246, in warn_on_generator_with_return_valueif is_generator_with_return_value(callable):File "/opt/miniconda/envs/app/lib/python3.8/site-packages/scrapy/utils/misc.py", line 229, in is_generator_with_return_valuecode = re.sub(r"^[\t ]+", "", inspect.getsource(callable))File "/opt/miniconda/envs/app/lib/python3.8/inspect.py", line 985, in getsourcelines, lnum = getsourcelines(object)File "/opt/miniconda/envs/app/lib/python3.8/inspect.py", line 967, in getsourcelineslines, lnum = findsource(object)File "/opt/miniconda/envs/app/lib/python3.8/inspect.py", line 798, in findsourceraise OSError('could not get source code')
OSError: could not get source code

看到报错很多人第一时间肯定是复制OSError: could not get source code到百度搜一下,搜出来的文章基本都是pyinstaller打包scrapy出现了这个错误,解决方法如下:

在spider代码里加上

import scrapy.utils.misc
import scrapy.core.scraperdef warn_on_generator_with_return_value_stub(spider, callable):passscrapy.utils.misc.warn_on_generator_with_return_value = warn_on_generator_with_return_value_stub
scrapy.core.scraper.warn_on_generator_with_return_value = warn_on_generator_with_return_value_stub

但是我并没有使用pyinstaller,而且是在centos运行的scrapy,只能自己跟堆栈信息了。报错的调用栈也出现了warn_on_generator_with_return_value这个函数,所以我们从这个函数追一下他的使用,用vscode打开scrapy的源码(一般在python安装目录的Lib\site-packages\scrapy下)全局搜索一下warn_on_generator_with_return_value在哪个函数里被调用的

第二个文件misc.py里是定义函数的,暂时先不看,直接定位到scraper.py的地方

经过print调试发现,这个函数其实就是scrapy给Request添加回调函数用的,result就是个Response对象,而warn_on_generator_with_return_value是用来检查回调函数中是否包含错误的return

is_generator_with_return_value这个函数先不看,翻译一下下面警告的日志信息,大概意思是:
生成器函数不能return一个值,只能return None,因为这可能产生一些异常错误,详细请查看官网关于return关键字的解释: https://docs.python.org/3/reference/simple_stmts.html#the-return-statement

也就是说warn_on_generator_with_return_value这个函数只是用来检查你有没有在使用yield的同时,return了一个有效的值。所以这个函数在实际的运行中并没什么意义,只要你的代码按照规范来,就不用理它。上面的解决方法也是把它置空,让它不运行。

到这里还是没有解释为什么会抛出异常?继续看堆栈的错误信息,报错的实际代码是inspect.getsource(callable)这个函数,那么getsource在什么情况下会抛出OSError: could not get source code? 找不到文件或者没有权限操作这个文件,当然还有一种可能是Ulimit超过了限制,无法再打开文件,这个应该会伴随一个OSError: [Errno 24] Too many open files:的错误,关于这个问题解决方法请看:https://www.jianshu.com/p/47336fcd22da。在开启线程比较多的时候会遇到。

翻到日志报错的最开始那条,看到了 爬虫运行完成这条日志,恍然大悟。因为我在spider运行完成之后写了删除spider文件的逻辑,这就导致了还在运行的爬虫找不到自己的代码了

用多进程启动的scrapy,明明用了join等待,为什么直接就结束了,也是无语,又是一个新的坑。

OSError: could not get source code相关推荐

  1. Pyinstaller 打包 torch 后执行失败 OSError: could not get source code

    1. 问题现象 系统环境 Python 3.6.9 torch 1.2.0 torchvision 0.4.0 Pyinstaller 4.5.1 Pyinstaller 打包 torch 后执行失败 ...

  2. pyinstaller打包torch出现OSError: could not get source code、pkg_resources.DistributionNotFound

    记下主要怕以后自己忘记 首先打包先建一个虚拟环境,就装上打包的python需要的包,这样打包起来错误可能会少点,而且速度也会快些,大小也可能小些,如何创建可以参考我的另一篇博客https://blog ...

  3. pyinstaller OSError: could not get source code

    pyinstaller打包pytorch框架分类模型报错, 报错:pyinstaller OSError: could not get source code 解决思路:网上大部分资料都是降低torc ...

  4. Understanding The React Source Code

    Understanding The React Source Code - Initial Rendering (Simple Component) I UI updating, in its ess ...

  5. DevExpress Components16.2.6 Source Code 编译

    DevExpress 是一个比较有名的界面控件套件,提供了一系列优秀的界面控件.这篇文章将展示如何在拥有源代码的情况下,对 DevExpress 的程序集进行重新编译. 特别提示:重编译后,已安装好的 ...

  6. 转: Source Code Lookup in Eclipse(主要讲的是java的)

    Source Code Lookup in Eclipse https://www.intertech.com/Blog/source-code-lookup-in-eclipse/

  7. python3 pycharm 远程调试 启动报错 ValueError: source code string cannot contain null bytes

    现象: 启动远程调试时,报错 Traceback (most recent call last):File "/root/.pycharm_helpers/pydev/pydevd.py&q ...

  8. 退役笔记一#MySQL = lambda sql : sql + #39; Source Code 4 Explain Plan #39;

    Mysql 查询运行过程 大致分为4个阶段吧: 语法分析(sql_parse.cc<词法分析, 语法分析, 语义检查 >) >>sql_resolver.cc # JOIN.p ...

  9. Source Code Collection for Reproducible Research

    Source Code Collection for Reproducible Research [ http://www.csee.wvu.edu/~xinl/source.html] " ...

  10. Google Chrome Source Code 源码下载

    2019独角兽企业重金招聘Python工程师标准>>> Goolgle 于 2008.09.02 发布了浏览器 Google Chrome.Google Chrome 使用的内核源码 ...

最新文章

  1. Redis 概念以及底层数据结构
  2. linux各种小程序源码,Linux中的小程序—— 进度条
  3. Opencv中三种操作像素的方法
  4. 循环划线_经济内外双循环下的思考!
  5. JxBrowser概述与简单应用
  6. 邻居子系统:地址解析协议
  7. HDU2189 来生一起走【完全背包】
  8. node.js 之爬虫
  9. python怎么读写文件-手机上怎么写pythonPython文件读写详解及设置文件的字符编码...
  10. 解决清除浮动的最佳办法
  11. 《Android MVPArms 使用butterknife遇到的坑》
  12. java程序员 英文简历_Java程序员英文简历
  13. 卸载华为系统wifi服务器,如何安装随行WiFi驱动及如何卸载驱动
  14. 驱动数字签名 WIN7 WIN10 32位/64位
  15. 说说react-custom-scrollbars插件在react hooks版本中的使用
  16. Representation Learning with Contrastive Predictive Coding 论文阅读
  17. android 摄像头 ip,摄像头已连接,但没有发生任何事情,openCV-IP摄像头Android
  18. Android项目---快递查询
  19. 计算机英语重点,计算机英语复习重点.doc
  20. “宇宙时钟”脉冲星太空定位精度达5公里

热门文章

  1. 新浪微博平台的多级架构
  2. 如何从列联表获得对应分析的结果
  3. linux wine 原理,wine的工作原理与自动运行PE程序
  4. Python组合数据类型
  5. 互联网日报 | 5月6日 星期四 | 阿里巴巴旗下“天猫香港”上线试营业;蔚来汽车将进军海外市场;五一档票房超16亿创新高...
  6. 阿里的《基于pai的推荐系统》--摘抄笔记
  7. 手把手交给大家怎样破解压缩包密码的方法
  8. android调起浏览器设置头部,Android开发:调起手机浏览器
  9. python语音合成并播放_用Python写一个语音播放软件
  10. LSI Logic 1068 SAS 磁盘阵列卡配置教程