【发布时间】:2020-09-09 07:35:02
【问题描述】:
我们在 ubuntu 18.04 上的 python 3.6 中运行 scrapy 2.1.0 和 scrapyd,我遇到了一个问题,我需要帮助了解如何以正确的方式解决。我是 python 新手(来自其他语言),所以请慢慢大声说话,以便我理解 =)
问题是作业可能会在 scrapyd 计划中被卡在“待处理”状态。使用systemctl status scrapyd.service 读取最新日志消息时,会显示弃用警告。
usr/local/lib/python3.6/dist-packages/scrapy/utils/project.py:94:ScrapyDeprecationWarning:不推荐使用以 SCRAPY_ 为前缀的环境变量来覆盖设置。当前定义了以下环境变量:JOB、LOG_FILE、SLOT、SPIDER
阅读this issue 后,我了解问题的本质,我的猜测是(请在此处纠正我)scrapyd 在运行时定义这些环境变量,这会触发scrapy 中的警告,然后阻止scrapyd 继续。
我可以在 scrapy 项目 settings.py 中定义 LOG_FILE,但其他三个感觉非常特定于 scrapyd 运行时/调度,并且不是 scrapy 项目设置文件的一部分。
我似乎可行的丑陋解决方法是将这些变量添加到第 80 行 /scrapy/utils/project.py 的列表中。
scrapy_envvars = {k[7:]: v for k, v in os.environ.items() if
k.startswith('SCRAPY_')}
valid_envvars = {
'CHECK',
'PICKLED_SETTINGS_TO_OVERRIDE',
'PROJECT',
'PYTHON_SHELL',
'SETTINGS_MODULE',
'JOB', # <<--- here...
'LOG_FILE', # <<--- here...
'SLOT', # <<--- here...
'SPIDER', # <<--- and here
}
setting_envvars = {k for k in scrapy_envvars if k not in valid_envvars}
if setting_envvars:
setting_envvar_list = ', '.join(sorted(setting_envvars))
warnings.warn(
'Use of environment variables prefixed with SCRAPY_ to override '
'settings is deprecated. The following environment variables are '
'currently defined: {}'.format(setting_envvar_list),
ScrapyDeprecationWarning
)
这使得弃用警告消失,scrapyd schedule 可以将作业从挂起移动到运行然后完成。
显然这是一个非常糟糕的主意,因为我正在更改 lib/module/package(或任何正确术语)中的代码,并且这将被包管理器的任何更新覆盖。
所以我的问题是,假设我已经正确理解了问题的根源,那么在不更改 scrapy 核心内部代码的情况下解决此问题的正确方法是什么?
提前感谢您的意见!
【问题讨论】: