基于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
相关产品推荐
相关产品推荐

