EC2上Crontab执行Python脚本报错:InstalledAppFlow无run_console属性
解决Crontab执行Python脚本时的AttributeError问题
问题概述
通过Crontab定期执行bash脚本运行3个Python脚本,手动执行bash starter.sh一切正常,但Crontab执行时报错:
AttributeError: 'InstalledAppFlow' object has no attribute 'run_console'
同时bash脚本存在笔误,且Crontab环境与终端环境存在差异,导致依赖库加载异常。
排查关键点
- bash脚本笔误:脚本中执行第三个Python脚本时,错误引用了未定义的变量
$ARCHIVO_PYTHON23,实际应为$ARCHIVO_PYTHON3。 - Python环境不一致:终端手动执行时使用的Python环境(如虚拟环境)与Crontab默认调用的系统Python环境不同,导致
google-auth-oauthlib库版本不匹配——终端环境的库支持run_console方法,而Crontab使用的环境中该方法不存在或已被弃用。 - 相对路径问题:Python脚本中使用相对路径引用
token.pickle,Crontab的默认工作目录是用户主目录,会导致无法找到该文件,触发重新认证流程,进而暴露环境差异问题。
解决方案
1. 修复bash脚本笔误
修改bash脚本中第三个Python脚本的执行命令:
# 原错误命令 python3 $ARCHIVO_PYTHON23 2>&1 | tee -a $REGISTRO # 修改为正确命令 python3 $ARCHIVO_PYTHON3 2>&1 | tee -a $REGISTRO
2. 统一Python执行环境
在bash脚本中指定终端使用的Python解释器绝对路径(比如虚拟环境的Python路径),而非默认的python3。例如,若虚拟环境位于/home/ubuntu/venv,则修改脚本中的Python调用:
# 替换所有python3为虚拟环境路径 /home/ubuntu/venv/bin/python3 $ARCHIVO_PYTHON1 2>&1 | tee -a $REGISTRO /home/ubuntu/venv/bin/python3 $ARCHIVO_PYTHON2 2>&1 | tee -a $REGISTRO /home/ubuntu/venv/bin/python3 $ARCHIVO_PYTHON3 2>&1 | tee -a $REGISTRO
可通过终端执行which python3获取当前使用的Python路径
3. 修正Python脚本中的文件路径
将Python脚本中所有相对路径改为绝对路径,确保Crontab能正确找到认证文件:
# 原相对路径 if os.path.exists('token.pickle'): with open('token.pickle', 'rb') as token: creds = pickle.load(token) # 修改为绝对路径 TOKEN_PATH = '/home/ubuntu/folder/token.pickle' if os.path.exists(TOKEN_PATH): with open(TOKEN_PATH, 'rb') as token: creds = pickle.load(token) # 保存token时同样使用绝对路径 with open(TOKEN_PATH, 'wb') as token: pickle.dump(creds, token)
4. 适配无交互环境的OAuth认证
若run_console方法在当前库版本中已被弃用,可替换为无交互的认证方式。例如,使用run_local_server并指定端口,或预先生成有效的token.pickle确保无需重新认证:
# 替换run_console为run_local_server(需确保库版本支持) creds = flow.run_local_server(port=0)
提前在终端手动执行一次脚本,生成有效的token.pickle,确保Crontab执行时无需触发交互式认证
验证步骤
- 保存所有修改后的脚本。
- 手动执行bash脚本确认无错误:
bash starter.sh。 - 更新Crontab任务,等待任务执行后查看日志
/home/ubuntu/folder4/runner_weekly_log.txt,确认无报错。
内容的提问来源于stack exchange,提问作者Julian Cortes
相关产品推荐
相关产品推荐

