部署到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
相关产品推荐
相关产品推荐

