我无法在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
答案 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 导入 *