【问题标题】:Airflow Relative Importing Outside /dag Directory气流相对导入外部 /dag 目录
【发布时间】:2017-07-13 02:58:31
【问题描述】:

我无法将通用代码移出气流使用的 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

【问题讨论】:

  • 所有这些文件夹是否属于同一个应用程序模块?或不同的模块。以防万一所有都来自同一个应用程序模块,您可以使用相对路径导入。
  • @Haranadh 是的。我更新了图表以显示airflow_home 目录。
  • 我无法在 cmets 中回答。我发布了我的详细答案。如果你喜欢它。请投票。 :)
  • 此处发布了通过修改 PYTHONPATH 的解决方法:stackoverflow.com/a/48154139/1881080

标签: python airflow


【解决方案1】:

除了添加__init__.py 文件之外,其他方法是在 dag 脚本的顶部添加以下包含:

import sys
import os
sys.path.insert(0,os.path.abspath(os.path.dirname(__file__)))

【讨论】:

    【解决方案2】:

    只需在所有 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 运行这段代码。 你airflow_home在我的pycharm中的文件夹路径是stackoverflow/src/questions/airflow_home/

    bar.py代码是

    def bar_test():
        print "bar hara"
    

    【讨论】:

    • @connor-ameres;希望这个答案有帮助。如果是。请接受我的回答。如果它在您的设置中不起作用,请告诉我。
    • 我的气流主路径是 /usr/local/airflow ... from 语句类似于:“from usr.local.airflow” ...它声称错误“没有模块名称 usr”。我该怎么办?
    【解决方案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}"
    

    【讨论】:

      【解决方案4】:

      遇到同样的问题后,这为我解决了:

      导入系统,操作系统 sys.path.insert(0,os.path.abspath(os.path.join(os.path.dirname(file),os.path.pardir))) 从 common.foo 导入 *

      【讨论】:

        猜你喜欢
        • 2022-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 2022-12-12
        • 2022-10-16
        • 2017-03-31
        • 1970-01-01
        相关资源
        最近更新 更多