venv与pyenv环境下命令行运行Python脚本报KeyError求助
故障根因
KeyError: 'starling_config'报错与pyenv、虚拟环境解释器本身无关,核心原因是cron执行任务时默认工作目录为当前用户的家目录,脚本中使用相对路径config.read('config.conf')读取配置时,实际查找的是家目录下的config.conf而非脚本同目录的配置文件,读取失败后config对象不存在starling_config配置段,最终抛出键错误。
报错信息中出现miniforge路径下的configparser,是因为你之前未激活虚拟环境测试时调用到了miniforge版本的python,和你指定venv解释器执行的场景无关。
修复方案
- 替换脚本中相对路径读取配置的逻辑,改用基于脚本绝对位置的路径解析,从根源避免工作目录变化导致的文件找不到问题。在原有导入代码中新增
os模块导入,将配置读取部分修改为:
import os import requests import configparser import gspread from oauth2client.service_account import ServiceAccountCredentials # Config data for Starling config = configparser.ConfigParser() # 基于脚本自身所在目录拼接配置文件绝对路径 script_dir = os.path.dirname(os.path.abspath(__file__)) config.read(os.path.join(script_dir, 'config.conf')) account_id = config['starling_config']['account_id']
- 本地验证修复效果:不要切换到项目目录,直接在任意路径下执行你之前的测试命令,确认脚本可以正常运行:
/Users/aaron/project/venv/bin/python /Users/aaron/project/extract_starling.py - 配置cron任务时显式指定工作目录,同时增加日志重定向方便后续排查运行问题,参考写法如下:
# 示例:每日凌晨2点执行脚本,运行日志追加到项目目录下的cron_run.log 0 2 * * * cd /Users/aaron/project && /Users/aaron/project/venv/bin/python /Users/aaron/project/extract_starling.py >> /Users/aaron/project/cron_run.log 2>&1
补充:pyenv版本显示异常说明
你观察到的pyenv global输出版本和python --version不一致、which python返回miniforge路径的问题,是因为miniforge安装时写入shell配置文件(.zshrc/.bashrc)的初始化代码优先级高于pyenv的初始化配置,导致shell加载时优先命中miniforge的python解释器。该问题不影响当前cron任务运行——因为你已经在cron命令中显式指定了虚拟环境python的完整绝对路径,执行时不会调用到系统全局的其他python版本,无特殊需求可以不用调整。
内容的提问来源于stack exchange,提问作者user14380579
相关产品推荐
相关产品推荐

