views:

97

answers:

2
+1  Q: 

iPython demo mode

I'm trying to use the iPython demo mode. I created a file called test.py containing:

print 1
print 2
print 3

and then launched iPython and did the following:

In [1]: from IPython.demo import LineDemo

In [2]: d = LineDemo('test.py')

In [3]: d()
********************* <test.py> block # 0 (5 remaining) *********************
p

********************************** output: **********************************
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/Users/tom/Library/Python/2.6/site-packages/ipython-0.10-py2.6.egg/IPython/demo.pyc in runlines(self, source)
    400         """Execute a string with one or more lines of code"""
    401 
--> 402         exec source in self.user_ns
    403 
    404     def __call__(self,index=None):

/Users/tom/tmp/<string> in <module>()
----> 1 
      2 
      3 
      4 
      5 

NameError: name 'p' is not defined

What is likely to be causing this error? Am I using LineDemo incorrectly?

+1  A: 

There seems to be a bug in IPython. In demo.py in LineDemo.reload, the line that says:

src_b           = [l for l in self.fobj.readline() if l.strip()]

should say:

src_b           = [l for l in self.fobj.readlines() if l.strip()]

Currently it's trying to execute all the letters in the first line instead of all the lines in the file.

Edit: Bug reported.

interjay
Thanks - I'll submit a bug report
astrofrog
@Morgoth I just did: https://bugs.launchpad.net/ipython/+bug/518982
interjay
Oops, just saw that you must have submitted a bug report too
astrofrog
Ok, I marked my bug report as a duplicate of yours
astrofrog
A: 

It works ok in IPython 0.9.1
Which version do you have?

In [1]: from IPython.demo import LineDemo

In [2]: d = LineDemo('test.py')

In [3]: d()
********************* <test.py> block # 0 (2 remaining) *********************
print 1
********************************** output: **********************************
1

In [4]: d()
********************* <test.py> block # 1 (1 remaining) *********************
print 2
********************************** output: **********************************
2

In [5]: d()
********************* <test.py> block # 2 (0 remaining) *********************
print 3
********************************** output: **********************************
3

******************************** END OF DEMO ********************************
******************** Use reset() if you want to rerun it. ********************
gnibbler
The bug is from this change: http://bazaar.launchpad.net/~ipython-dev/ipython/trunk/revision/1160.3.1 , so it's in 0.10 only.
interjay
I'm using 0.10 - the bug must have been introduced in that version
astrofrog