##// END OF EJS Templates
Fixes for handling of global variables in embedded ipython instances (I ran...
fperez -
Show More
@@ -4,7 +4,7 b''
4 4 All the matplotlib support code was co-developed with John Hunter,
5 5 matplotlib's author.
6 6
7 $Id: Shell.py 882 2005-09-20 23:17:41Z fperez $"""
7 $Id: Shell.py 921 2005-11-13 06:51:34Z fperez $"""
8 8
9 9 #*****************************************************************************
10 10 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
@@ -132,7 +132,6 b' class IPShellEmbed:'
132 132 #self.IP = make_IPython(argv,user_ns=__main__.__dict__)
133 133 self.IP = make_IPython(argv,rc_override=rc_override,embedded=True)
134 134
135 self.IP.name_space_init()
136 135 # mark this as an embedded instance so we know if we get a crash
137 136 # post-mortem
138 137 self.IP.rc.embedded = 1
@@ -613,9 +612,9 b' class IPShellGTK(threading.Thread):'
613 612
614 613 if self.gtk.pygtk_version >= (2,4,0):
615 614 import gobject
616 gobject.timeout_add(self.TIMEOUT, self.on_timer)
615 gobject.idle_add(self.on_timer)
617 616 else:
618 self.gtk.timeout_add(self.TIMEOUT, self.on_timer)
617 self.gtk.idle_add(self.on_timer)
619 618
620 619 if sys.platform != 'win32':
621 620 try:
@@ -6,7 +6,7 b' Requires Python 2.1 or newer.'
6 6
7 7 This file contains all the classes and helper functions specific to IPython.
8 8
9 $Id: iplib.py 908 2005-09-26 16:05:48Z fperez $
9 $Id: iplib.py 921 2005-11-13 06:51:34Z fperez $
10 10 """
11 11
12 12 #*****************************************************************************
@@ -49,6 +49,7 b" import UserList # don't subclass list so this works with Python2.1"
49 49 from pprint import pprint, pformat
50 50 import cPickle as pickle
51 51 import traceback
52 from codeop import CommandCompiler
52 53
53 54 # IPython's own modules
54 55 import IPython
@@ -506,7 +507,7 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
506 507 """An enhanced console for Python."""
507 508
508 509 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
509 user_ns = None,banner2='',
510 user_ns = None,user_global_ns=None,banner2='',
510 511 custom_exceptions=((),None)):
511 512
512 513 # Put a reference to self in builtins so that any form of embedded or
@@ -531,7 +532,21 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
531 532 __builtin__.exit += _exit
532 533 __builtin__.quit += _exit
533 534
534 # Create the namespace where the user will operate:
535 # compiler command
536 self.compile = CommandCompiler()
537
538 # User input buffer
539 self.buffer = []
540
541 # Default name given in compilation of code
542 self.filename = '<ipython console>'
543
544 # Create the namespace where the user will operate. user_ns is
545 # normally the only one used, and it is passed to the exec calls as
546 # the locals argument. But we do carry a user_global_ns namespace
547 # given as the exec 'globals' argument, This is useful in embedding
548 # situations where the ipython shell opens in a context where the
549 # distinction between locals and globals is meaningful.
535 550
536 551 # FIXME. For some strange reason, __builtins__ is showing up at user
537 552 # level as a dict instead of a module. This is a manual fix, but I
@@ -562,11 +577,16 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
562 577 if user_ns is None:
563 578 # Set __name__ to __main__ to better match the behavior of the
564 579 # normal interpreter.
565 self.user_ns = {'__name__' :'__main__',
566 '__builtins__' : __builtin__,
567 }
568 else:
569 self.user_ns = user_ns
580 user_ns = {'__name__' :'__main__',
581 '__builtins__' : __builtin__,
582 }
583
584 if user_global_ns is None:
585 user_global_ns = {}
586
587 # assign namespaces
588 self.user_ns = user_ns
589 self.user_global_ns = user_global_ns
570 590
571 591 # The user namespace MUST have a pointer to the shell itself.
572 592 self.user_ns[name] = self
@@ -611,8 +631,7 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
611 631 no_alias[key] = 1
612 632 no_alias.update(__builtin__.__dict__)
613 633 self.no_alias = no_alias
614
615
634
616 635 # make global variables for user access to these
617 636 self.user_ns['_ih'] = self.input_hist
618 637 self.user_ns['_oh'] = self.output_hist
@@ -654,7 +673,6 b' class InteractiveShell(code.InteractiveConsole, Logger, Magic):'
654 673 }
655 674
656 675 # class initializations
657 code.InteractiveConsole.__init__(self,locals = self.user_ns)
658 676 Logger.__init__(self,log_ns = self.user_ns)
659 677 Magic.__init__(self,self)
660 678
@@ -1303,18 +1321,12 b' want to merge them back into the new files.""" % locals()'
1303 1321 if len(self.inputcache) >= self.CACHELENGTH:
1304 1322 self.inputcache.pop() # This not :-)
1305 1323
1306 def name_space_init(self):
1307 """Create local namespace."""
1308 # We want this to be a method to facilitate embedded initialization.
1309 code.InteractiveConsole.__init__(self,self.user_ns)
1310
1311 1324 def mainloop(self,banner=None):
1312 1325 """Creates the local namespace and starts the mainloop.
1313 1326
1314 1327 If an optional banner argument is given, it will override the
1315 1328 internally created default banner."""
1316 1329
1317 self.name_space_init()
1318 1330 if self.rc.c: # Emulate Python's -c option
1319 1331 self.exec_init_cmd()
1320 1332 if banner is None:
@@ -1355,12 +1367,6 b' want to merge them back into the new files.""" % locals()'
1355 1367 globals get overwritten). In the future this will be cleaned up, as
1356 1368 there is no fundamental reason why it can't work perfectly."""
1357 1369
1358 # Patch for global embedding to make sure that things don't overwrite
1359 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1360 # FIXME. Test this a bit more carefully (the if.. is new)
1361 if local_ns is None and global_ns is None:
1362 self.user_ns.update(__main__.__dict__)
1363
1364 1370 # Get locals and globals from caller
1365 1371 if local_ns is None or global_ns is None:
1366 1372 call_frame = sys._getframe(stack_depth).f_back
@@ -1371,12 +1377,16 b' want to merge them back into the new files.""" % locals()'
1371 1377 global_ns = call_frame.f_globals
1372 1378
1373 1379 # Update namespaces and fire up interpreter
1374 self.user_ns.update(local_ns)
1375 self.interact(header)
1380 self.user_ns = local_ns
1381 self.user_global_ns = global_ns
1382
1383 # Patch for global embedding to make sure that things don't overwrite
1384 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1385 # FIXME. Test this a bit more carefully (the if.. is new)
1386 if local_ns is None and global_ns is None:
1387 self.user_global_ns.update(__main__.__dict__)
1376 1388
1377 # Remove locals from namespace
1378 for k in local_ns:
1379 del self.user_ns[k]
1389 self.interact(header)
1380 1390
1381 1391 def interact(self, banner=None):
1382 1392 """Closely emulate the interactive Python console.
@@ -1619,7 +1629,7 b' want to merge them back into the new files.""" % locals()'
1619 1629 outflag = 1 # happens in more places, so it's easier as default
1620 1630 try:
1621 1631 try:
1622 exec code_obj in self.locals
1632 exec code_obj in self.user_global_ns, self.user_ns
1623 1633 finally:
1624 1634 # Reset our crash handler in place
1625 1635 sys.excepthook = old_excepthook
@@ -1,3 +1,16 b''
1 2005-11-12 <Fernando.Perez@colorado.edu>
2
3 * IPython/iplib.py (embed_mainloop): Fix handling of globals for
4 embedded instances. I added a user_global_ns attribute to the
5 InteractiveShell class to handle this.
6
7 2005-10-31 Fernando Perez <Fernando.Perez@colorado.edu>
8
9 * IPython/Shell.py (IPShellGTK.mainloop): Change timeout_add to
10 idle_add, which fixes horrible keyboard lag problems under gtk 2.6
11 (reported under win32, but may happen also in other platforms).
12 Bug report and fix courtesy of Sean Moore <smm-AT-logic.bm>
13
1 14 2005-10-15 Fernando Perez <Fernando.Perez@colorado.edu>
2 15
3 16 * IPython/Magic.py (magic_psearch): new support for wildcard
General Comments 0
You need to be logged in to leave comments. Login now