You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署到Scrapyd的Scrapy爬虫如何读取环境变量?

解决方案:在Scrapyd环境中正确加载.env文件

问题出在load_dotenv()默认会在当前工作目录查找.env文件,但Scrapyd运行时的工作目录并非你的项目代码所在目录(而是Scrapyd的系统工作目录,比如容器内的/var/lib/scrapyd),所以无法找到打包在egg里的.env文件。

你需要通过包资源路径明确指定.env的位置,而不是依赖默认的相对路径。以下是两种可行的修改方式:

方法1:使用Python 3.9+的importlib.resources

修改settings.py中的加载逻辑:

import os
from dotenv import load_dotenv
from importlib.resources import files

# 获取包内.env文件的绝对路径
env_file_path = files('testproject').joinpath('.env')
# 加载指定路径的.env文件
load_dotenv(dotenv_path=env_file_path)

print(
    f"Google Cred? {os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')}"
    f" Proxy? {os.environ.get('HTTP_PROXY')}"
)

方法2:使用pkg_resources(兼容Python 3.8及以下)

如果你的环境使用较旧的Python版本,改用pkg_resources:

import os
from dotenv import load_dotenv
import pkg_resources

# 获取包内.env文件的绝对路径
env_file_path = pkg_resources.resource_filename('testproject', '.env')
load_dotenv(dotenv_path=env_file_path)

print(
    f"Google Cred? {os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')}"
    f" Proxy? {os.environ.get('HTTP_PROXY')}"
)

关键说明

  • 确保MANIFEST.in中已经正确包含.env文件,你的配置已经满足:
    include testproject/.env
    
  • 这两种方式都会直接定位到打包在egg包内的.env文件,不受Scrapyd运行时工作目录的影响,能保证本地和部署环境一致。

内容的提问来源于stack exchange,提问作者Justcurious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:33