Python 中的多级导入不适用于 Airflow

Multi Level import in Python not working with Airflow

我的文件结构是这样的

Module
|
|--Common
|       |
|       utils.py
|       credentials.ini
|-- Folder2
|--Folder3
|--Folder4
         | 
         Folder5
               |
               comp.py

我需要在 comp.py 文件中导入 utils.py 函数,但问题是 utils 本身需要 credentials.ini 文件才能工作。

我解决了 utils.py 中的问题,方法是给它一个像这样的绝对路径 path=join(dirname(os.path.realpath(__file__)), 'credentials.ini') 在 comp.py 文件中,我使用

将此路径添加到 env
import sys
sys.path.append("../../")

虽然这在我 运行 comp.py 时有效,但我需要将其安排在气流上以使其达到 运行。每当气流调度 comp.py 到 运行 时,它找不到 utils.py (气流和模块包在不同的路径中)。知道我该如何解决吗?我不想手动将 utils.py 路径添加到 env.

P.S整个直接初始化为一个包。我已将 __init__.py 添加到主模块文件夹及其中的所有子目录。

编辑:固定格式

Airflow 在沙盒环境中加载 DAG,当您 运行 Python 文件作为脚本时,它不会处理所有各种导入工作方式。这是由于安全性和分布式系统的不同组件的工作方式。

参见 https://airflow.apache.org/docs/apache-airflow/stable/modules_management.html 但更详细的信息,尤其是将在 2.2 中发布的文档的“开发”版本(尤其是“最佳实践”):

http://apache-airflow-docs.s3-website.eu-central-1.amazonaws.com/docs/apache-airflow/latest/modules_management.html#best-practices-for-module-loading

有一些最佳实践可以遵循:

  1. 将所有 python 文件放入 pythonpath

    中已有的模块之一
  2. 始终使用绝对导入,不要使用“相对”引用

  3. 不要依赖您当前的工作目录设置(可能这就是您的问题所在 - 您当前的工作目录与您预期的不同)。

在你的情况下,可能会起作用的是:

  • 在你的“utils.py”中写一个方法——例如“get_credentials_folder()”。

  • 在此方法中使用__file__导出“utils.py”的路径并找到包含它的预期文件夹的绝对路径(使用pardirabspath)

  • 添加您到达 sys.path

    的绝对路径