让Pycharm查看动态生成的python模块

让Pycharm查看动态生成的python模块,pycharm,airflow,Pycharm,Airflow,使用Apache Airflow,他们通过如下修改sys.modules来安装插件: sys.modules[operators_module.__name__] = operators_module 这就是他们从plugins文件夹中获取python类以通过 来自afflow.operators.plugin\u名称导入操作符 即使类操作符存在于 气流/插件/操作员.py 这使得PyCharm无法理解上述导入语句,因为它是生成模块/模块名称的非传统方式 有没有办法让PyCharm在这种情况

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

 sys.modules[operators_module.__name__] = operators_module
这就是他们从
plugins
文件夹中获取python类以通过

来自afflow.operators.plugin\u名称导入操作符

即使类
操作符
存在于

气流/插件/操作员.py

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


有没有办法让PyCharm在这种情况下拥有模块/包别名?

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

将类转换为模块的代码解析超出了PyCharm的能力,因此除非您希望通过将插件目录添加到
sys.path
并直接导入内容来覆盖此行为,最好的解决方案是将airflow通过
Settings->Editor->Inspections->Python->Unresolved references
创建的模块列入白名单,并将
airflow.operators.plugin\u name
添加到
Ignore references
列表中。然后,像这样使用模块:

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

将不再引发任何错误,尽管您仍然无法获得代码完成的好处。

如果您的插件与dag位于同一存储库中,您可以将导入包装到
中,尝试除
块外:

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

my_operator = Operator(...)
并将
插件
目录标记为PyCharm项目结构中的源代码。

之后,PyCharm会选择您的插件源代码,并与自动完成等功能配合良好。

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

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


您在这方面有什么进展吗?在这方面,我也在与PyCharm抗争。我想我在符号链接方面确实有一些运气,但我记不清了。在站点包中放置一个指向插件文件夹的链接,该链接需要与导入的结构相同。@Hexworks通过两个导入查看我的答案。它适用于单个存储库项目。气流的工作方式是plugin\u name import MyOperator中的
实际上也可以在运行时工作,因为plugins文件夹中的任何内容都可用。因此,airflow.operators.plugin\u name import MyOperator中的
可能永远不会被调用,这也无关紧要。我认为当从非airflow包导入插件时,插件注册机制更有用,但当涉及PyCharm时,我们又回到了原点。