scrapy crawl <spider_name>
在我的项目中运作良好。
在冒烟测试中,我抓取私人页面并断言项目符合预期。
在我完成一个严肃的项目重构之前情况一切正常,因为烟雾测试最终设置了setUp()
的env变量,这实际上设置了os.environ['SCRAPY_SETTINGS_MODULE'] = '<project_name>.settings'
设置此env var后,scrapy crawl
会抱怨'ImportError: No module named <project_name>.settings'
scrapy.cfg
设置正确,除此烟雾测试外的其他所有设置都可以。
问题在os.environ.pop('SCRAPY_SETTINGS_MODULE')
之前仅由os.sys('scrapy crawl <spider_name>')
消失,但这感觉不对。
所以,请有人告诉我,问题是什么原因造成问题,解决问题的方法是什么,谢谢!
答案 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
,因为在追加之前会对其进行检查。
关于它,如果我在某个地方弄错了,请告诉我,谢谢!