##// END OF EJS Templates
Merge with upstream.
gvaroquaux -
r1474:a0ad5ffc merge
parent child Browse files
Show More
@@ -510,7 +510,7 b' class MatplotlibShellBase:'
510 Given Python's MRO, this should be used as the FIRST class in the
510 Given Python's MRO, this should be used as the FIRST class in the
511 inheritance hierarchy, so that it overrides the relevant methods."""
511 inheritance hierarchy, so that it overrides the relevant methods."""
512
512
513 def _matplotlib_config(self,name,user_ns):
513 def _matplotlib_config(self,name,user_ns,user_global_ns=None):
514 """Return items needed to setup the user's shell with matplotlib"""
514 """Return items needed to setup the user's shell with matplotlib"""
515
515
516 # Initialize matplotlib to interactive mode always
516 # Initialize matplotlib to interactive mode always
@@ -564,7 +564,8 b' class MatplotlibShellBase:'
564 self.pylab.draw_if_interactive = flag_calls(self.pylab.draw_if_interactive)
564 self.pylab.draw_if_interactive = flag_calls(self.pylab.draw_if_interactive)
565
565
566 # Build a user namespace initialized with matplotlib/matlab features.
566 # Build a user namespace initialized with matplotlib/matlab features.
567 user_ns = IPython.ipapi.make_user_ns(user_ns)
567 user_ns, user_global_ns = IPython.ipapi.make_user_namespaces(user_ns,
568 user_global_ns)
568
569
569 # Import numpy as np/pyplot as plt are conventions we're trying to
570 # Import numpy as np/pyplot as plt are conventions we're trying to
570 # somewhat standardize on. Making them available to users by default
571 # somewhat standardize on. Making them available to users by default
@@ -584,7 +585,7 b' class MatplotlibShellBase:'
584 Welcome to pylab, a matplotlib-based Python environment.
585 Welcome to pylab, a matplotlib-based Python environment.
585 For more information, type 'help(pylab)'.
586 For more information, type 'help(pylab)'.
586 """
587 """
587 return user_ns,b
588 return user_ns,user_global_ns,b
588
589
589 def mplot_exec(self,fname,*where,**kw):
590 def mplot_exec(self,fname,*where,**kw):
590 """Execute a matplotlib script.
591 """Execute a matplotlib script.
@@ -624,7 +625,7 b' class MatplotlibShell(MatplotlibShellBase,InteractiveShell):'
624
625
625 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
626 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
626 user_ns=None,user_global_ns=None,**kw):
627 user_ns=None,user_global_ns=None,**kw):
627 user_ns,b2 = self._matplotlib_config(name,user_ns)
628 user_ns,user_global_ns,b2 = self._matplotlib_config(name,user_ns,user_global_ns)
628 InteractiveShell.__init__(self,name,usage,rc,user_ns,user_global_ns,
629 InteractiveShell.__init__(self,name,usage,rc,user_ns,user_global_ns,
629 banner2=b2,**kw)
630 banner2=b2,**kw)
630
631
@@ -567,17 +567,7 b' def make_user_ns(user_ns = None):'
567 classes in ipython.
567 classes in ipython.
568 """
568 """
569
569
570 if user_ns is None:
570 raise NotImplementedError
571 # Set __name__ to __main__ to better match the behavior of the
572 # normal interpreter.
573 user_ns = {'__name__' :'__main__',
574 '__builtins__' : __builtin__,
575 }
576 else:
577 user_ns.setdefault('__name__','__main__')
578 user_ns.setdefault('__builtins__',__builtin__)
579
580 return user_ns
581
571
582
572
583 def make_user_global_ns(ns = None):
573 def make_user_global_ns(ns = None):
@@ -587,8 +577,56 b' def make_user_global_ns(ns = None):'
587 embedded applications, where there is a distinction between the user's
577 embedded applications, where there is a distinction between the user's
588 interactive namespace and the global one where ipython is running."""
578 interactive namespace and the global one where ipython is running."""
589
579
590 if ns is None: ns = {}
580 raise NotImplementedError
591 return ns
581
582 # Record the true objects in order to be able to test if the user has overridden
583 # these API functions.
584 _make_user_ns = make_user_ns
585 _make_user_global_ns = make_user_global_ns
586
587
588 def make_user_namespaces(user_ns = None,user_global_ns = None):
589 """Return a valid local and global user interactive namespaces.
590
591 This builds a dict with the minimal information needed to operate as a
592 valid IPython user namespace, which you can pass to the various embedding
593 classes in ipython. The default implementation returns the same dict for
594 both the locals and the globals to allow functions to refer to variables in
595 the namespace. Customized implementations can return different dicts. The
596 locals dictionary can actually be anything following the basic mapping
597 protocol of a dict, but the globals dict must be a true dict, not even
598 a subclass. It is recommended that any custom object for the locals
599 namespace synchronize with the globals dict somehow.
600
601 Raises TypeError if the provided globals namespace is not a true dict.
602 """
603
604 if user_ns is None:
605 if make_user_ns is not _make_user_ns:
606 # Old API overridden.
607 # FIXME: Issue DeprecationWarning, or just let the old API live on?
608 user_ns = make_user_ns(user_ns)
609 else:
610 # Set __name__ to __main__ to better match the behavior of the
611 # normal interpreter.
612 user_ns = {'__name__' :'__main__',
613 '__builtins__' : __builtin__,
614 }
615 else:
616 user_ns.setdefault('__name__','__main__')
617 user_ns.setdefault('__builtins__',__builtin__)
618
619 if user_global_ns is None:
620 if make_user_global_ns is not _make_user_global_ns:
621 # Old API overridden.
622 user_global_ns = make_user_global_ns(user_global_ns)
623 else:
624 user_global_ns = user_ns
625 if type(user_global_ns) is not dict:
626 raise TypeError("user_global_ns must be a true dict; got %r"
627 % type(user_global_ns))
628
629 return user_ns, user_global_ns
592
630
593
631
594 def make_session(user_ns = None, shellclass = None):
632 def make_session(user_ns = None, shellclass = None):
@@ -207,7 +207,7 b' class InteractiveShell(object,Magic):'
207 isthreaded = False
207 isthreaded = False
208
208
209 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
209 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
210 user_ns = None,user_global_ns=None,banner2='',
210 user_ns=None,user_global_ns=None,banner2='',
211 custom_exceptions=((),None),embedded=False):
211 custom_exceptions=((),None),embedded=False):
212
212
213 # log system
213 # log system
@@ -254,7 +254,8 b' class InteractiveShell(object,Magic):'
254 # the locals argument. But we do carry a user_global_ns namespace
254 # the locals argument. But we do carry a user_global_ns namespace
255 # given as the exec 'globals' argument, This is useful in embedding
255 # given as the exec 'globals' argument, This is useful in embedding
256 # situations where the ipython shell opens in a context where the
256 # situations where the ipython shell opens in a context where the
257 # distinction between locals and globals is meaningful.
257 # distinction between locals and globals is meaningful. For
258 # non-embedded contexts, it is just the same object as the user_ns dict.
258
259
259 # FIXME. For some strange reason, __builtins__ is showing up at user
260 # FIXME. For some strange reason, __builtins__ is showing up at user
260 # level as a dict instead of a module. This is a manual fix, but I
261 # level as a dict instead of a module. This is a manual fix, but I
@@ -284,14 +285,12 b' class InteractiveShell(object,Magic):'
284 # These routines return properly built dicts as needed by the rest of
285 # These routines return properly built dicts as needed by the rest of
285 # the code, and can also be used by extension writers to generate
286 # the code, and can also be used by extension writers to generate
286 # properly initialized namespaces.
287 # properly initialized namespaces.
287 user_ns = IPython.ipapi.make_user_ns(user_ns)
288 user_ns, user_global_ns = IPython.ipapi.make_user_namespaces(user_ns,
288 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
289 user_global_ns)
289
290
290 # Assign namespaces
291 # Assign namespaces
291 # This is the namespace where all normal user variables live
292 # This is the namespace where all normal user variables live
292 self.user_ns = user_ns
293 self.user_ns = user_ns
293 # Embedded instances require a separate namespace for globals.
294 # Normally this one is unused by non-embedded instances.
295 self.user_global_ns = user_global_ns
294 self.user_global_ns = user_global_ns
296 # A namespace to keep track of internal data structures to prevent
295 # A namespace to keep track of internal data structures to prevent
297 # them from cluttering user-visible stuff. Will be updated later
296 # them from cluttering user-visible stuff. Will be updated later
@@ -2071,16 +2070,7 b' want to merge them back into the new files.""" % locals()'
2071 try:
2070 try:
2072 try:
2071 try:
2073 self.hooks.pre_runcode_hook()
2072 self.hooks.pre_runcode_hook()
2074 # Embedded instances require separate global/local namespaces
2073 exec code_obj in self.user_global_ns, self.user_ns
2075 # so they can see both the surrounding (local) namespace and
2076 # the module-level globals when called inside another function.
2077 if self.embedded:
2078 exec code_obj in self.user_global_ns, self.user_ns
2079 # Normal (non-embedded) instances should only have a single
2080 # namespace for user code execution, otherwise functions won't
2081 # see interactive top-level globals.
2082 else:
2083 exec code_obj in self.user_ns
2084 finally:
2074 finally:
2085 # Reset our crash handler in place
2075 # Reset our crash handler in place
2086 sys.excepthook = old_excepthook
2076 sys.excepthook = old_excepthook
General Comments 0
You need to be logged in to leave comments. Login now