气流相对导入外/ dag目录

时间:2017-07-13 02:58:32

标签: python airflow

我无法在airflow使用的dag目录之外移动公共代码。我查看了airflow source并找到了imp.load_source

是否可以使用imp.load_source加载dag目录之外的模块?在下面的示例中,这将从公共目录导入foo或bar。

── airflow_home
     |──── dags
     │   ├── dag_1.py
     │   └── dag_2.py
     ├── common
         ├── foo.py
         └── bar.py

4 个答案:

答案 0 :(得分:6)

只需在所有3个文件夹中添加__init__.py个文件即可。它应该工作。 事实上,我的文件夹结构中的每个文件夹都有__init__.py。我可以运行代码并查看输出。

示例文件夹结构可以是:

── airflow_home
     ├── __init__.py
     |──── dags
     │   ├── __init__.py
     │   ├── dag_1.py
     │   └── dag_2.py
     ├── common
         ├── __init__.py
         ├── foo.py
         └── bar.py

dag_1.py 代码可以是:

from stackoverflow.src.questions.airflow_home.common.bar import bar_test

def main():
    bar_test()

main()

我从pycharm开始运行这段代码。 我的pycharm中的airflow_home文件夹路径为stackoverflow/src/questions/airflow_home/

bar.py 代码

def bar_test():
    print "bar hara"

答案 1 :(得分:3)

将气流回家路径添加到 PYTHONPATH

export AIRFLOW_HOME=/usr/local/airflow
export PYTHONPATH="${PYTHONPATH}:${AIRFLOW_HOME}"

Dockerfile

ENV AIRFLOW_HOME=/usr/local/airflow
ENV PYTHONPATH "${PYTHONPATH}:${AIRFLOW_HOME}"

答案 2 :(得分:1)

代替添加__init__.py文件的另一种方法是在dag脚本的顶部添加以下包含:

import sys
import os
sys.path.insert(0,os.path.abspath(os.path.dirname(__file__)))

答案 3 :(得分:0)

遇到同样的问题后,这为我解决了:

导入系统,操作系统 sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(file),os.path.pardir))) 从 common.foo 导入 *