首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fabric "TypeError:不是字符串格式化期间转换的所有参数“

Fabric "TypeError:不是字符串格式化期间转换的所有参数“
EN

Stack Overflow用户
提问于 2012-06-12 00:29:32
回答 3查看 759关注 0票数 1

我有以下fabric任务:

代码语言:javascript
复制
@task
def deploy_west_ec2_ami(name, puppetClass, size='m1.small', region='us-west-1', basedn='joe', ldap='arch-ldap-01', secret='secret', subnet='subnet-d43b8abd', sgroup='sg-926578fe'):
    execute(deploy_ec2_ami, name='%s',puppetClass='%s',size='%s',region='%s',basedn='%s',ldap='%s',secret='%s',subnet='%s',sgroup='%s' %(name, puppetClass, size, region, basedn, ldap, secret, subnet, sgroup))

但是,当我运行该命令时:

代码语言:javascript
复制
fab deploy_west_ec2_ami:test,java

我得到了以下回溯:

代码语言:javascript
复制
            Traceback (most recent call last):
              File "/usr/local/lib/python2.6/dist-packages/fabric/main.py", line 710, in main
                *args, **kwargs
              File "/usr/local/lib/python2.6/dist-packages/fabric/tasks.py", line 321, in execute
                results['<local-only>'] = task.run(*args, **new_kwargs)
              File "/usr/local/lib/python2.6/dist-packages/fabric/tasks.py", line 113, in run
                return self.wrapped(*args, **kwargs)
              File "/home/bcarpio/Projects/githubenterprise/awsdeploy/fabfile.py", line 35, in deploy_west_ec2_ami
                execute(deploy_ec2_ami, name='%s',puppetClass='%s',size='%s',region='%s',basedn='%s',ldap='%s',secret='%s',subnet='%s',sgroup='%s' %(name, puppetClass, size, region, basedn, ldap, secret, subnet, sgroup))
            TypeError: not all arguments converted during string formatting

我不确定我明白为什么。我非常确定我在这里定义的所有值都很好。

同样,当我这样运行执行任务deploy_ec2_ami时:

代码语言:javascript
复制
deploy_ec2_ami:test,java,m1.small,us-west-1,'dc\=test\,dc\=net',ldap-01,secret,subnet-d43b8abd,sg-926578fe

它工作得很好

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-12 00:40:19

好吧,问题是当使用execute时,你必须定义一个host=。我的另一个fab任务不需要host=,所以我只需要放入常规的python:

代码语言:javascript
复制
deploy_ec2_ami (name, puppetClass, size, region, basedn, ldap, secret, subnet, sgroup)

一切都运行得很好。

票数 2
EN

Stack Overflow用户

发布于 2012-06-12 00:37:09

您正在向execute方法传递一组关键字参数,并且只有最后一个值被视为字符串插值的目标:

代码语言:javascript
复制
sgroup='%s' %(name, puppetClass
        , size, region, basedn, ldap, secret, subnet, sgroup))

这里不需要使用字符串插值;只需将所有参数传递给execute方法:

代码语言:javascript
复制
execute(deploy_ec2_ami, name=name, puppetClass=puppetClass, size=size, region=region, basedn=basedn, ldap=ldap, secret=secret, subnet=subnet, sgroup=sgroup)
票数 0
EN

Stack Overflow用户

发布于 2012-06-13 17:48:39

从一线开始

代码语言:javascript
复制
sgroup='%s' %(name, puppetClass, size, region, basedn, ldap, secret, subnet, sgroup)

字符串插值只适用于一个字符串,而不是所有参数。我是说

代码语言:javascript
复制
'%s %s' % (arg1, arg2)

但如果你试着

代码语言:javascript
复制
'%s' % (arg1, arg2) 

没有arg2的空间

如果你想继续做字符串插值,我建议这样做:

代码语言:javascript
复制
execute(deploy_ec2_ami, name='%s' % name, puppetClass='%s' % puppetClass, size='%s' % size, region='%s' % region, and so on

由于您没有更改参数中的任何内容,因此我肯定会选择Brian solution

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10984044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档