无法从插件文件夹导入创建的包

Posted

技术标签:

【中文标题】无法从插件文件夹导入创建的包【英文标题】:Can't import created package from plugins folder 【发布时间】:2021-10-13 04:25:12 【问题描述】:

我正在使用 docker-compose 和 Dockerfile 运行 apache Airflow,并且我有以下气流文件夹结构:

dags
    example_dag
         dag_1.py
pf_utils
    __init__.py
    setup.py
    db.py --> get_primary_keys function
plugins
    _init_.py
    snowflake_operator.py --> from pf_utils.db import get_primary_keys
    

我已经从文件夹 utils 创建了一个包,以便能够按照https://airflow.apache.org/docs/apache-airflow/stable/modules_management.html#creating-a-package-in-python 中的说明在 dags 和插件代码中导入它的功能

但是,由于不存在模块,snowflake_operator 文件中的导入失败。我怎样才能让它在雪花操作符文件中工作?

如果我使用docker exec -it airflow_scheduler_1 bash 进入容器,我可以看到包pf_utils 已正确安装,原因有两个:

运行pip show pf_utils 向我展示:

 Name: pf-utils
 Version: 0.0.0
 Summary: UNKNOWN
 Home-page: UNKNOWN
 Author: None
 Author-email: None
 License: UNKNOWN
 Location: /home/airflow/.local/lib/python3.6/site-packages
 Requires: 
 Required-by: 

在家中 (/opt/airflow),在 python3 控制台中运行 import pf_utils 不会出错。

但是,如果我从 /opt/airflow 移动到 /opt/airflow/plugins 并在那里启动 python3,导入将引发不存在模块的错误。在工作目录/opt/airflow/plugins 我也尝试过:

from .pf_utils.db import get_primary_keys
import .pf_utils
import ..pf_utils
from ..pf_utils import db
from airflow.pf_utils import db

以上都不行

即使添加行:

import sys
sys.path.append('/opt/airflow/pf_utils')

到snowflake_operator.py文件开头并没有解决问题。

【问题讨论】:

你是如何安装pf_utils 包的?尝试在 docker compose 文件中使用_PIP_ADDITIONAL_REQUIREMENTS 或将其添加到您的自定义图像中,如here 所述。 【参考方案1】:

如果您使用的是 Airflow 2,则不再支持从 Plugins 导入算子/传感器等

https://airflow.apache.org/docs/apache-airflow/stable/plugins.html#plugins

在 2.0 版中更改:导入操作符、传感器、添加的钩子 通过气流插件。operators,sensors,hooks. 是 no 更长的支持,这些扩展应该只导入为 常规的 python 模块。有关更多信息,请参阅:模块管理 并创建自定义运算符

插件曾经在 1.10 中用于此目的,但即使在那里也不需要(有时是有害的)。这不再存在 - 插件可以添加宏和自定义 UI 视图或添加“整个 Airlfow 安装行为更改”(有关何时应使用插件的示例,请参见上面的插件链接)。

在 Airflow 2(它也适用于 Airflow 1.10)中,新的操作符/传感器/钩子应仅作为常规 python 包添加:

    在 dags 文件夹或您在 PYTHONPATH 中添加的任何其他文件夹中(通常如果您想迭代和更改这些运算符以及 dags)。通过在 .airflowignore 中的适当排除,可以将这些运算符等排除在调度程序的解析之外:https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html?highlight=airflowignore#loading-dags

    作为安装在您的环境中的常规 python 包(通常在您独立于更改 DAGS 测试和发布操作员时)。

    作为 Provider 包 - 如果您想对其中的一些进行逻辑分组以与特定服务交互,并且您想添加带有自定义 UI 组件的自定义连接,请添加 Operator 的额外链接 - 这将允许您注册其中一些 Hook/运营商提供新的连接和额外的链接。

【讨论】:

感谢您的回答 Jarek。我知道情况就是这样,实际上我一直在使用自定义钩子/运算符作为常规包。我使用“插件”表示放置在插件目录下的自定义运算符,默认情况下添加到 python 路径,而不是使用插件机制添加的自定义运算符。抱歉解释有误 只要把它移到“dags”——这就是它在概念上所属的地方。而且我认为,如果您将其移至插件,那么将“/opt/airlfow/plugins”添加到 PYTHONPATH BTW(我认为您已添加“/opt/airflow/pf_utils” :) 会起作用。

以上是关于无法从插件文件夹导入创建的包的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda Python3.7 函数 - numpy:无法导入名称“WinDLL”

将 .java 文件导入正确的包中

eclipse j2ee版如何导入插件包?

无法从我作为库导入的项目中访问类文件

如何从我的包用户的导入语句中删除输出文件夹?

安卓开发—导入高德地图sdk后工程中无法找到相应的包