Python脚本调用指定函数时出现未知参数错误求助
问题描述
我想运行Python脚本里的_test_one_xml函数,执行命令:
python testfile.py _test_one_xml --password Test123! --username TESTER
但命令行返回错误:
testfile.py: error: unrecognized arguments: _test_one_xml
相关脚本核心结构如下:
def _load_tickets(): parser = argparse.ArgumentParser(description="Loads tickets to prjABC.") parser.add_argument('-p', '--password', help="set password", default='tester!') parser.add_argument('-u', '--username', help="set user name", default='tester') args = parser.parse_args() # ... 后续逻辑 def _test_one_xml(sTestPlan, sTestCase, dicTicket, sState, sContent, sUrlServer, sProjectArea, sUrlProjectArea, username, password): # ... 函数逻辑 def _main(): _load_tickets() if __name__ == '__main__': _main()
问题原因
- 脚本默认执行
_main(),而_main()只会调用_load_tickets(),没有处理命令行传入的_test_one_xml函数名 - 当前
argparse只定义了--password和--username两个参数,无法识别_test_one_xml这个额外参数 _test_one_xml需要多个必填参数(测试计划ID、测试用例ID、ticket字典等),直接传函数名也无法提供这些参数
解决方案
方案1:临时调试(快速验证函数)
直接修改脚本的入口逻辑,手动调用_test_one_xml并传入所需参数:
if __name__ == '__main__': # 注释原有的_main()调用,替换为手动构造参数 # _main() # 替换为实际的测试计划ID和测试用例ID test_plan_id = "XXX" test_case_id = "YYY" # 构造函数需要的ticket字典(根据实际需求补充字段) dic_ticket = { "Tester": "TESTER", "Version Major": "1", "Version Minor": "0", "Version Revision": "0", "Version Sideline": "0", "PC Name": "" } # 其他必要参数 state = "com.ibm.prjABC.execution.common.state.passed" content = "测试内容" url_server = "https://test123.net/resources/" project_area = "Project ONE" url_project_area = "https://test123.netProjectArea/_aruiy997Fiyr3213fef" username = "TESTER" password = "Test123!" # 调用目标函数 _test_one_xml(test_plan_id, test_case_id, dic_ticket, state, content, url_server, project_area, url_project_area, username, password)
修改后直接执行脚本即可:
python testfile.py
方案2:修改脚本支持命令行指定函数(长期可用)
通过argparse添加子命令,让脚本支持从命令行选择要运行的函数:
- 修改
_load_tickets()中的参数解析逻辑:
def _load_tickets(): parser = argparse.ArgumentParser(description="Loads tickets to prjABC.") # 添加子命令解析器 subparsers = parser.add_subparsers(dest="command", required=True) # 原有的加载票证子命令 load_parser = subparsers.add_parser("load_tickets", help="加载票证到prjABC") load_parser.add_argument('-p', '--password', help="设置密码", default='tester!') load_parser.add_argument('-u', '--username', help="设置用户名", default='tester') # 新增运行_test_one_xml的子命令 test_xml_parser = subparsers.add_parser("test_one_xml", help="运行_test_one_xml函数") test_xml_parser.add_argument('-p', '--password', help="设置密码", default='tester!') test_xml_parser.add_argument('-u', '--username', help="设置用户名", default='tester') test_xml_parser.add_argument('--test-plan', required=True, help="测试计划ID") test_xml_parser.add_argument('--test-case', required=True, help="测试用例ID") args = parser.parse_args() # 根据子命令执行对应逻辑 if args.command == "load_tickets": if args.username == '' or args.password == '': print('用户名或密码不能为空。') sys.exit() _load_tickets_from_prjABC_directory(args.username, args.password) elif args.command == "test_one_xml": # 构造所需参数(可根据需求从命令行补充更多字段) dic_ticket = { "Tester": args.username, "Version Major": "1", "Version Minor": "0", "Version Revision": "0", "Version Sideline": "0", "PC Name": "" } state = "com.ibm.prjABC.execution.common.state.passed" content = "测试内容" url_server = "https://test123.net/resources/" project_area = "Project ONE" url_project_area = "https://test123.netProjectArea/_aruiy997Fiyr3213fef" _test_one_xml(args.test_plan, args.test_case, dic_ticket, state, content, url_server, project_area, url_project_area, args.username, args.password)
- 修复
_test_one_xml函数的硬编码问题:
def _test_one_xml(sTestPlan, sTestCase, dicTicket, sState, sContent, sUrlServer, sProjectArea, sUrlProjectArea, username, password): # 删除这两行硬编码,使用传入的参数 # username = 'tester' # password = 'tester!' # ... 剩余逻辑不变
修改后执行命令:
python testfile.py test_one_xml --password Test123! --username TESTER --test-plan "XXX" --test-case "YYY"
内容的提问来源于stack exchange,提问作者user2201789
相关产品推荐
相关产品推荐

