使用Apache airflow,他们通过这样修改来安装插件sys.modules:
sys.modules[operators_module.__name__] = operators_module
Run Code Online (Sandbox Code Playgroud)
这是他们从他们的plugins文件夹中获取python类的方式
from airflow.operators.plugin_name import Operator
即使班级Operator存在于里面
airflow/plugins/Operators.py
这使得PyCharm无法理解上述import语句,因为它是一种生成模块/模块名称的非传统方式.
有没有办法让PyCharm像这样的情况有类似模块/包别名的东西?
如果您的插件与 dag 位于同一存储库中,您可以将导入包装在try-except块中:
try:
# local development
from plugin_name import Operator
except ImportError:
from airflow.operators.plugin_name import Operator
my_operator = Operator(...)
Run Code Online (Sandbox Code Playgroud)
并将plugins目录标记为 PyCharm 项目结构中的源。
之后 PyCharm 会获取您的插件源代码并与自动完成等功能很好地配合使用。
Airflow 通过在插件目录中搜索子AirflowPlugin类来加载插件,然后将存储在这些子类属性中的运算符等绑定到airflow命名空间下的新模块。
解决将类转换为模块的代码超出了 PyCharm 的能力,因此除非您想通过添加插件目录sys.path并直接导入内容来覆盖此行为,否则最好的解决方案是将气流创建的模块列入白名单Settings -> Editor -> Inspections -> Python -> Unresolved references并添加airflow.operators.plugin_name到Ignore references列表中。然后,像这样使用模块:
from airflow.operators import plugin_name
task = plugin_name.Operator()
Run Code Online (Sandbox Code Playgroud)
将不再引发任何错误,尽管您仍然无法获得代码完成的好处。
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |