Scrapyd部署时无法在Scrapy的settings.py中读取环境变量
解决Scrapyd部署后settings.py无法读取环境变量的问题
错误根源
你遇到的OSError: Starting path not found是因为:
load_dotenv()默认会从当前目录向上查找.env文件,但Scrapyd部署时会把项目打包成egg包,上传到服务器后临时解压,你的.env文件没有被打包进egg,导致找不到文件;- 临时解压的目录结构也会让
find_dotenv的路径遍历逻辑失效。
下面是三种可行的解决方法:
方法一:直接在Scrapyd服务器设置系统环境变量
这是最简洁的方案,不需要依赖.env文件:
- 修改settings.py,移除dotenv相关代码:
# settings.py import os SENTRY_DSN = os.getenv("SENTRY_DSN") MONGO_URI = os.getenv("MONGO_URI")
- 在Scrapyd服务器配置环境变量:
- 如果用systemd管理Scrapyd服务,编辑Scrapyd的service文件(比如
/etc/systemd/system/scrapyd.service),在[Service]块中添加:
然后执行Environment="SENTRY_DSN=你的Sentry地址" Environment="MONGO_URI=你的MongoDB连接字符串"sudo systemctl daemon-reload && sudo systemctl restart scrapyd重启服务。 - 如果直接启动Scrapyd,在启动前先导出环境变量:
export SENTRY_DSN="你的Sentry地址" export MONGO_URI="你的MongoDB连接字符串" scrapyd
- 如果用systemd管理Scrapyd服务,编辑Scrapyd的service文件(比如
方法二:将.env文件打包进egg并指定加载路径
如果坚持使用.env文件,需要确保它被打包到egg中,并指定绝对路径加载:
- 修改settings.py,指定
.env的绝对路径:
# settings.py import os from dotenv import load_dotenv from pathlib import Path # 获取settings.py所在目录的绝对路径 PROJECT_DIR = Path(__file__).parent.resolve() # 加载当前目录下的.env文件 load_dotenv(PROJECT_DIR / ".env") SENTRY_DSN = os.getenv("SENTRY_DSN") MONGO_URI = os.getenv("MONGO_URI")
- 确保
.env被打包进egg:- 编辑
scrapy.cfg,在你的deploy配置块中添加include = .env:[deploy:你的部署目标名] url = http://你的Scrapyd服务器地址:6800/ project = jobFlow include = .env - 或者修改项目根目录的
setup.py,在package_data中添加.env:setup( # ... 其他配置 package_data={ 'jobFlow': ['.env'], }, )
- 编辑
- 重新部署项目:
scrapyd-deploy --include-dependencies
方法三:通过Scrapyd配置传递参数
利用Scrapyd的项目配置功能,直接在服务器端设置项目级别的参数:
- 修改Scrapyd的配置文件(比如
/etc/scrapyd/scrapyd.conf),添加你的项目配置:
[jobFlow] MONGO_URI = 你的MongoDB连接字符串 SENTRY_DSN = 你的Sentry地址
- 爬虫代码无需修改,依然用
self.settings.get("MONGO_URI")读取参数即可。
你也可以在启动爬虫时临时传递参数:curl http://你的Scrapyd服务器:6800/schedule.json \ -d project=jobFlow \ -d spider=你的爬虫名 \ -d setting=MONGO_URI=mongodb://xxx \ -d setting=SENTRY_DSN=https://xxx
内容的提问来源于stack exchange,提问作者Hesam Norin
相关产品推荐
相关产品推荐

