获取Pycharm以查看动态生成的python模块

时间:2017-04-12 22:32:24

标签: pycharm airflow

使用Apache airflow,他们通过修改sys.modules来安装插件:

 sys.modules[operators_module.__name__] = operators_module

他们如何从plugins文件夹中获取要通过

导入的python类

from airflow.operators.plugin_name import Operator

即使班级Operator存在于

airflow/plugins/Operators.py

这使得PyCharm无法理解上述import语句,因为它是一种生成模块/模块名称的非传统方式。

有没有办法让PyCharm像这样的情况使用模块/包别名?

3 个答案:

答案 0 :(得分:3)

Airflow通过在plugins目录中搜索AirflowPlugin子类来加载插件,然后将存储在这些子类的属性中的运算符等绑定到airflow命名空间下的新模块。

解决将类转换为模块的代码超出了PyCharm的功能,因此除非您想通过将plugins目录添加到sys.path并直接导入内容来覆盖此行为,否则最佳解决方案是将类列入白名单模块气流通过Settings -> Editor -> Inspections -> Python -> Unresolved references创建,并将airflow.operators.plugin_name添加到Ignore references列表中。然后,使用如下模块:

from airflow.operators import plugin_name
task = plugin_name.Operator()

不会再出现任何错误,但您仍然无法获得代码完成带来的好处。

答案 1 :(得分:3)

如果您的插件与dag位于同一个存储库中,则可以在try-except块中包装导入:

try:
   # local development
   from plugin_name import Operator
except ImportError:
   from airflow.operators.plugin_name import Operator

my_operator = Operator(...)

plugins目录标记为PyCharm项目结构中的来源 之后PyCharm会选择你的插件源代码,并且可以很好地完成自动完成等工作。

答案 2 :(得分:0)

到目前为止,我发现的最佳解决方案(这不是一个很好的解决方案)只是忽略每个DAG文件中所有未解析的属性。如果将鼠标悬停在错误上,可以选择“更多操作...”,然后“将[DAG FILE NAME]的所有未解析属性标记为已忽略。”下面的屏幕截图。

这不是一个很好的解决方案,因为它违背了IDE的目的,所以我希望最终某个对问题更了解的人会想到一个更好的解决方案,并将其发布在这里:)

enter image description here

enter image description here