You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Airflow BashOperator中向外部Bash脚本传递JSON变量

Airflow BashOperator传递JSON变量到外部脚本的解决方法

问题原因

你之前的写法存在两个核心问题:

  • Airflow的模板语法{{ params.val }}仅在BashOperator的bash_command中会被渲染,外部脚本里的模板字符串不会被解析,脚本只会原封不动输出{{ params.val }}
  • 没有通过命令行参数将JSON变量传递给脚本,脚本无法直接获取Airflow上下文里的参数

解决步骤

1. 修改Airflow DAG代码

需要将JSON变量作为命令行参数传入脚本,同时用tojson过滤器把Python对象转成安全的JSON字符串,避免空格或特殊字符导致参数拆分:

example_vars = Variable.get("example_vars", deserialize_json=True)

dag = DAG('NEW_DAG', description='NEW_DAG', schedule_interval=None, default_args=default_args, catchup=False )

# 将JSON变量作为命令行参数传递,用双引号包裹确保完整传递
shell_command = 'path-to-my-file/my_script.sh "{{ params.val | tojson }}"'

running_task = BashOperator(
    task_id='task_to_run',
    bash_command=shell_command,
    trigger_rule="all_done",
    params={"val": example_vars},
    dag=dag
)

2. 修改外部Bash脚本

在脚本中通过命令行参数($1表示第一个参数)接收传递过来的JSON内容:

#!/bin/bash
# 输出接收到的完整JSON内容
echo "实际JSON内容:$1"

# 如果需要解析JSON字段,可使用jq工具(需提前安装),例如提取某个key的值:
# echo "$1" | jq '.your_key'

额外说明

  • 确保脚本有可执行权限:执行chmod +x path-to-my-file/my_script.sh
  • 如果JSON内容包含特殊字符,用双引号包裹参数是必须的,避免被shell拆分
  • tojson过滤器会把Python字典转成标准JSON字符串,保证传递过程中格式正确

内容的提问来源于stack exchange,提问作者Brij Bhushan Maurya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:05:23