Airflow模块导入报错求助:找不到scripts.marketing_functions模块
解决ModuleNotFoundError: No module named 'scripts.marketing_functions'问题
问题现象
执行脚本时触发如下错误:
ModuleNotFoundError: No module named 'scripts.marketing_functions'
直接在控制台手动执行脚本也会出现相同报错。
项目结构
scripts/ ├──__init__.py ├── marketing_functions.py └── marketing/ └── some_script.py # 依赖marketing_functions.py dags/ └── my_dag.py # 通过BashOperator调用some_script.py
环境配置
- 目录部署位置:
scripts目录:/opt/bitnami/airflow/scriptsdags目录:/opt/bitnami/airflow/dags
- PYTHONPATH已配置
/opt/bitnami/airflow/scripts,通过airflow info可验证:
Paths info airflow_home | /opt/bitnami/airflow system_path | /opt/bitnami/common/bin:/opt/bitnami/python/bin:/opt/bitnami/postgresql/bin:/opt/bitnami/airflow/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin python_path | /opt/bitnami/python/bin:/opt/bitnami/airflow/scripts:/opt/bitnami/python/lib/python39.zip:/opt/bitnami/python/lib/python3.9:/opt/bitnami/python/lib/python3.9/lib-dynload:/opt/bitnami/python/lib/pyt | hon3.9/site-packages:/opt/bitnami/python/lib/python3.9/site-packages/setuptools-63.4.3-py3.9.egg:/opt/bitnami/python/lib/python3.9/site-packages/pip-21.3.1-py3.9.egg:/opt/bitnami/airflow/dags:/opt/ | bitnami/airflow/config:/opt/bitnami/airflow/plugins airflow_on_path | True
控制台验证PYTHONPATH:
I have no name!@0a8ff614c4b8:/$ echo $PYTHONPATH /opt/bitnami/airflow/scripts
相关代码示例
DAG代码(my_dag.py)
import datetime from airflow import DAG from airflow.operators.bash import BashOperator with DAG( dag_id="marketing_some_script", start_date=datetime.datetime(2023, 4, 16), schedule_interval="30 2 * * *", ) as dag: some_script = "/opt/bitnami/airflow/scripts/marketing/some_script.py" task_some_script = BashOperator( task_id="task_some_report", bash_command=f"python {some_script}" ) task_some_script
脚本导入部分(some_script.py)
from datetime import datetime import gspread import pandas as pd from airflow.providers.postgres.hooks.postgres import PostgresHook from oauth2client.service_account import ServiceAccountCredentials from scripts.marketing_functions import *
解决方案
方案1:修改导入语句
由于/opt/bitnami/airflow/scripts已在PYTHONPATH中,Python会直接搜索该目录下的模块,因此将导入语句改为:
from marketing_functions import *
方案2:调整PYTHONPATH层级
将PYTHONPATH改为/opt/bitnami/airflow,而非/opt/bitnami/airflow/scripts。这样Python能识别scripts作为顶层模块,原导入语句from scripts.marketing_functions import *即可正常工作。
方案3:在脚本中手动添加路径
在some_script.py的开头添加以下代码,将项目根目录加入Python搜索路径:
import sys sys.path.append('/opt/bitnami/airflow')
之后保留原导入语句即可。
内容的提问来源于stack exchange,提问作者Александр Шаповалов
相关产品推荐
相关产品推荐

