Airflow DAG无法导入根目录下自定义模块的问题咨询
问题分析与解决方法
你的导入逻辑本身是合理的,但之所以出现ModuleNotFoundError: No module named 'myprojects',核心原因是Airflow默认的PYTHONPATH并没有包含你的airflow根目录。
默认情况下,Airflow只会把$AIRFLOW_HOME/dags目录添加到PYTHONPATH中,而你的myprojects文件夹直接放在airflow根目录下,不在DAG文件夹的层级里,所以Python解释器找不到这个包。好在你已经给各个文件夹添加了__init__.py,这一步是正确的,不用再调整。
下面是几种可行的解决方法,按推荐程度排序:
1. 修改Airflow配置文件(推荐)
直接在Airflow的核心配置中添加PYTHONPATH路径:
- 找到你的
airflow.cfg文件(通常在$AIRFLOW_HOME目录下) - 定位到
[core]章节,找到pythonpath配置项(如果没有就手动添加) - 设置为你的airflow根目录路径,比如:
[core] pythonpath = /path/to/your/airflow - 修改完成后,重启Airflow的webserver和scheduler服务,让配置生效。之后你就能正常使用
from myprojects.projectone import tasks这样的导入语句了。
2. 通过环境变量设置PYTHONPATH
如果不想修改配置文件,可以在启动Airflow服务前设置环境变量:
- 在终端中执行:
export PYTHONPATH="$AIRFLOW_HOME:$PYTHONPATH" - 随后启动Airflow服务(webserver、scheduler等),此时进程会继承这个PYTHONPATH配置。
- 如果是用systemd、supervisord等服务管理器运行Airflow,需要在服务配置文件中添加这个环境变量。比如在systemd的服务文件中添加:
Environment="PYTHONPATH=/path/to/your/airflow:$PYTHONPATH"
3. 在DAG文件中手动添加路径(临时方案)
如果只是临时测试,不想改动全局配置,可以在mydag.py的最顶部添加以下代码,手动把airflow根目录加入PYTHONPATH:
import sys from pathlib import Path # 获取当前DAG文件的父目录的父目录(即airflow根目录) airflow_root = Path(__file__).parent.parent sys.path.append(str(airflow_root))
这种方法的缺点是每个需要导入外部包的DAG都要重复添加代码,不适合长期使用。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

