如何解决Airflow DAG文件中的ModuleNotFoundError模块导入问题?
问题分析与修复方案
错误核心原因
你遇到的ModuleNotFoundError本质是Airflow模块加载的路径上下文问题:
虽然你在project_dag.py中把project_dir添加到了sys.path,但Airflow的DAG扫描机制会遍历所有.py文件,可能直接单独加载factory_config.py,此时sys.path中并没有project_dir,导致无法找到同目录的ci_config;另外,即使通过project_dag.py导入factory_config,你用的绝对导入语法依赖sys.path的配置,但该路径添加仅在project_dag.py的上下文生效,无法传递到factory_config的加载过程。
具体修复方案
方案1:使用相对导入(最规范的包内导入方式)
由于factory_config.py和ci_config.py属于同一个project_dir包(目录下已有__init__.py),直接用Python相对导入语法即可,无需依赖sys.path配置:
# factory_config.py 修改后的代码 import os import configs as table_configs from .ci_config import var3 # 点号表示当前包下的模块
方案2:配置Airflow全局PYTHONPATH(一劳永逸)
将dags/organization_dir目录添加到Airflow的PYTHONPATH环境变量中:
- 本地部署:修改Airflow启动脚本,添加
export PYTHONPATH="/home/airflow/gcs/dags/organization_dir:$PYTHONPATH" - Cloud Composer(从路径判断你使用GCS环境):在环境变量配置中新增
PYTHONPATH,值设为/home/airflow/gcs/dags/organization_dir
配置完成后,所有文件可直接用完整包路径导入,还能移除代码中硬编码的sys.path配置:
# project_dag.py 可简化为 from airflow import DAG from project_dir.factory_config import var1,var2 from project_dir.common_package import DagPipelineFactory # factory_config.py 可写为 import os import configs as table_configs from project_dir.ci_config import var3
方案3:临时应急——在factory_config.py中添加路径
如果不想修改导入语法,可在factory_config.py开头手动添加当前目录到sys.path:
# factory_config.py 开头新增代码 import os import sys current_dir = os.path.abspath(os.path.dirname(__file__)) sys.path.insert(0, current_dir) # 原有导入代码保持不变 import configs as table_configs from ci_config import var3
该方式会产生代码冗余,仅适合临时调试,不推荐长期使用。
内容的提问来源于stack exchange,提问作者sr1991
相关产品推荐
相关产品推荐

