Jenkinsfile中如何将Groovy变量传递给Python程序
Groovy变量传递给Python的正确实现方案
问题根因
你的代码核心问题是混淆了Groovy变量和Shell变量的作用域:
你在Shell脚本内定义的
test="a,b,c"是Shell层的变量,Groovy解析三重双引号"""时会优先执行${test}插值,而Groovy上下文没有定义该变量,因此会替换为空值传入Python,最终Python拿到的就是空值。
推荐实现方式(最优)
优先把需要传递的变量放在Groovy侧定义,彻底避免跨层转义问题:
stage('Run python code') { steps { script { // 提前在Groovy层定义所有需要传入Python的变量 def test = "a,b,c" // 构造Python代码,Groovy变量直接插值,字符串类型需要额外包引号供Python识别 def pythonScript = """ import json test_val = "${test}" split_pub = ${data} json_split_pub = json.dumps(split_pub) json_split_pub = json_split_pub.replace("rename_value", test_val) json_split_pub = json_split_pub.replace("name", "${params.app}") // 最后输出结果供sh捕获 print(json_split_pub) """.stripIndent() // 执行Python命令 ACTIVE_CONNECTORS = sh( script: "python -c '${pythonScript}'", returnStdout: true ).trim() } } }
特殊场景:变量必须在Shell层生成
如果你的变量只能在Shell脚本内生成,需要转义$符号,禁止Groovy提前插值,让Shell层完成变量解析:
stage('Run python code') { steps { script { ACTIVE_CONNECTORS = sh(script: """ # Shell层生成变量 test="a,b,c" echo "**********test value*********" echo \$test # Python代码用双引号包裹,Shell层的\$test加转义,同时给Python侧包单引号 python -c " import json test_val = '\$test' split_pub = ${data} json_split_pub = json.dumps(split_pub) json_split_pub = json_split_pub.replace('rename_value', test_val) json_split_pub = json_split_pub.replace('name', '${params.app}') print(json_split_pub) " """.stripIndent(), returnStdout: true).trim() } } }
关键注意事项
- Groovy三重双引号
"""内的${var}默认触发Groovy层插值,要留给Shell解析的变量必须写成\${var}转义$符号 - 字符串类型变量传给Python时必须额外包引号,否则Python会将字符串内容识别为变量名抛出未定义错误
- 变量包含引号、换行等特殊字符时,建议先在Groovy侧做Base64编码后再传递,Python侧解码即可完全避免转义冲突
内容的提问来源于stack exchange,提问作者RAJ
相关产品推荐
相关产品推荐

