Airflow导入DAG报ModuleNotFoundError找不到my_project模块如何解决
你遇到的ModuleNotFoundError: No module named 'my_project'和PYTHONPATH配置本身无关,核心是目录结构、忽略规则、进程环境加载三个点的错误,按以下步骤修复即可:
1. 修正目录结构
你当前把DAG文件my_dag.py放在my_project业务包目录内是核心错误。Airflow递归解析DAG时,会将每个DAG文件所在的目录临时加入Python导入搜索路径,此时解析my_project目录下的DAG时,搜索路径会指向~/airflow/dags/my_project,你写的from my_project.common_modules.module1 import *会在当前my_project目录下再找一层my_project包,必然触发找不到模块的错误。
调整后的正确目录结构如下:
dags | .airflowignore | my_dag.py # DAG文件统一放在dags根目录,不要嵌套在自定义业务包目录内 | my_project | __init__.py | common_modules | | __init__.py | | module1.py
2. 修正.airflowignore规则
你当前配置的my_project/common_modules/.*规则存在匹配逻辑错误:
- Airflow的.airflowignore使用正则语法做路径匹配,
.*会匹配任意长度的任意字符,这条规则会直接把common_modules目录下所有文件(包括module1.py)标记为忽略,DAG解析阶段不会加载这些模块 - 如果你只是想忽略该目录下的隐藏文件,将规则修改为
my_project/common_modules/\..*(转义点号,仅匹配.开头的隐藏文件) - 如果没有特殊忽略需求,直接删除这条规则即可
3. 确认Airflow进程实际加载的搜索路径
不要仅在当前shell下检查PYTHONPATH,如果你用systemd、sudo或者服务方式启动Airflow,进程不会加载当前用户的shell环境变量配置。写一个临时测试DAG验证实际加载的路径:
from airflow import DAG from datetime import datetime import sys with DAG(dag_id="check_syspath", start_date=datetime(2024,1,1), schedule=None) as dag: for path in sys.path: print(path)
手动触发这个DAG,查看日志输出,如果你的dags目录绝对路径不在输出列表中,直接修改airflow.cfg的[core]区块配置,写绝对路径不要用~相对路径,避免用户上下文切换导致路径解析失败:
[core] dags_folder = /home/你的实际用户名/airflow/dags pythonpath = /home/你的实际用户名/airflow/dags
修改完成后重启scheduler和webserver进程生效。
额外避坑说明
如果你之前尝试把公共模块放到plugins目录,注意Airflow 2.x版本中plugins目录会被直接加入搜索路径根目录,导入时不需要加自定义前缀:
- 模块放在
plugins/common_modules/路径下时,导入语句直接写from common_modules.module1 import *即可 - 不要额外加plugins或者自定义的包前缀,否则同样会触发模块找不到的错误
内容的提问来源于stack exchange,提问作者hobscrk

