在Airflow DAG中导入本地模块(python脚本)

时间:2018-05-03 08:29:16

标签: python airflow

我正在尝试将本地模块(python脚本)导入我的DAG。

目录结构:

- airflow/  
-- dag/  
---- __init__.py  
---- my_DAG.py  
-- script/  
---- subfolder/  
------ __init__.py  
------ local_module.py  

my_DAG.py中的示例代码:

#trying to import from local module
from script.subfolder import local_module  

#calling a function in local_module.py  
a = some_function()  

我在Airflow中收到错误说'Broken DAG:my_DAG。没有名为'local_module'的模块。

我已将Airflow更新为1.9.0,但这并不能解决问题。

  • 这里有什么解决方案?
  • 我还在某处读到了我可以通过创建插件来解决这个问题。任何人都可以指出我怎么做到这一点?

感谢。

4 个答案:

答案 0 :(得分:0)

这通常与Airflow的配置方式有关。

airflow.cfg中,确保airflow_home中的路径已正确设置为Airflow目录结构所在的路径。

然后Airflow扫描所有子文件夹并填充它们以便找到模块。

否则,只需确保您尝试导入的文件夹位于Python路径中:How to use PYTHONPATH

答案 1 :(得分:0)

您需要在__init__.py目录中添加与script相同级别的另一个subfolder文件。

airflow/  
    |_ dag/  
    |    |_ __init__.py  
    |    |_ my_DAG.py  
    |_ script/
         |_ __init__.py          <----- This here
         |_  subfolder/  
              |_  __init__.py  
              |_  local_module.py  

答案 2 :(得分:0)

我的操作方法如下:

  1. 使用main()函数在子文件夹中创建Python脚本。
  2. 在dag文件中,包括子文件夹和文件的路径声明

现在您可以在PythonOperator

中使用此脚本了
import sys
sys.path.insert(0,"/root/airflow/dags/subfolder"))
import subfolder.script_name as script
...    
t1=PythonOperator(
    task_id='python_script',
    python_callable=script.main,
    dag=dag
)

答案 3 :(得分:0)

如果您在 docker 中运行 Airlow,那么您需要执行以下操作:

  1. 在 dags 文件夹中为您的模块创建一个文件夹。例如 程序
  2. 如下使用(这是 docker 的正确路径):
import sys
sys.path.append('/opt/airflow/dags/programs/my_module')
import my_module
task1 = PythonOperator(
        task_id='my_task_name',
        python_callable=my_module.my_func,
        dag=dag,
    )