Airflow DAG中导入本地Python模块失败问题求助
解决Airflow DAG导入本地Python模块的问题
我刚踩过几乎一模一样的坑,Airflow 1.x版本的路径配置确实容易出问题,给你几个亲测有效的解决方案:
问题根源
Airflow默认只会把dags目录添加到Python的搜索路径(sys.path)中,而你的script目录和dags平级,不在这个路径范围内,所以Python解析DAG时找不到script.subfolder.local_module。
解决方案1:在DAG文件中手动添加路径
在my_DAG.py的最开头加上这段代码,把Airflow根目录(也就是包含dag和script的文件夹)加到Python路径里:
import sys import os # 获取当前DAG文件的绝对路径,往上回溯两级到airflow根目录 airflow_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if airflow_root not in sys.path: sys.path.append(airflow_root) # 现在可以正常导入了 from script.subfolder import local_module # 注意调用函数要带上模块名,或者直接导入具体函数 a = local_module.some_function() # 也可以这样写:from script.subfolder.local_module import some_function; a = some_function()
解决方案2:设置全局PYTHONPATH环境变量
如果不想每个DAG都加路径代码,可以在启动Airflow服务前,把Airflow根目录加到PYTHONPATH里:
# 替换成你的airflow根目录实际路径 export PYTHONPATH=/path/to/your/airflow:$PYTHONPATH # 然后启动Airflow服务 airflow webserver -p 8080 airflow scheduler
这样所有DAG都会自动识别到script目录下的模块,属于一劳永逸的方案。
额外注意点
- 你示例里的
a = some_function()会触发NameError: name 'some_function' is not defined,因为你只导入了模块,没有导入具体函数,记得要么用模块名.函数名调用,要么直接导入目标函数。 - 确保
script和subfolder下的__init__.py是空文件即可,不需要写任何内容,Python会自动把它们识别为可导入的包。
内容的提问来源于stack exchange,提问作者hotchocolate
相关产品推荐
相关产品推荐

