chase pettet wrote:
I am trying to write a script to work our LVS implementation. I want to be
able to have user do something like this "./script SITE SERVER" and have
the script look up the ip value of the site on that server and issue the
command to pull the status from LVS. I am almost there but for some reason
when I try to pass the site parameter dynamically (the name of the
dictionary) I keep getting errors about value type. I have two example that
work where the dictionary name is hard coded to to speak in the script, and
the value I want to pull is dynamic using sys.argv[1], and one where I'm
trying to pass the dictionary name and it does not work. I tried to slim
thse examples down, so hopefully they are helpful:
----<snip first two versions>-----
Not working...
./script.py t site
#!/usr/bin/env python
site = {"l":"10.1.1.1", "t":"10.1.1.2", "x":"10.1.1.3", "s1":"10.1.1.4",
"s2":"10.1.1.5", "s3":"10.1.1.6"}
def runBash(cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out = p.stdout.read().strip()
return out
class LVS_Site:
def show(self, site):
showsite = "ipvsadm -L -t %s:443" % (site)
showsiteresult = runBash(showsite)
return showsiteresult
a = LVS_Site()
z = sys.argv[2]
b = b["%s" % (sys.argv[1])]
c = a.show(b)
print ""
print ""
print ""
print c
Error:
Traceback (most recent call last):
File "./python2.py", line 22, in ?
b = z["%s" % (sys.argv[1])]
TypeError: string indices must be integers
I don't understand why the third one does not work. Thanks for any help!
You didn't post the exact code, as the line that gives the error is
quoted differently than it is. I suspect that the error message shows
the version you actually tested.
a = LVS_Site()
z = sys.argv[2]
at this point, z is a string, containing the characters
"site"
b = z["%s" % (sys.argv[1])]
at this point, sys.argv[1] is a string, containing the
character "t"
So "s" % "t" is a string, containing the character "t"
So you're trying to evaluate
"site"["t"]
And thus the error. Strings can be indexed only by integers, not by
characters.
It appears you're confusing the variable site with the string "site".
The former is a dictionary, the latter is a string.
Now, you could lookup that string in the current global namespace, and
get the dictionary with that name. Something like (untested):
b = globals().get(z, None) [ "%s" % (sys.argv[1])]
But this is pretty dangerous territory. Perhaps if you tell us what
you're actually trying to achieve, we might be able to help. For
example, you might have a limited list of dictionaries, and want the
user to be able to choose among them by keyword.
site_HQ = {"l":"10.1.1.1", "t":"10.1.1.2", "x":"10.1.1.3", "s1":"10.1.1.4",
"s2":"10.1.1.5", "s3":"10.1.1.6"}
site_Alternate = {"l":"10.1.1.1", "t":"10.1.1.2", "x":"10.1.1.3",
"s1":"10.1.1.4",
"s2":"10.1.1.5", "s3":"10.1.1.6"}
site_desperate = {"l":"10.1.1.1", "t":"10.1.1.2", "x":"10.1.1.3",
"s1":"10.1.1.4",
"s2":"10.1.1.5", "s3":"10.1.1.6"}
sitelist = {"HQ":site_HQ, "Alternate", site_Alternate,
"desperate":site_desperate}
b = sitelist[sys.argv[2]] ["%s" % (sys.argv[1])]
DaveA
_______________________________________________
Tutor maillist - Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor