气流-从父文件夹导入

时间:2018-07-17 00:32:16

标签: python airflow

简述:我可以通过$ python my_dag.py来运行dag,但是通过Airflow UI,它会声明错误No module named 'my_file_to_be_imported'

我有一个容器,其中有一个dagslutils(来自我的自定义文件夹)的git文件夹,它们映射为airflow home内部的卷,如下所示:

── airflow_home
     |──── dags
     │   ├── __init__.py     
     |   ├── my_dag.py
     ├──── lutils
         ├── __init__.py
         ├── my_file_to_be_imported.py

my_dag.py文件夹中的dags文件需要从lutils文件夹中读取内容。

my_dag.py(简体)的定义如下:

import sys
sys.path.append('../')
from lutils import my_file_to_be_imported

def do_something():
    my_file_to_be_imported.beauty_imported_method()

t1 = PythonOperator(
    task_id='test_generate',
    python_callable=do_something,
    dag=dag)

my_file_to_be_imported.beauty_imported_method() #to check if python runs
print (my_file_to_be_imported.var) #to check if python runs

my_file_to_be_imported文件夹中的lutils文件为:

def beauty_imported_method():
    with open('text.txt', 'a') as f:
        f.write("test")
var = "my test var"

如果我使用bash $ python my_dag.py(作为python脚本)运行,它将执行beauty_imported_method并打印var变量。 但是在内部气流中,有一个红色警告说:Broken DAG: [path_to_airflow_home/dags/my_dag.py] No module named 'my_file_to_be_imported'

我该如何解决airflowpython run那样理解我的导入的事情?

我已经阅读了this在stackoverflow中一个非常封闭的问题,但是没用。

P.s .:此docker安装程序可以很好地运行其他不依赖相对导入的dag。

1 个答案:

答案 0 :(得分:0)

如@ tobi6所述,您应该将两个变量PYTHONPATH和AIRFLOW_HOME定向到适当的文件夹。在您的情况下,我认为PYTHONPATH未设置或设置错误。

应如下所示:

export PYTHONPATH=/path/to/airflow_home