Airflow导入模块报错:ModuleNotFoundError,无法找到config模块
问题背景
目录结构
dags/ ├── airflow_sched.py ├── backend │ ├── README.md │ ├── requirements.txt │ └── src │ ├── buffer.py │ ├── config │ │ ├── config.py │ └── stage.py
DAG定义文件(airflow_sched.py)
from datetime import timedelta import pendulum from airflow.decorators import dag from backend.src.stage import stage_data @dag( dag_id = "data-sync", schedule_interval = "1 * * * *", start_date=pendulum.datetime(2023, 3, 8, tz="Asia/Hong_Kong"), catchup=False, dagrun_timeout=timedelta(minutes=20), ) def Pipeline(): a = stage_data()
报错信息
执行airflow dags list-import-errors后出现以下错误:
filepath | error ===================================+===================================================================== /opt/airflow/dags/airflow_sched.py | Traceback (most recent call last): | File "/opt/airflow/dags/airflow_sched.py", line 4, in <module> | from backend.src.stage import stage_data | File "/opt/airflow/dags/backend/src/stage.py", line 5, in <module> | from config import config | ModuleNotFoundError: No module named 'config'
问题
stage.py中执行from config import config为何报错?该如何解决?
解答
问题原因
Python模块导入时,会从sys.path列表中的路径查找模块。当前stage.py位于dags/backend/src/目录下,config是它的同级子目录,但Airflow运行时的sys.path默认仅包含dags/目录,不会自动包含dags/backend/src/。直接使用from config import config属于绝对导入,Python会在sys.path里查找名为config的模块,自然找不到。
解决方法
推荐以下三种方案:
1. 使用相对导入(符合包结构规范)
在stage.py中将导入语句改为相对导入,用.表示当前目录:
from .config import config
2. 使用绝对导入(从项目根目录开始)
基于dags/作为根目录,使用完整路径导入:
from backend.src.config import config
3. 手动添加路径到sys.path
在stage.py的开头添加代码,将当前文件所在目录加入Python的查找路径:
import sys from pathlib import Path # 获取当前文件所在目录(dags/backend/src/)并加入sys.path sys.path.append(str(Path(__file__).parent)) # 之后再导入config from config import config
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

