'ImportError:冒烟测试中没有名为<project_name> .settings'的模块

时间:2017-06-28 13:58:08

标签: scrapy

  1. scrapy crawl <spider_name>在我的项目中运作良好。

  2. 在冒烟测试中,我抓取私人页面并断言项目符合预期。

  3. 在我完成一个严肃的项目重构之前情况一切正常,因为烟雾测试最终设置了setUp()的env变量,这实际上设置了os.environ['SCRAPY_SETTINGS_MODULE'] = '<project_name>.settings'

  4. 设置此env var后,scrapy crawl会抱怨'ImportError: No module named <project_name>.settings'

  5. scrapy.cfg设置正确,除此烟雾测试外的其他所有设置都可以。

  6. 问题在os.environ.pop('SCRAPY_SETTINGS_MODULE')之前仅由os.sys('scrapy crawl <spider_name>')消失,但这感觉不对。

  7. 所以,请有人告诉我,问题是什么原因造成问题,解决问题的方法是什么,谢谢!

1 个答案:

答案 0 :(得分:1)

我找到了原因:

scrapy crawl scrapy执行scrapy.utils.project.get_project_settings之前,如果未设置scrapy.utils.conf.init_env则调用os.environ['SCRAPY_SETTINGS_MODULE'],其中项目主目录添加到sys.path

通过设置此env var,sys.path scrapy获取的副本没有项目主目录的路径,因此导入失败。

弹出os.environ['SCRAPY_SETTINGS_MODULE']会导致init_env被调用,因此scrapy crawl可以正常工作。另一种解决方法是将os.environ['PYTHONPATH']设置为项目主目录路径,这是scrapy稍后查找路径的地方。

我最终采用的方法是修改scrapy,禁用os.environ['SCRAPY_SETTINGS_MODULE']检查,并始终执行init_env。最糟糕的代价就是每次执行scrapy crawl时,scrapy都会查找项目主目录路径一次,这对我来说似乎不太重要。并且路径不会多次添加到sys.path,因为在追加之前会对其进行检查。

关于它,如果我在某个地方弄错了,请告诉我,谢谢!