2012-06-11 2 views
1

У меня есть следующие ткани задача:Ткань «TypeError: не все аргументы преобразуются во строке форматирования»

@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)) 

Однако, когда я запускаю команду:

fab deploy_west_ec2_ami:test,java 

Я получаю следующее TraceBack:

  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 задачи, как так:

deploy_ec2_ami:test,java,m1.small,us-west-1,'dc\=test\,dc\=net',ldap-01,secret,subnet-d43b8abd,sg-926578fe 

Это прекрасно работает

ответ

2

Ok проблема была при использовании выполнения необходимо определить хост =. Моя другая ФАБ задача не нуждается в хост =, так что я просто положить в регулярном питона:

deploy_ec2_ami (name, puppetClass, size, region, basedn, ldap, secret, subnet, sgroup) 

И все это работало нормально.

0

Вы передаете в наборе ключевых аргументов методу execute, и только последнее значение считается целью для интерполяции струн:

sgroup='%s' %(name, puppetClass 
     , size, region, basedn, ldap, secret, subnet, sgroup)) 

Здесь нет необходимости использовать интерполяцию строк; просто передать все аргументы по методу execute:

execute(deploy_ec2_ami, name=name, puppetClass=puppetClass, size=size, region=region, basedn=basedn, ldap=ldap, secret=secret, subnet=subnet, sgroup=sgroup) 
0

От линии

sgroup='%s' %(name, puppetClass, size, region, basedn, ldap, secret, subnet, sgroup) 

Строка интерполяции работает для одной строки, а не для всех аргументов. Я имею в виду

'%s %s' % (arg1, arg2) 

, но если вы пытаетесь

'%s' % (arg1, arg2) 

там нет места для arg2

Если вы хотите продолжать делать интерполяцию строки я предлагаю сделать это:

execute(deploy_ec2_ami, name='%s' % name, puppetClass='%s' % puppetClass, size='%s' % size, region='%s' % region, and so on 

Поскольку вы ничего не меняете в параметрах, я определенно займусь решением Брайана