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