Colab Enterprise定时执行笔记本无法读取环境变量的问题求助
解决Colab Enterprise定时执行ETL笔记本无法读取.env环境变量的问题
问题原因
Colab Enterprise定时执行的工作目录是/mnt/executor/scratch,你手动上传的.env文件不在该路径下,而load_dotenv()默认仅在当前工作目录查找文件,导致环境变量加载失败,进而引发SQLAlchemy连接时的类型错误。
可行解决方案
方案1:从GCS存储桶下载.env到执行目录并指定路径加载
将.env上传到GCS存储桶后,在笔记本中先下载文件到定时执行的工作目录,再指定路径加载:
from google.cloud import storage import os from dotenv import load_dotenv # 初始化GCS客户端(Colab Enterprise默认已配置权限) storage_client = storage.Client() bucket = storage_client.get_bucket("你的GCS存储桶名称") env_blob = bucket.blob("存储桶中.env的路径,比如config/.env") # 下载到定时执行的工作目录 local_env_file = "/mnt/executor/scratch/.env" env_blob.download_to_filename(local_env_file) # 加载指定路径的.env文件 load_dotenv(local_env_file) # 后续读取环境变量的代码保持不变 BE_DEV_DBNAME = os.getenv('BE_DEV_DBNAME') BE_DEV_USER = os.getenv('BE_DEV_USER') BE_DEV_PASSWORD = os.getenv('BE_DEV_PASSWORD') BE_DEV_HOST = os.getenv('BE_DEV_HOST') BE_DEV_PORT = os.getenv('BE_DEV_PORT') BE_DEV_ENGINE= create_engine(f'postgresql+psycopg2://{BE_DEV_USER}:{BE_DEV_PASSWORD}@{BE_DEV_HOST}:{BE_DEV_PORT}/{BE_DEV_DBNAME}')
方案2:直接在定时任务中配置环境变量(推荐)
无需依赖.env文件,直接在Colab Enterprise定时任务的配置界面添加环境变量:
- 打开定时任务的设置页面
- 找到「环境变量」配置项
- 依次添加
BE_DEV_DBNAME、BE_DEV_USER、BE_DEV_PASSWORD、BE_DEV_HOST、BE_DEV_PORT及其对应值 - 代码中移除
load_dotenv()调用,直接用os.getenv()读取变量即可,因为环境变量已直接注入运行环境
方案3:将环境变量直接嵌入笔记本(适合小型配置)
如果.env内容较少且无需频繁修改,可直接在笔记本中硬编码设置环境变量(注意不要将敏感信息提交到公共代码仓库):
import os from sqlalchemy import create_engine # 直接设置环境变量 os.environ['BE_DEV_DBNAME'] = "你的数据库名称" os.environ['BE_DEV_USER'] = "你的数据库用户名" os.environ['BE_DEV_PASSWORD'] = "你的数据库密码" os.environ['BE_DEV_HOST'] = "你的数据库主机地址" os.environ['BE_DEV_PORT'] = "你的数据库端口" # 后续读取代码保持不变 BE_DEV_DBNAME = os.getenv('BE_DEV_DBNAME') BE_DEV_USER = os.getenv('BE_DEV_USER') BE_DEV_PASSWORD = os.getenv('BE_DEV_PASSWORD') BE_DEV_HOST = os.getenv('BE_DEV_HOST') BE_DEV_PORT = os.getenv('BE_DEV_PORT') BE_DEV_ENGINE= create_engine(f'postgresql+psycopg2://{BE_DEV_USER}:{BE_DEV_PASSWORD}@{BE_DEV_HOST}:{BE_DEV_PORT}/{BE_DEV_DBNAME}')
内容的提问来源于stack exchange,提问作者Michael Ho
相关产品推荐
相关产品推荐

