global name not defined
Paul McGuire
ptmcg at austin.rr._bogus_.com
Mon May 22 19:11:35 EDT 2006
"NetKev" <kevin at netkev.com> wrote in message
news:1148336761.776348.260450 at j33g2000cwa.googlegroups.com...
> I added a function 'warn_Admin' and defined it just before another
> function 'process_log'. 'process_log' calls this warn_Admin' function.
> However, when it gets called i get the following error every time:
> ---
> Traceback (most recent call last):
> File "/usr/bin/denyhosts.py", line 202, in ?
> first_time, noemail, daemon)
> File "/usr/lib/python2.3/site-packages/DenyHosts/deny_hosts.py", line
> 86, in __init__
> last_offset)
> File "/usr/lib/python2.3/site-packages/DenyHosts/daemon.py", line 74,
> in createDaemon
> apply(func, args)
> File "/usr/lib/python2.3/site-packages/DenyHosts/deny_hosts.py", line
> 137, in runDaemon
> purge_time, purge_sleep_ratio)
> File "/usr/lib/python2.3/site-packages/DenyHosts/deny_hosts.py", line
> 178, in daemonLoop
> last_offset = self.process_log(logfile, last_offset)
> File "/usr/lib/python2.3/site-packages/DenyHosts/deny_hosts.py", line
> 380, in process_log
> [warn_Admin(ip) for ip in new_denied_hosts]
> NameError: global name 'warn_Admin' is not defined
> --
> If I take the two functions out of their current environment and store
> them in test file and run it, it doesn't complain. I'm new to python
> so I'm guessing there is some weird scope rule I am missing. I did try
> 'self.warn_Admin(ip)' just to be safe but then I got a 'too many
> arguments' error?
>
> I'm lost :)
>
> the added function plus the header of the existing function(its too
> large):
> ------------
> def warn_Admin(warn_ip):
> SENDMAIL = "/usr/sbin/sendmail" # sendmail location
> p = os.popen("%s -t" % SENDMAIL, "w")
> p.write("To: kevin at netkev.com\n")
> p.write("Subject: test from denyhosts\n")
> p.write("\n") # blank line separating headers from body
> p.write("Some text\n")
> p.write(warn_ip)
> sts = p.close()
> if sts != 0:
> info("Sendmail exit status: %s", sts)
> return sts
>
>
> def process_log(self, logfile, offset):
> -------------
>
> the call to warn_Admin from process_log:
> ---
> if new_denied_hosts:
> info("new denied hosts: %s", str(new_denied_hosts))
> #[info(ip) for ip in new_denied_hosts]
> [warn_Admin(ip) for ip in new_denied_hosts]
> else:
> debug("no new denied hosts")
>
> -kevin
>
Sounds like warn_Admin is defined within a class.
a. could not resolve name when call was not qualified with "self."
b. when called as "self.warn_Admin", name was resolved, but got "too many
arguments" - this is because there was no explicit self argument in the
definition of warn_Admin.
It doesn't look like warn_Admin needs to be in the class. Move warn_Admin
to module-level scope, outside of the class containing process_log, and see
if things work better.
-- Paul
-- Paul
More information about the Python-list
mailing list