Airflow DAG使用{{ var.value }}模板语法获取变量报错如何解决?
报错原因
{{ var.value.my_var }}属于Airflow的Jinja2模板语法,仅能在Operator支持模板渲染的字段中使用,会在DAG调度执行时由Airflow自动解析替换为实际值。你直接将该语法写在Python函数的业务代码里,Python解释器会将其识别为普通Python语法执行,自然找不到var这个内置对象,触发NameError报错。
解决方案
你可以从两种实现思路里选:
- 直接用Python SDK取变量:就是你第一个函数的写法,直接在Python函数内调用
Variable.get("my_var")取值即可,这也是官方推荐的在PythonOperator逻辑中取全局变量的方式,不需要使用模板语法。注意你描述里写的Variable.ger是笔误,正确写法为Variable.get。 - 如果你一定要用模板语法传值:把模板变量写在PythonOperator支持模板渲染的
op_kwargs参数中,由Airflow渲染完成后再传入函数,修改后的代码示例如下:
from airflow import DAG from airflow.models import Variable from airflow.operators.python import PythonOperator import airflow.utils.dates def display_variable(): my_var = Variable.get("my_var") print('variable' + my_var) return my_var # 新增参数接收渲染后的变量值 def display_variable1(my_var): print('variable' + my_var) return my_var dag = DAG( dag_id="variable_dag", start_date=airflow.utils.dates.days_ago(14), schedule_interval='@daily' ) task = PythonOperator( task_id='display_variable', python_callable=display_variable, dag=dag ) task1 = PythonOperator( task_id='display_variable1', python_callable=display_variable1, # op_kwargs支持模板渲染,在此处写模板语法 op_kwargs={"my_var": "{{ var.value.my_var }}"}, dag=dag ) task >> task1
如果你用的是其他支持模板的Operator(比如BashOperator、SparkSubmitOperator等),直接把模板语法写在对应支持渲染的字段(比如bash_command、application_args等)中即可,不需要额外处理。
内容的提问来源于stack exchange,提问作者Rocky1989
相关产品推荐
相关产品推荐

