On 01/08/13 18:51, [email protected] wrote:

I'm trying to use dictionary key values as arguments being passed via
subprocess. The following is supposed to use argv arguments passed for the
target host, and direction to turn the ipmi interface up on or off. When I
run it I get an error about TypeError: format requires a mapping

You need to provide a dict to the form,at operator you are passing a string which (you hope!) represents one of your dicts.


script, targ, switch = argv

ren      = {'hostn':'ren.ipmi', 'usern':'Admin', 'passw':'p0w1r'}
stimpy   = {'hostn':'stimpy.ipmi', 'usern':'Admin', 'passw':'p0w1r'}
lrrr     = {'hostn':'lrrr.ipmi', 'usern':'ADMIN', 'passw':'p0w1r'}
kif      = {'hostn':'kif.ipmi', 'usern':'ADMIN', 'passw':'p0w1r'}
ndnd     = {'hostn':'ndnd.ipmi', 'usern':'ADMIN', 'passw':'p0w1r'}
zapp     = {'hostn':'zapp.ipmi', 'usern':'ADMIN', 'passw':'p0w1r'}

Rather than using named variables it would be better to make the hosts a dicty too keyed by host name:

hosts = { 'ren':{'hostn':'ren.ipmi',
                 'usern':'Admin',
                 'passw':'p0w1r'},
          'stimpy':{'hostn':'stimpy.ipmi',
                    'usern':'Admin',
                    'passw':'p0w1r'}
           # etc...
          'zapp':{'hostn':'zapp.ipmi',
                  'usern':'ADMIN',
                  'passw':'p0w1r'}
        }

Now you can pass the dict into the format with:

     turnOn = ['ipmitool', '-I', 'lan',
               '-U', '%(usern)s' % hosts[targ],
               '-P', '%(passw)s' % hosts[targ],
               '-H', '%(hostn)s' % hosts[targ],
               'chassis', 'power', 'on']

And while you are at it catch invalid host names by using a try/except block to catch KeyErrors

--
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/

_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to