##// END OF EJS Templates
Replace FakeModule with ModuleType in InteractiveShell
Thomas Kluyver -
Show More
@@ -47,7 +47,6 b' from IPython.core.displayhook import DisplayHook'
47 47 from IPython.core.displaypub import DisplayPublisher
48 48 from IPython.core.error import UsageError
49 49 from IPython.core.extensions import ExtensionManager
50 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
51 50 from IPython.core.formatters import DisplayFormatter
52 51 from IPython.core.history import HistoryManager
53 52 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
@@ -826,15 +825,18 b' class InteractiveShell(SingletonConfigurable):'
826 825 # Things related to the "main" module
827 826 #-------------------------------------------------------------------------
828 827
829 def new_main_mod(self, filename):
828 def new_main_mod(self, filename, modname):
830 829 """Return a new 'main' module object for user code execution.
831 830
832 831 ``filename`` should be the path of the script which will be run in the
833 832 module. Requests with the same filename will get the same module, with
834 833 its namespace cleared.
835 834
835 ``modname`` should be the module name - normally either '__main__' or
836 the basename of the file without the extension.
837
836 838 When scripts are executed via %run, we must keep a reference to their
837 __main__ module (a FakeModule instance) around so that Python doesn't
839 __main__ module around so that Python doesn't
838 840 clear it, rendering references to module globals useless.
839 841
840 842 This method keeps said reference in a private dict, keyed by the
@@ -847,9 +849,16 b' class InteractiveShell(SingletonConfigurable):'
847 849 try:
848 850 main_mod = self._main_mod_cache[filename]
849 851 except KeyError:
850 main_mod = self._main_mod_cache[filename] = FakeModule()
852 main_mod = self._main_mod_cache[filename] = types.ModuleType(modname,
853 doc="Module created for script run in IPython")
851 854 else:
852 init_fakemod_dict(main_mod)
855 main_mod.__dict__.clear()
856 main_mod.__name__ = modname
857
858 main_mod.__file__ = filename
859 # It seems pydoc (and perhaps others) needs any module instance to
860 # implement a __nonzero__ method
861 main_mod.__nonzero__ = lambda : True
853 862
854 863 return main_mod
855 864
@@ -863,7 +872,7 b' class InteractiveShell(SingletonConfigurable):'
863 872
864 873 In [15]: import IPython
865 874
866 In [16]: m = _ip.new_main_mod(IPython.__file__)
875 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
867 876
868 877 In [17]: len(_ip._main_mod_cache) > 0
869 878 Out[17]: True
@@ -550,6 +550,11 b' python-profiler package from non-free.""")'
550 550 __name__save = self.shell.user_ns['__name__']
551 551 prog_ns['__name__'] = '__main__'
552 552 main_mod = self.shell.user_module
553
554 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
555 # set the __file__ global in the script's namespace
556 # TK: Is this necessary in interactive mode?
557 prog_ns['__file__'] = filename
553 558 else:
554 559 # Run in a fresh, empty namespace
555 560 if 'n' in opts:
@@ -560,13 +565,8 b' python-profiler package from non-free.""")'
560 565 # The shell MUST hold a reference to prog_ns so after %run
561 566 # exits, the python deletion mechanism doesn't zero it out
562 567 # (leaving dangling references). See interactiveshell for details
563 main_mod = self.shell.new_main_mod(filename)
568 main_mod = self.shell.new_main_mod(filename, name)
564 569 prog_ns = main_mod.__dict__
565 prog_ns['__name__'] = name
566
567 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
568 # set the __file__ global in the script's namespace
569 prog_ns['__file__'] = filename
570 570
571 571 # pickle fix. See interactiveshell for an explanation. But we need to
572 572 # make sure that, if we overwrite __main__, we replace it at the end
General Comments 0
You need to be logged in to leave comments. Login now