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 |
|
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