我为不同的python项目设置了不同的气流dags,即一个父dags文件夹-bash: /Users/USERNAME/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/TeX/texbin:/Users/USERNAME/miniconda2/bin:/Users/USERNAME/miniconda2/bin:/Users/USERNAME/miniconda2/bin: No such file or directory
,其中包含基于不同python项目的DAG子文件夹:/vol/dags
其中/vol/dags/project1/project1.py, /vol/dags/project2/project2.py
。
DAGS_FOLDER = /vol/dags
从同一目录中的另一个python文件导入一个函数,即project1.py
。但是当我启动airflow网络服务器时,我得到一个/vol/dags/project1/mycalculator.py
:
ImportError
我尝试将/vol/dags/project1/$ airflow webserver -p 8080
INFO - Filling up the DagBag from /vol/dags/
ERROR - Failed to import: /vol/dags/project1/project1.py
Traceback (most recent call last):
File "/Users/xxx/anaconda/lib/python2.7/site-packages/airflow/models.py", line 247, in process_file
m = imp.load_source(mod_name, filepath)
File "/vol/dags/project1/project1.py", line 10, in <module>
from mycalculator import *
ImportError: No module named mycalculator
导入mycalculator.py
,如下所示:
project1.py
答案 0 :(得分:2)
文件夹/vol/dags/project1/
缺少__init__.py
个文件。
此文件可以为空。
添加此文件,然后在project2.py中,您应该能够:
import project1.mycalculator.*
有关套餐的详情,请参阅此处: https://docs.python.org/2/tutorial/modules.html#packages
答案 1 :(得分:2)
您可以使用packaged dag概念为不同的项目提供不同的dag文件夹。您只需要将每个项目的zip放在您的父dag文件夹中即可。
通过这种方式,您可以轻松地将dag及其依赖项组合在一起,并且dag文件夹整洁干净,因为它仅包含每个项目的zip。
您可以创建一个如下所示的zip:
my_dag1.py
my_dag2.py
package1/__init__.py
package1/functions.py
您的父dag文件夹可能如下所示:
project1.zip
project2.zip
my_dag3.py
答案 2 :(得分:0)
这里有同样的问题。
事实上,我们的进口工作,因为在气流背景下,DAG_FOLDER已被添加到PYTHONPATH。 要添加的init 的.py在PROJECT1 /不会改变任何东西。
一个很好的解决方案可以是使用相对导入,如
from .mycalculator import *
但是相对进口目前无法正常工作,因为气流是如何进口Dags的(气流开发人员向我解释了)
因此,对我而言,最简单的解决方案是将dags文件保留在根目录中,并在它们前面加上“ project1_”或“ project2_”,然后将像mycalculator这样的libs放在子文件夹中。