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 中发布的文档的“开发”版本(尤其是“最佳实践”):
有一些最佳实践可以遵循:
将所有 python 文件放入 pythonpath
中已有的模块之一
始终使用绝对导入,不要使用“相对”引用
不要依赖您当前的工作目录设置(可能这就是您的问题所在 - 您当前的工作目录与您预期的不同)。
在你的情况下,可能会起作用的是:
在你的“utils.py”中写一个方法——例如“get_credentials_folder()”。
在此方法中使用__file__
导出“utils.py”的路径并找到包含它的预期文件夹的绝对路径(使用pardir
和 abspath
)
添加您到达 sys.path
的绝对路径
我的文件结构是这样的
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 文件中,我使用
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 中发布的文档的“开发”版本(尤其是“最佳实践”):
有一些最佳实践可以遵循:
将所有 python 文件放入 pythonpath
中已有的模块之一始终使用绝对导入,不要使用“相对”引用
不要依赖您当前的工作目录设置(可能这就是您的问题所在 - 您当前的工作目录与您预期的不同)。
在你的情况下,可能会起作用的是:
在你的“utils.py”中写一个方法——例如“get_credentials_folder()”。
在此方法中使用
__file__
导出“utils.py”的路径并找到包含它的预期文件夹的绝对路径(使用pardir
和abspath
)添加您到达 sys.path
的绝对路径