如何在Python的Airflow DAG中导入外部脚本?

5

我有以下结构:

enter image description here

我尝试在inbound_layer的某些文件中导入脚本,如下所示:

import calc

然而在Airflow网页上,我收到了以下错误信息:

enter image description here

任何想法?

如果您正在使用PyCharm并将软件包添加到项目依赖项中,那么您可以导入它,否则您必须将所需的软件包添加到路径中才能运行它。 - sahasrara62
听起来你需要将该包添加到你的路径中。可以参考如何导入一个在上级目录中的Python类?作为示例。 - Error - Syntactical Remorse
3个回答

4

对于airflow DAG,如果导入自己的模块,需要确保以下两点:

  1. 模块在哪里?您需要找到在airflow文件夹中的根路径。例如,在我的开发环境中,文件夹为:
  2. ~/projects/data/airflow/teams/team_name/projects/default/dags/dag_names/dag_files.py

    根目录是airflow,所以如果我把我的模块my_module放在

    ~/projects/data/airflow/teams/team_name/common

    那么我需要使用

    from teams.team_name.common import my_module
    

    如果你的根目录是bi文件夹的上层目录,并且你将calc脚本放置在bi/inbound_layer/test.py中,则可以使用以下代码:

    from bi.inbound_layer.test import calc
    
    1. 您必须确保在目录结构中有\__init\__.py文件,以便导入功能正常运行。您应该在路径中的每个文件夹中都有一个空的\__init\__.py文件。它表示此目录是空气流包的一部分。在您的情况下,您可以在bi和_inbound_layer_文件夹下使用touch \__init\__.py(cli)创建空的__init\__.py文件。

你所说的根路径是什么意思?是指我的DAG被加载的路径吗? - Felipe Augusto
这里提到的根路径是在$PYTHONPATH中定义的路径。您可以在您的环境中使用“echo $PYTHONPATH”来获取它。顺便说一下,请投票支持这个答案。 - AC at CA
或者,你可以直接将“bi”添加到你的系统路径中。 - AC at CA
谢谢,我将发布我的具体解决方案,你的提示真的帮了我! - Felipe Augusto

4

Airflow默认会将Airflow主目录中的 dags/、plugins/ 和 config/ 目录添加到 PYTHONPATH 中,因此您可以在 dags/ 文件夹下创建 commons 文件夹,并在其中创建文件(scriptFileName)。假设该脚本有一个类(GetJobDoneClass),您想要在您的 DAG 中导入它,您可以像这样实现:

from common.scriptFileName import GetJobDoneClass

2
可以的。如果我们不想将它放在DAG下面,而是放在DAG旁边的另一个文件夹中,会发生什么?它该如何工作? - pm1359

1
我需要在 ren.py 文件的顶部插入以下脚本:
import sys, os
from airflow.models import Variable

DAGBAGS_DIR = Variable.get('DAGBAGS_DIR')
sys.path.append(DAGBAGS_DIR + '/bi/inbound_layer/')

这样我就可以提供当前文件夹的软件包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接