Profiler throws NameError on any function

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sat Mar 28 03:58:06 EDT 2009


En Thu, 26 Mar 2009 11:42:57 -0300, Philipp Lies  
<philipp.lies at googlemail.com> escribió:

> I'm trying to run the python profiler on some code but I always get
> NameErrors, even for the simplest case taken from the docs:
> import profile
> def foo():
>     a = 5
> def prof():
>     profile.run('foo()')
>
> When I run prof() I get the following output:
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "dummy.py", line 11, in prof
>     profile.run('foo()')
>   File "/usr/lib/python2.5/profile.py", line 70, in run
>     prof = prof.run(statement)
>   File "/usr/lib/python2.5/profile.py", line 456, in run
>     return self.runctx(cmd, dict, dict)
>   File "/usr/lib/python2.5/profile.py", line 462, in runctx
>     exec cmd in globals, locals
>   File "<string>", line 1, in <module>
> NameError: name 'foo' is not defined
> The very same error I get using cProfile.
>
> It works when I call
> profile.runctx('foo()', globals(), locals())
> which should be the same as run('foo()'), shouldn't it?

Not exactly -- profile.run doesn't "extract" globals and locals from the  
calling frame, as you appear to assume. It simply uses the namespace from  
the __main__ module:

(profile.c, class Profile):
     def run(self, cmd):
         import __main__
         dict = __main__.__dict__
         return self.runctx(cmd, dict, dict)

This works when the called function is actually in the __main__ module.  
 From your traceback, you're first *importing* dummy.py and then *calling*  
prof(). Call prof() directly inside dummy.py and it should work. That is,  
add this line at the end:
prof()
and invoke it using: python dummpy.py

-- 
Gabriel Genellina




More information about the Python-list mailing list