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

jhn*_*lvr 8 pycharm airflow

使用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像这样的情况有类似模块/包别名的东西?

Tau*_*das 5

如果您的插件与 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 的工作方式是“from plugin_name import MyOperator”实际上也在运行时工作,因为插件文件夹中的任何内容都是可用的。因此,“from airflow.operators.plugin_name import MyOperator”很可能永远不会被调用,而且也没关系。我认为插件注册机制在从非气流包导入插件时更有用,但当涉及到 PyCharm 时我们又回到了原点。 (2认同)

apt*_*ryx 4

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

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

from airflow.operators import plugin_name
task = plugin_name.Operator()
Run Code Online (Sandbox Code Playgroud)

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