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

TeamCity 10.x执行Python2脚本时参数被识别为列表对象的问题

我来帮你解决这个TeamCity 10.x传递Maven构建参数到Python 2脚本时的列表格式问题,这确实是TeamCity参数处理的一个小坑,下面是具体的原因和解决方案:

问题根源

TeamCity里从Maven步骤生成的构建参数(比如%maven.project.version%)默认会被标记为列表类型,当你在命令行运行器的参数里直接引用它时,TeamCity会把这个列表以[ '2.141']这种字符串形式传给Python脚本,而不是我们需要的纯版本号字符串。再加上你的脚本里用了nargs=1的argparse配置,这会让参数被解析成单元素列表,最终导致Nexus URL里出现奇怪的括号格式。

两种可行解决方案

方案1:调整Python脚本的参数解析逻辑

你可以从脚本层面入手,适配TeamCity的参数格式:

  • 去掉nargs=1配置:如果这个参数只需要接收单个值,完全可以删掉nargs=1,argparse默认会把输入解析成字符串,这样不管是本地还是TeamCity传参都能正常工作:
    parser.add_argument('-mv', '--mvn_vrsn', type=str, default='2.140.0-SNAPSHOT', help='TCity: maven.project.version')
    
  • 保留nargs=1但提取列表元素:如果因为某些原因必须保留nargs=1,那在获取参数时直接取列表的第一个元素就行:
    args = parser.parse_args()
    mvn_version = args.mvn_vrsn[0]  # 把列表转成单个字符串
    
  • 处理带括号的异常输入:如果TeamCity已经把参数传成了[ '2.141']这种格式,你可以用字符串处理提取出里面的版本号:
    import re
    # 先判断参数是列表还是字符串,统一处理
    raw_input = args.mvn_vrsn[0] if isinstance(args.mvn_vrsn, list) else args.mvn_vrsn
    # 用正则提取引号里的内容
    mvn_version = re.search(r"'(.*?)'", raw_input).group(1)
    

方案2:在TeamCity里直接转换参数为字符串

更简单的方式是在TeamCity的命令行参数里直接处理,利用TeamCity的参数语法提取列表的第一个元素,这样脚本完全不用改:
把原来的脚本参数:

./some-python-script.py --mvn_version %maven.project.version% --artifact_id %maven.project.artifactId%

改成:

./some-python-script.py --mvn_version %maven.project.version[0]% --artifact_id %maven.project.artifactId[0]%

这样TeamCity会直接传递纯版本号字符串,和你在本地命令行运行的效果完全一致。

验证效果

不管用哪种方案,修改后再运行构建,Nexus URL都会正常显示为:
https://nexus_server/nexus/service/local/repositories/myproject/content/my/maven/group/some_artifact/2.141

内容的提问来源于stack exchange,提问作者OneMoreNerd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:42:47