使用Apache airflow,他们通过修改sys.modules
来安装插件:
sys.modules[operators_module.__name__] = operators_module
他们如何从plugins
文件夹中获取要通过
from airflow.operators.plugin_name import Operator
即使班级Operator
存在于
airflow/plugins/Operators.py
这使得PyCharm无法理解上述import语句,因为它是一种生成模块/模块名称的非传统方式。
有没有办法让PyCharm像这样的情况使用模块/包别名?
答案 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)