本地运行Airflow DAG文件时如何让Python识别模块层级?
问题描述
我按照Airflow官方的模块管理规范组织DAG代码,目录结构如下:
<PYTHONPATH目录> | .airflowignore # 仅在dags目录需要 | -- my_company | __init__.py | common_package | | __init__.py | | common_module.py | | subpackage | | __init__.py | | subpackaged_util_module.py | | my_custom_dags | __init__.py | my_dag1.py | my_dag2.py | base_dag.py
在Airflow环境中运行时,以下导入语句能正常工作:
from my_company.common_package.common_module import SomeClass from my_company.common_package.subpackage.subpackaged_util_module import AnotherClass from my_company.my_custom_dags.base_dag import BaseDag
但本地直接执行python my_company/my_custom_dags/my_dag1.py验证DAG时,出现模块找不到的错误:
Traceback (most recent call last): File "/[...]/my_company/my_custom_dags/my_dag1.py", line 1, in <module> from my_company.common_package.common_module import SomeClass ModuleNotFoundError: No module named 'my_company'
请问如何调整运行方式,让Python识别模块上下文并找到对应包?
解决方案
方法1:临时设置PYTHONPATH环境变量
将包含my_company的父目录(即上述结构中的<PYTHONPATH目录>)添加到Python的模块搜索路径中,再执行脚本:
Linux/macOS
export PYTHONPATH=/实际路径/到/父目录:$PYTHONPATH python my_company/my_custom_dags/my_dag1.py
Windows(CMD)
set PYTHONPATH=C:\实际路径\到\父目录;%PYTHONPATH% python my_company\my_custom_dags\my_dag1.py
Windows(PowerShell)
$env:PYTHONPATH = "C:\实际路径\到\父目录;$env:PYTHONPATH" python my_company\my_custom_dags\my_dag1.py
方法2:以模块方式运行脚本
切换到<PYTHONPATH目录>下,使用-m参数以模块形式执行DAG文件(无需加.py后缀):
cd /实际路径/到/父目录 python -m my_company.my_custom_dags.my_dag1
方法3:在脚本中手动添加路径
如果不想每次设置环境变量,可以在my_dag1.py的最顶部添加代码,自动将父目录加入搜索路径:
import sys from pathlib import Path # 获取包含my_company的父目录路径 root_dir = Path(__file__).resolve().parents[2] sys.path.append(str(root_dir)) # 后续正常执行导入 from my_company.common_package.common_module import SomeClass
方法4:使用Airflow官方验证命令
Airflow提供了专门的DAG验证工具,比直接运行脚本更贴合生产环境逻辑:
- 测试指定DAG:
airflow dags test my_dag_id 2024-01-01
- 检查所有可加载的DAG:
airflow dags list
内容的提问来源于stack exchange,提问作者Kombajn zbożowy
相关产品推荐
相关产品推荐

