【问题标题】:How to use non-installable modules from DAG code?如何使用 DAG 代码中的不可安装模块?
【发布时间】:2019-12-31 17:08:15
【问题描述】:

我有一个 Git 存储库,其中(除其他外)将 Airflow DAG 保存在 airflow 目录中。除了 Airflow 的安装目录之外,我还有一个存储库的克隆。 Git 中的airflow 目录由AIRFLOW_HOME 配置变量指向。

我希望允许从存储库中列出的模块导入 外部 airflow 文件夹(请参阅下面的结构)。

<repo root>
   |_airflow
      |_dags
         |_dag.py
   |_module1
   |_module2
   |_...

所以在dag.py我可以做到:

from module1 import Module1

目前,如果没有 tricks 似乎不可能像显式编辑 sys.path 这样不太优雅,必须在每个 dag 源文件中完成...

module1 中制作一个可安装的包也是不可能的。

【问题讨论】:

  • 为什么不能把它们做成一个包呢?是代码隐私问题吗?如果是这样,它需要保密到什么程度?
  • @PirateNinjas:你猜对了——问题之一是代码隐私。
  • 我只知道两种方法(我假设您已经知道这两种方法):[1] 将您的代码打包到 Airflow plugin [2] 通过更新 python 路径使代码可发现;但除了以编程方式更新sys.path,我们还可以(我个人这样做)在.bashrc 中一劳永逸地更新PYTHONPATH
  • 另一种方法是混淆路径,将代码混淆,以便您可以将其部署为包或直接作为代码部署。您可以通过使用 cython 将您的包构建到共享对象文件中来做到这一点。这不是一个完美的解决方案,但我认为它可以解决您的问题。
  • @y2k-shubham:确实,也许 Airflow 插件是要走的路。一个执行路径操作的基类可以用于为我创建的所有继承 DAG 设置环境。请将评论转换为答案,以便我接受。

标签: python-3.x git airflow python-module


【解决方案1】:

从这里的讨论中重写结论


一般来说,有两种可能的方式

  1. 将您的代码打包成Airflow plugin
  2. 通过更新PYTHONPATH 使您的代码可被 dag-definition-file(s) 解析进程发现。在这里,我们再次有以下选项

    (a) 在系统级别更新 PYTHONPATH using bashrc / 等效(一次性)或仅更新 export the updated PYTHONPATH 用于当前 bash 会话

    (b) 以编程方式 update sys.path 在 DAG 定义文件的开头

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 2012-09-02
    • 2020-04-21
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多