On 3/31/11 8:48 PM, Vincent Ren wrote:
Hey, everyone, I'm trying to use ipython recently. It's very nice, however, when I run this(from Programming Python 3rd) in ipython, I'll get a NameError:In [1]: import settime, timer, set In [2]: import profile In [3]: profile.run('timer.test(100, settime.setops, set.Set)') --------------------------------------------------------------------------- NameError Traceback (most recent call last) /home/vincent/hacking/python/<ipython console> in<module>() /usr/lib/python2.6/profile.pyc in run(statement, filename, sort) 68 prof = Profile() 69 try: ---> 70 prof = prof.run(statement) 71 except SystemExit: 72 pass /usr/lib/python2.6/profile.pyc in run(self, cmd) 454 import __main__ 455 dict = __main__.__dict__ --> 456 return self.runctx(cmd, dict, dict) 457 458 def runctx(self, cmd, globals, locals): /usr/lib/python2.6/profile.pyc in runctx(self, cmd, globals, locals) 460 sys.setprofile(self.dispatcher) 461 try: --> 462 exec cmd in globals, locals 463 finally: 464 sys.setprofile(None) /usr/lib/pymodules/python2.6/IPython/FakeModule.pyc in<module>() NameError: name 'timer' is not defined
In order to support pickling and its %run feature, IPython makes a fake __main__ module. It looks like profile.run() explicitly imports __main__ to try to run the statement there. Honestly, it's been a thorn in our side for a long time, but it's a confusing bit of the code. Most interactive shells actually written in Python are going to have a similar need to do a workaround, since they already have a __main__. The regular shell is not written in Python, so it has no problem.
You will want to ask on the IPython list for future IPython questions. http://mail.scipy.org/mailman/listinfo/ipython-user -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco -- http://mail.python.org/mailman/listinfo/python-list
