如何使用 DAG 代码中的不可安装模块?
How to use non-installable modules from DAG code?
我有一个 Git 存储库,它(除其他外)在 airflow
目录中保存 Airflow DAG。除了 Airflow 的安装目录之外,我还有一个存储库的克隆。 airflow
Git 中的目录由 AIRFLOW_HOME
配置变量指向。
我想允许从 airflow
文件夹外列出的存储库中的模块导入(请参阅下面的结构)。
<repo root>
|_airflow
|_dags
|_dag.py
|_module1
|_module2
|_...
所以在dag.py
我可以做:
from module1 import Module1
目前,如果没有 tricks 似乎是不可能的,比如显式编辑 sys.path
这不是很优雅,必须在每个 dag 源文件中完成...
从 module1
中制作可安装包也是不可能的。
在这里重写讨论的结论
大体上,有两种可能的方法
- 将您的代码打包成 Airflow plugin
通过更新 PYTHONPATH
让您的代码可被 dag 定义文件解析进程发现。同样,我们有以下选项
(a) 在系统级别 using bashrc
/ equivalent (once-and-for-all) or just export
the updated PYTHONPATH
上为当前 bash 会话
更新 PYTHONPATH
(b) 以编程方式 update sys.path
在 DAG 定义文件的开头
我有一个 Git 存储库,它(除其他外)在 airflow
目录中保存 Airflow DAG。除了 Airflow 的安装目录之外,我还有一个存储库的克隆。 airflow
Git 中的目录由 AIRFLOW_HOME
配置变量指向。
我想允许从 airflow
文件夹外列出的存储库中的模块导入(请参阅下面的结构)。
<repo root>
|_airflow
|_dags
|_dag.py
|_module1
|_module2
|_...
所以在dag.py
我可以做:
from module1 import Module1
目前,如果没有 tricks 似乎是不可能的,比如显式编辑 sys.path
这不是很优雅,必须在每个 dag 源文件中完成...
从 module1
中制作可安装包也是不可能的。
在这里重写讨论的结论
大体上,有两种可能的方法
- 将您的代码打包成 Airflow plugin
通过更新
PYTHONPATH
让您的代码可被 dag 定义文件解析进程发现。同样,我们有以下选项(a) 在系统级别 using
更新bashrc
/ equivalent (once-and-for-all) or justexport
the updatedPYTHONPATH
上为当前 bash 会话PYTHONPATH
(b) 以编程方式 update
sys.path
在 DAG 定义文件的开头