Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Profiler throws NameError on any function (http://www.velocityreviews.com/forums/t677326-profiler-throws-nameerror-on-any-function.html)

Philipp Lies 03-26-2009 02:42 PM

Profiler throws NameError on any function
 
Hi,

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?

I'm using python 2.5.2 on ubuntu 8.10.

Cheers

Phil

Gabriel Genellina 03-28-2009 07:58 AM

Re: Profiler throws NameError on any function
 
En Thu, 26 Mar 2009 11:42:57 -0300, Philipp Lies
<philipp.lies@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



All times are GMT. The time now is 04:34 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.