如何使用Python在DAG中导入外部脚本?

如何使用Python在DAG中导入外部脚本?,python,python-3.x,python-import,airflow,Python,Python 3.x,Python Import,Airflow,我的结构如下: 我尝试将脚本导入inbound_层的一些文件中,如下所示: 导入计算 但是,我在Airflow web上收到以下错误消息: 有什么想法吗?对于气流DAG,当您导入自己的模块时,您需要确保两件事: 模块在哪里?您需要找到文件夹中的根路径。例如,在“我的开发”框中,文件夹包括: ~/projects/data/afflow/teams/team\u name/projects/default/dags/dag\u names/dag\u files.py 根是气流,所以如果我

我的结构如下:

我尝试将脚本导入
inbound_层的一些文件中,如下所示:

导入计算
但是,我在Airflow web上收到以下错误消息:


有什么想法吗?

对于气流DAG,当您导入自己的模块时,您需要确保两件事:

  • 模块在哪里?您需要找到文件夹中的根路径。例如,在“我的开发”框中,文件夹包括: ~/projects/data/afflow/teams/team\u name/projects/default/dags/dag\u names/dag\u files.py

  • 根是气流,所以如果我把我的模块放入

    ~/projects/data/afflow/teams/teams\u name/common

    那么我需要使用

    from teams.team_name.common import my_module
    
    在您的情况下,如果根目录是bi的上部文件夹,并且您将calc的脚本放在
    bi/inbound\u layer/test.py
    中,那么您可以使用:

    from bi.inbound_layer.test import calc
    
  • 您必须确保目录结构中有
    \\uu init\\uuuuupy
    文件,以便导入正常工作。路径中的每个文件夹中都应该有一个空文件
    \\uuu init\\uuuu.py
    。它表示此目录是airflow软件包的一部分。在您的情况下,您可以使用bi和“入站”层文件夹下的
    touch\\\\\\\\\\\\\\.py
    (cli)创建空的
    \\\\\\\\\\.py

  • 我需要在
    ren.py的顶部插入以下脚本:

    导入系统,操作系统 从airflow.models导入变量 dagbacks\u DIR=变量.get('dagbacks\u DIR') sys.path.append(dagbacks\u DIR+/bi/inbound\u layer/)

    通过这种方式,我可以使用当前的文件夹包。

    默认情况下,Airflow在Airflow home中将
    dags/、plugins/、config/
    目录添加到
    PYTHONPATH
    中,因此您可以在
    dags
    文件夹下创建文件夹
    commons
    ,在那里创建文件(
    scriptFileName
    )。假设脚本中有某个类(
    GetJobDoneClass
    )要导入到
    DAG
    中,可以这样做:

    from common.scriptFileName import GetJobDoneClass
    

    如果您正在使用pycharm并将包添加到项目依赖项中,那么您可以导入它,否则您必须在路径中添加所需的包才能运行它。听起来似乎需要将包添加到您的路径中。请参见示例。根路径是什么意思?这就是加载DAG的路径吗?这里,我提到的路径根是$PYTHONPATH中定义的路径。您可以在env中使用“echo$PYTHONPATH”来获取它。顺便说一句,请对答案进行投票。或者,你可以简单地将“bi”添加到你的系统路径中。谢谢,我将发布我的具体解决方案,你的提示真的帮助了我!这就是工作。如果我们不想把它放在DAG下面怎么办?还有DAG旁边的另一个文件夹。它是如何工作的?