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

基于Black Duck Hub API生成指定项目版本漏洞报告的报错排查

问题分析与解决方案

报错核心原因

TypeError: create_vuln_status_report() got multiple values for argument 'format' 本质是函数调用时format参数被重复赋值:通常是你修改函数定义时,新增的「指定项目/版本」参数位置不合理,或者调用时参数传递方式冲突(比如既用位置传参又用关键字传参给format),导致该参数被两次赋值。


分步解决方案

1. 修正create_vuln_status_report函数定义

原函数是面向全项目的,新增指定项目/版本参数时,要遵守「必填参数在前、可选参数(带默认值)在后」的规则,避免参数顺序混乱。

正确的函数定义示例

def create_vuln_status_report(api, project_name=None, version_name=None, format="csv", output_file=None):
    # 逻辑分支:指定项目版本则拉取对应数据,否则拉取全项目数据
    if project_name and version_name:
        # 获取指定项目和版本的漏洞数据
        project = api.get_project_by_name(project_name)
        if not project:
            print(f"项目 {project_name} 不存在")
            return
        version = api.get_version_by_name(project, version_name)
        if not version:
            print(f"项目 {project_name} 的版本 {version_name} 不存在")
            return
        vulnerabilities = api.get_vulnerabilities_for_version(version)
    else:
        # 保留原全项目漏洞拉取逻辑
        projects = api.get_projects()
        vulnerabilities = []
        for project in projects:
            for version in api.get_versions(project):
                vulnerabilities.extend(api.get_vulnerabilities_for_version(version))
    
    # 后续漏洞数据处理、报告生成逻辑(复用原脚本代码即可)
    # ...

2. 修正主脚本的函数调用方式

调用时要保证参数传递不冲突,推荐用全关键字参数传递,彻底避免顺序问题。

正确的调用示例(结合命令行参数)

import argparse
from blackduck import Client

def main():
    parser = argparse.ArgumentParser(description="生成Black Duck漏洞状态报告")
    parser.add_argument("--project", help="指定目标项目名称(可选,不填则生成全项目报告)")
    parser.add_argument("--version", help="指定目标版本名称(需配合--project使用)")
    parser.add_argument("--format", default="csv", choices=["csv", "json"], help="报告输出格式")
    parser.add_argument("--output", help="报告输出文件路径")
    
    args = parser.parse_args()
    
    # 初始化Black Duck API客户端
    api = Client(
        base_url="你的Black Duck实例地址",
        token="你的API令牌",
        verify=False  # 根据实际环境调整是否验证SSL证书
    )
    
    # 参数合法性校验
    if args.project and not args.version:
        print("指定项目时必须同时指定版本")
        return
    
    # 调用报告生成函数(全关键字参数传递)
    create_vuln_status_report(
        api=api,
        project_name=args.project,
        version_name=args.version,
        format=args.format,
        output_file=args.output
    )

if __name__ == "__main__":
    main()

3. 避坑关键注意事项

  • 永远不要在位置参数之后传递关键字参数(Python 3.8+虽支持,但极易引发参数冲突)
  • 新增可选参数时必须设置默认值,避免破坏原脚本的全项目调用逻辑
  • 调用函数时优先用关键字参数传递可选参数,彻底避免参数顺序变化带来的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 05:13:19