0

这是功能:

def sh(*command, read_output=False, **kwargs):
    command_text = " ".join(command)
    print(f"\t> {command_text}")
    try:
        if read_output:
            return check_output(command, **kwargs).decode("utf8")
        else:
            check_call(command, **kwargs)
    except CalledProcessError as failure:
        print(
            f'ERROR: "{command_text}" command reported failure! Return code {failure.returncode}.'
        )
        sys.exit(failure.returncode)

我正在尝试使用此函数首先获取 aws erc get-login,然后使用返回的登录命令登录到 aws erc。这是我的代码:

result = sh('aws', 'ecr', 'get-login', '--no-include-email', read_output=True)
re = result.split()
sh(re)

然后我得到错误:

command_text = " ".join(command)
TypeError: sequence item 0: expected str instance, list found

我认为该sh函数期望参数类似于 `('docker', 'login', '-u', 'AWS', '-p'...),但我该如何实现呢?

4

1 回答 1

0

您可以使用*解包列表/元组和函数获取它尽可能多的参数

sh( *re )

或者您可以**command定义中删除

def sh(command, ...)

然后您只能将其作为列表/元组发送

sh( re )

但你也可以检查是否commandliststring

if isinstance(command, str): 
    command_text = command 
elif isinstance(command, list, tuple): 
    command_text = " ".join(command)

所以你可以直接将它作为一个字符串发送。

sh( 'aws ecr get-login --no-include-email' )

或带字符串的列表

sh( ['aws', 'ecr', 'get-login', '--no-include-email'] )

顺便说一句:类似的方式适用**于字典和命名参数

def fun(a=0, b=0, c=0):
    print('a:', a)
    print('b:', b)
    print('c:', c)

data = {'b':2}

fun(**data)
于 2019-11-30T06:55:44.573 回答