导入financials_api_get模块触发ModuleNotFoundError的原因排查
导入失败原因及解决办法
失败原因
- Airflow路径优先级覆盖:Airflow默认会把DAG所在的
airflow/dags目录添加到sys.path最前方,你手动插入的show_case路径优先级被覆盖,Python导入时优先从dags目录查找,找不到目标模块。 - 包导入规范问题:
show_case是包含__init__.py的合法Python包,但直接导入模块名的方式不符合包导入逻辑,在Airflow的特殊运行环境下无法被正确识别。 - 次要隐患:拼写错误:函数名
get_fundemental_data存在拼写错误(正确应为get_fundamental_data,少了字母a),当前报错是模块找不到,后续找到模块后会触发函数找不到的错误,需提前修正。
解决办法
方法一:调整导入逻辑,明确包路径
修改fundamental_data_pipeline.py的代码,将show_case的父目录加入sys.path,然后通过包名导入:
from pathlib import Path import sys # 获取show_case目录的绝对路径 show_case_path = Path(__file__).resolve().parent.parent.parent # 将show_case的父目录加入sys.path,使show_case作为包被识别 sys.path.insert(1, str(show_case_path.parent)) # 通过包名导入目标函数 from show_case.financials_api_get import get_fundemental_data
由于你已经在show_case/__init__.py中导入了函数,也可以简化为:
from pathlib import Path import sys show_case_path = Path(__file__).resolve().parent.parent.parent sys.path.insert(1, str(show_case_path.parent)) from show_case import get_fundemental_data
方法二:移动模块到dags目录(简单直接)
如果业务允许,直接将financials_api_get.py复制到airflow/dags目录下,无需修改路径,直接导入即可:
from financials_api_get import get_fundemental_data
方法三:配置Airflow的PYTHONPATH环境变量
通过环境变量全局添加路径,避免在每个DAG中手动修改sys.path:
- 临时生效:启动Airflow前设置环境变量
export PYTHONPATH="/绝对路径/show_case:$PYTHONPATH" airflow webserver --port 8080
- 永久生效:修改
airflow.cfg配置文件,在[core]section下添加:
PYTHONPATH = /绝对路径/show_case
配置完成后,DAG代码中可直接导入:
from financials_api_get import get_fundemental_data
内容的提问来源于stack exchange,提问作者geds133
相关产品推荐
相关产品推荐

