sys.argv[] 缺少 3 个必需的位置参数

问题描述 投票:0回答:4

我从 Jenkins 管道调用的 python 脚本有问题。 在主脚本中我有这个:

import sys

authentication = sys.argv[1]
style = sys.argv[2]
ip = sys.argv[3]
accounting = sys.argv[4]

PrintTestCases([str(authentication), str(style), str(ip), str(accounting)])

函数 PrintTestCases 在另一个文件中,并使用匹配大小写结构

def PrintTestCases(authentication, style, ip, accounting):
    match accounting:
        case "NOACC":
            match [authentication, style, ip]:
               case ['NONE', 'NONE', 'NONE']:
                    print("Test Case Number 1")
                case _:
                        print("Wrong Test Case")
        case "ACC":
              match [authentication, style, ip]:
                case ['PRIVATE', 'NONE', 'NONE']:
                    print( "Test Case Number 2")
                case _:
                        print("Wrong Test Case")

然后我从 Jenkins 管道中调用主脚本,如下所示

python3 -u main NONE NONE NONE ACC

但我总是收到这个错误

PrintTestCases() missing 3 required positional arguments: 'style', 'ip', and 'accounting'

根据我的理解,我通过 sys.argv 将参数传递给函数 为什么该函数看不到所需的参数?

python jenkins arguments sys
4个回答
3
投票

您正在传递一个包含所有参数的list。 请注意这两者有何不同。

PrintTestCases([str(authentication), str(style), str(ip), str(accounting)])

PrintTestCases(str(authentication), str(style), str(ip), str(accounting))

在第一种情况下,您传递的是单个对象。使用第二个。

PrintTestCases
需要 4 个不同的参数,但是通过传递
[str(authentication), str(style), str(ip), str(accounting)]
,您实际上将此列表单独作为
authentication
参数给出,而其他参数未填充。


1
投票

您传递一个列表作为输入,该列表仅被视为第一个输入。您应该将它们作为参数传递给函数。将

PrintTestCases([str(authentication), str(style), str(ip), str(accounting)])
替换为
PrintTestCases(str(authentication), str(style), str(ip), str(accounting))
,它应该可以工作。


1
投票

这只是因为您将单个列表传递给

PrintTestCases
函数。取下支架即可固定。


0
投票

为什么不使用 argparse 来处理这些参数?您可以轻松定义所需的参数,并根据需要将其中一些参数设置为可选。

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("authentication", help="The authentication method")
    parser.add_argument("style", help="The style")
    parser.add_argument("ip", help="The IP address")
    parser.add_argument("accounting", help="The accounting method")
    args = parser.parse_args()
    PrintTestCases([str(args.authentication), str(args.style), str(args.ip), str(args.accounting)])
© www.soinside.com 2019 - 2024. All rights reserved.