Azure DevOps PythonScript@0任务arguments字段如何传递数组参数
配置Azure DevOps YAML流水线时,需要向Python脚本传递3个参数,其中1个为数组类型参数。本地运行脚本时通过sys.argv可正常接收参数,但PythonScript@0任务的arguments字段仅支持字符串类型输入,待传递的数组参数为${{ parameters.packageVersion }}。
当前任务配置如下:
- task: PythonScript@0 displayName: 'Modify ansible inventory files (wms_common.yml) with deployed versions' inputs: scriptSource: filePath scriptPath: deployment/s/azure-devops/scripts/script.py arguments: | ../../inventories/${{ variables.inventory }}/group_vars/all/wms_common.yml ../../inventories/central/${{ variables.inventory }}/group_vars/all/wms_common.yml ${{ parameters.packageVersion }}
流水线运行时报错:
/azure-devops/wms.full.pipeline.yml (Line: 95, Col: 18): Unable to convert from Array to String. Value: Array
拼接为分隔符字符串传递,脚本端拆分还原
使用Azure DevOps内置的join表达式,将数组元素用无冲突的固定分隔符(如逗号、|||这类不会出现在参数值中的符号)拼接为单字符串传入,Python脚本拿到对应参数后按分隔符拆分回数组即可。
修改后的任务配置:arguments: | ../../inventories/${{ variables.inventory }}/group_vars/all/wms_common.yml ../../inventories/central/${{ variables.inventory }}/group_vars/all/wms_common.yml ${{ join(',', parameters.packageVersion) }}Python端对应处理逻辑:
import sys file_path1 = sys.argv[1] file_path2 = sys.argv[2] # 拆分第三个参数得到原数组 package_version_list = sys.argv[3].split(',')注意:如果数组元素可能包含所选分隔符,更换为不会产生冲突的分隔符即可。
拆分为独立位置参数传递,兼容原有脚本逻辑
如果本地脚本的原有逻辑是将数组内每个元素作为独立的命令行位置参数接收(例如数组长度为3时,对应sys.argv的第3、4、5位参数),直接用空格作为分隔符拼接数组元素,传入后和本地运行的传参效果完全一致,无需修改Python端代码。
修改后的任务配置:arguments: | ../../inventories/${{ variables.inventory }}/group_vars/all/wms_common.yml ../../inventories/central/${{ variables.inventory }}/group_vars/all/wms_common.yml ${{ join(' ', parameters.packageVersion) }}序列化为JSON通过环境变量传递,适配复杂内容场景
如果数组元素内容较长、包含大量特殊字符容易出现命令行转义问题,可将数组通过内置convertToJson函数序列化为JSON字符串,通过环境变量传入脚本,Python端读取后反序列化即可,完全规避转义、分隔符冲突问题。
任务配置示例:- task: PythonScript@0 displayName: 'Modify ansible inventory files (wms_common.yml) with deployed versions' inputs: scriptSource: filePath scriptPath: deployment/s/azure-devops/scripts/script.py arguments: | ../../inventories/${{ variables.inventory }}/group_vars/all/wms_common.yml ../../inventories/central/${{ variables.inventory }}/group_vars/all/wms_common.yml env: PACKAGE_VERSIONS: ${{ convertToJson(parameters.packageVersion) }}Python端对应处理逻辑:
import os import json package_version_list = json.loads(os.environ.get('PACKAGE_VERSIONS', '[]'))
内容的提问来源于stack exchange,提问作者Martin

