def pylab(self, line=''): """Load numpy and matplotlib to work interactively. This function lets you activate pylab (matplotlib, numpy and interactive support) at any point during an IPython session. It will import at the top level numpy as np, pyplot as plt, matplotlib, pylab and mlab, as well as all names from numpy and pylab. See the %matplotlib magic for more details. """ args = magic_arguments.parse_argstring(self.pylab, line) if args.no_import_all is None: # get default from Application if Application.initialized(): app = Application.instance() try: import_all = app.pylab_import_all except AttributeError: import_all = True else: # nothing specified, no app - default True import_all = True else: # invert no-import flag import_all = not args.no_import_all gui, backend, clobbered = self.shell.enable_pylab(args.gui, import_all=import_all) self._show_matplotlib_backend(args.gui, backend) if clobbered: warn("pylab import has clobbered these variables: %s" % clobbered + "\n`%pylab --no-import-all` prevents importing * from pylab and numpy" )
def __init__(self, profile="default", hist_file=u"", config=None, **traits): """Create a new history accessor. Parameters ---------- profile : str The name of the profile from which to open history. hist_file : str Path to an SQLite history database stored by IPython. If specified, hist_file overrides profile. config : Config object. hist_file can also be set through this. """ # We need a pointer back to the shell for various tasks. super(HistoryAccessor, self).__init__(config=config, **traits) # defer setting hist_file from kwarg until after init, # otherwise the default kwarg value would clobber any value # set by config if hist_file: self.hist_file = hist_file if self.hist_file == u"": # No one has set the hist_file, yet. self.hist_file = self._get_hist_file_name(profile) if sqlite3 is None and self.enabled: warn("IPython History requires SQLite, your history will not be saved") self.enabled = False self.init_db()
def update(self, arg): # print '***cache_count', self.cache_count # dbg if len(self.user_ns["_oh"]) >= self.cache_size and self.do_full_cache: warn( "Output cache limit (currently " + repr(self.cache_size) + " entries) hit.\n" "Flushing cache and resetting history counter...\n" "The only history variables available will be _,__,___ and _1\n" "with the current result." ) self.flush() # Don't overwrite '_' and friends if '_' is in builtins (otherwise # we cause buggy behavior for things like gettext). if "_" not in builtins.__dict__: self.___ = self.__ self.__ = self._ self._ = arg self.user_ns.update({"_": self._, "__": self.__, "___": self.___}) # hackish access to top-level namespace to create _1,_2... dynamically to_main = {} if self.do_full_cache: new_result = "_" + repr(self.prompt_count) to_main[new_result] = arg self.user_ns.update(to_main) self.user_ns["_oh"][self.prompt_count] = arg
def parse_command_line(self, argv=None): """override to allow old '-pylab' flag with deprecation warning""" argv = sys.argv[1:] if argv is None else argv try: idx = argv.index('-pylab') except ValueError: # `-pylab` not given, proceed as normal pass else: # deprecated `-pylab` given, # warn and transform into current syntax argv = list(argv) # copy, don't clobber warn.warn("`-pylab` flag has been deprecated.\n" " Use `--pylab` instead, or `pylab=foo` to specify a backend.") sub = '--pylab' if len(argv) > idx+1: # check for gui arg, as in '-pylab qt' gui = argv[idx+1] if gui in ('wx', 'qt', 'qt4', 'gtk', 'auto'): sub = 'pylab='+gui argv.pop(idx+1) argv[idx] = sub return super(TerminalIPythonApp, self).parse_command_line(argv)
def check_for_old_config(ipython_dir=None): """Check for old config files, and present a warning if they exist. A link to the docs of the new config is included in the message. This should mitigate confusion with the transition to the new config system in 0.11. """ if ipython_dir is None: ipython_dir = get_ipython_dir() old_configs = ['ipy_user_conf.py', 'ipythonrc', 'ipython_config.py'] warned = False for cfg in old_configs: f = os.path.join(ipython_dir, cfg) if os.path.exists(f): warned = True warn.warn("Found old IPython config file %r"%f) if warned: warn.warn(""" The IPython configuration system has changed as of 0.11, and these files will be ignored. See http://ipython.github.com/ipython-doc/dev/config for details on the new config system. To start configuring IPython, do `ipython profile create`, and edit `ipython_config.py` in <ipython_dir>/profile_default, adding `c.InteractiveShellApp.ignore_old_config=True`""")
def __init__(self): if ctypes is None: warn("IPython GUI event loop requires ctypes, %gui will not be available") return self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int) self._apps = {} self._reset()
def update(self,arg): #print '***cache_count', self.cache_count # dbg if len(self.user_ns['_oh']) >= self.cache_size and self.do_full_cache: warn('Output cache limit (currently '+ `self.cache_size`+' entries) hit.\n' 'Flushing cache and resetting history counter...\n' 'The only history variables available will be _,__,___ and _1\n' 'with the current result.') self.flush() # Don't overwrite '_' and friends if '_' is in __builtin__ (otherwise # we cause buggy behavior for things like gettext). if '_' not in __builtin__.__dict__: self.___ = self.__ self.__ = self._ self._ = arg self.user_ns.update({'_':self._,'__':self.__,'___':self.___}) # hackish access to top-level namespace to create _1,_2... dynamically to_main = {} if self.do_full_cache: new_result = '_'+`self.prompt_count` to_main[new_result] = arg self.user_ns.update(to_main) self.user_ns['_oh'][self.prompt_count] = arg
def warn_format_error(method, self, *args, **kwargs): """decorator for warning on failed format call""" try: return method(self, *args, **kwargs) except Exception as e: warn("Exception in %s formatter: %s" % (self.format_type, e)) return None
def import_fail_info(mod_name,fns=None): """Inform load failure for a module.""" if fns == None: warn("Loading of %s failed.\n" % (mod_name,)) else: warn("Loading of %s from %s failed.\n" % (fns,mod_name))
def expand_aliases(self, fn, rest): """Expand multiple levels of aliases: if: alias foo bar /tmp alias baz foo then: baz huhhahhei -> bar /tmp huhhahhei """ line = fn + " " + rest done = set() while 1: pre,_,fn,rest = split_user_input(line, shell_line_split) if fn in self.alias_table: if fn in done: warn("Cyclic alias definition, repeated '%s'" % fn) return "" done.add(fn) l2 = self.transform_alias(fn, rest) if l2 == line: break # ls -> ls -F should not recurse forever if l2.split(None,1)[0] == line.split(None,1)[0]: line = l2 break line=l2 else: break return line
def __init__(self, shell=None, cache_size=1000, **kwargs): super(DisplayHook, self).__init__(shell=shell, **kwargs) cache_size_min = 3 if cache_size <= 0: self.do_full_cache = 0 cache_size = 0 elif cache_size < cache_size_min: self.do_full_cache = 0 cache_size = 0 warn('caching was disabled (min value for cache size is %s).' % cache_size_min,level=3) else: self.do_full_cache = 1 self.cache_size = cache_size # we need a reference to the user-level namespace self.shell = shell self._,self.__,self.___ = '','','' # these are deliberately global: to_user_ns = {'_':self._,'__':self.__,'___':self.___} self.shell.user_ns.update(to_user_ns)
def check_for_old_config(ipython_dir=None): """Check for old config files, and present a warning if they exist. A link to the docs of the new config is included in the message. This should mitigate confusion with the transition to the new config system in 0.11. """ if ipython_dir is None: ipython_dir = get_ipython_dir() old_configs = ['ipy_user_conf.py', 'ipythonrc', 'ipython_config.py'] warned = False for cfg in old_configs: f = os.path.join(ipython_dir, cfg) if os.path.exists(f): if filehash(f) == old_config_md5.get(cfg, ''): os.unlink(f) else: warn.warn("Found old IPython config file %r (modified by user)"%f) warned = True if warned: warn.info(""" The IPython configuration system has changed as of 0.11, and these files will be ignored. See http://ipython.github.com/ipython-doc/dev/config for details of the new config system. To start configuring IPython, do `ipython profile create`, and edit `ipython_config.py` in <ipython_dir>/profile_default. If you need to leave the old config files in place for an older version of IPython and want to suppress this warning message, set `c.InteractiveShellApp.ignore_old_config=True` in the new config.""")
def refill_readline_hist(self): # Load the last 1000 lines from history self.readline.clear_history() stdin_encoding = sys.stdin.encoding or "utf-8" last_cell = u"" for _, _, cell in self.history_manager.get_tail(self.history_load_length, include_latest=True): # Ignore blank lines and consecutive duplicates cell = cell.rstrip() if cell and (cell != last_cell): try: if self.multiline_history: self.readline.add_history(py3compat.unicode_to_str(cell, stdin_encoding)) else: for line in cell.splitlines(): self.readline.add_history(py3compat.unicode_to_str(line, stdin_encoding)) last_cell = cell except (TypeError, ValueError) as e: # The history DB can get corrupted so it returns strings # containing null bytes, which readline objects to. warn(("Failed to add string to readline history.\n" "Error: {}\n" "Cell: {!r}").format(e, cell))
def _should_recompile(self,e): """Utility routine for edit_syntax_error""" if e.filename in ('<ipython console>','<input>','<string>', '<console>','<BackgroundJob compilation>', None): return False try: if (self.autoedit_syntax and not self.ask_yes_no('Return to editor to correct syntax error? ' '[Y/n] ','y')): return False except EOFError: return False def int0(x): try: return int(x) except TypeError: return 0 # always pass integer line and offset values to editor hook try: self.hooks.fix_error_editor(e.filename, int0(e.lineno),int0(e.offset),e.msg) except TryNext: warn('Could not open editor') return False return True
def raw_input(self, prompt=''): """Write a prompt and read a line. The returned line does not include the trailing newline. When the user enters the EOF key sequence, EOFError is raised. Parameters ---------- prompt : str, optional A string to be printed to prompt the user. """ # raw_input expects str, but we pass it unicode sometimes prompt = py3compat.cast_bytes_py2(prompt) try: line = py3compat.cast_unicode_py2(self.raw_input_original(prompt)) except ValueError: warn("\n********\nYou or a %run:ed script called sys.stdin.close()" " or sys.stdout.close()!\nExiting IPython!\n") self.ask_exit() return "" # Try to be reasonably smart about not re-indenting pasted input more # than necessary. We do this by trimming out the auto-indent initial # spaces, if the user's actual input started itself with whitespace. if self.autoindent: if num_ini_spaces(line) > self.indent_current_nsp: line = line[self.indent_current_nsp:] self.indent_current_nsp = 0 return line
def update_user_ns(self, result): """Update user_ns with various things like _, __, _1, etc.""" # Avoid recursive reference when displaying _oh/Out if result is not self.shell.user_ns['_oh']: if len(self.shell.user_ns['_oh']) >= self.cache_size and self.do_full_cache: warn('Output cache limit (currently '+ `self.cache_size`+' entries) hit.\n' 'Flushing cache and resetting history counter...\n' 'The only history variables available will be _,__,___ and _1\n' 'with the current result.') self.flush() # Don't overwrite '_' and friends if '_' is in __builtin__ (otherwise # we cause buggy behavior for things like gettext). if '_' not in __builtin__.__dict__: self.___ = self.__ self.__ = self._ self._ = result self.shell.user_ns.update({'_':self._, '__':self.__, '___':self.___}) # hackish access to top-level namespace to create _1,_2... dynamically to_main = {} if self.do_full_cache: new_result = '_'+`self.prompt_count` to_main[new_result] = result self.shell.user_ns.update(to_main) self.shell.user_ns['_oh'][self.prompt_count] = result
def _setup_pipe_in(self): """setup listening pipe for subprocesses""" ctx = self.pub_socket.context # use UUID to authenticate pipe messages self._pipe_uuid = uuid.uuid4().bytes self._pipe_in = ctx.socket(zmq.PULL) self._pipe_in.linger = 0 try: self._pipe_port = self._pipe_in.bind_to_random_port("tcp://127.0.0.1") except zmq.ZMQError as e: warn("Couldn't bind IOStream to 127.0.0.1: %s" % e + "\nsubprocess output will be unavailable." ) self._pipe_flag = False self._pipe_in.close() del self._pipe_in return self._pipe_poller = zmq.Poller() self._pipe_poller.register(self._pipe_in, zmq.POLLIN) if IOLoop.initialized(): # subprocess flush should trigger flush # if kernel is idle IOLoop.instance().add_handler(self._pipe_in, lambda s, event: self.flush(), IOLoop.READ, )
def raw_input(self, prompt='', continue_prompt=False): """Write a prompt and read a line. The returned line does not include the trailing newline. When the user enters the EOF key sequence, EOFError is raised. Optional inputs: - prompt(''): a string to be printed to prompt the user. - continue_prompt(False): whether this line is the first one or a continuation in a sequence of inputs. """ # Code run by the user may have modified the readline completer state. # We must ensure that our completer is back in place. if self.has_readline: self.set_readline_completer() try: line = raw_input_original(prompt).decode(self.stdin_encoding) except ValueError: warn("\n********\nYou or a %run:ed script called sys.stdin.close()" " or sys.stdout.close()!\nExiting IPython!") self.ask_exit() return "" # Try to be reasonably smart about not re-indenting pasted input more # than necessary. We do this by trimming out the auto-indent initial # spaces, if the user's actual input started itself with whitespace. if self.autoindent: if num_ini_spaces(line) > self.indent_current_nsp: line = line[self.indent_current_nsp:] self.indent_current_nsp = 0 # store the unfiltered input before the user has any chance to modify # it. if line.strip(): if continue_prompt: if self.has_readline and self.readline_use: histlen = self.readline.get_current_history_length() if histlen > 1: newhist = self.history_manager.input_hist_raw[-1].rstrip() self.readline.remove_history_item(histlen-1) self.readline.replace_history_item(histlen-2, newhist.encode(self.stdin_encoding)) else: self.history_manager.input_hist_raw.append('%s\n' % line) elif not continue_prompt: self.history_manager.input_hist_raw.append('\n') try: lineout = self.prefilter_manager.prefilter_lines(line,continue_prompt) except: # blanket except, in case a user-defined prefilter crashes, so it # can't take all of ipython with it. self.showtraceback() return '' else: return lineout
def __init__(self): if ctypes is None: warn("IPython GUI event loop requires ctypes, %gui will not be available") else: self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int) self.guihooks = {} self.aliases = {} self.apps = {} self._reset()
def check_exclusions_exist(): from IPython.utils.path import get_ipython_package_dir from IPython.utils.warn import warn parent = os.path.dirname(get_ipython_package_dir()) for sec in test_sections: for pattern in sec.exclusions: fullpath = pjoin(parent, pattern) if not os.path.exists(fullpath) and not glob.glob(fullpath + '.*'): warn("Excluding nonexistent file: %r" % pattern)
def __init__(self, shell=None, cache_size=1000, colors='NoColor', input_sep='\n', output_sep='\n', output_sep2='', ps1 = None, ps2 = None, ps_out = None, pad_left=True, config=None): super(DisplayHook, self).__init__(shell=shell, config=config) cache_size_min = 3 if cache_size <= 0: self.do_full_cache = 0 cache_size = 0 elif cache_size < cache_size_min: self.do_full_cache = 0 cache_size = 0 warn('caching was disabled (min value for cache size is %s).' % cache_size_min,level=3) else: self.do_full_cache = 1 self.cache_size = cache_size self.input_sep = input_sep # we need a reference to the user-level namespace self.shell = shell # Set input prompt strings and colors if cache_size == 0: if ps1.find('%n') > -1 or ps1.find(r'\#') > -1 \ or ps1.find(r'\N') > -1: ps1 = '>>> ' if ps2.find('%n') > -1 or ps2.find(r'\#') > -1 \ or ps2.find(r'\N') > -1: ps2 = '... ' self.ps1_str = self._set_prompt_str(ps1,'In [\\#]: ','>>> ') self.ps2_str = self._set_prompt_str(ps2,' .\\D.: ','... ') self.ps_out_str = self._set_prompt_str(ps_out,'Out[\\#]: ','') self.color_table = prompts.PromptColors self.prompt1 = prompts.Prompt1(self,sep=input_sep,prompt=self.ps1_str, pad_left=pad_left) self.prompt2 = prompts.Prompt2(self,prompt=self.ps2_str,pad_left=pad_left) self.prompt_out = prompts.PromptOut(self,sep='',prompt=self.ps_out_str, pad_left=pad_left) self.set_colors(colors) # Store the last prompt string each time, we need it for aligning # continuation and auto-rewrite prompts self.last_prompt = '' self.output_sep = output_sep self.output_sep2 = output_sep2 self._,self.__,self.___ = '','','' self.pprint_types = map(type,[(),[],{}]) # these are deliberately global: to_user_ns = {'_':self._,'__':self.__,'___':self.___} self.shell.user_ns.update(to_user_ns)
def getcwdu(): """Graciously handles cases when PWD does not exist. Defaults to home directory eliminating the OSError exception. """ try: current_dir_path = os.getcwdu() except OSError ,e : if e.errno is 2: warn.warn("Path does not exist , defaulting to Home Directory") current_dir_path = get_home_dir()
def cull_cache(self): """Output cache is full, cull the oldest entries""" oh = self.shell.user_ns.get('_oh', {}) sz = len(oh) cull_count = max(int(sz * self.cull_fraction), 2) warn('Output cache limit (currently {sz} entries) hit.\n' 'Flushing oldest {cull_count} entries.'.format(sz=sz, cull_count=cull_count)) for i, n in enumerate(sorted(oh)): if i >= cull_count: break self.shell.user_ns.pop('_%i' % n, None) oh.pop(n, None)
def __init__(self, profile="default", hist_file=u"", config=None, **traits): """Create a new history accessor. Parameters ---------- profile : str The name of the profile from which to open history. hist_file : str Path to an SQLite history database stored by IPython. If specified, hist_file overrides profile. config : Config object. hist_file can also be set through this. """ # We need a pointer back to the shell for various tasks. super(HistoryAccessor, self).__init__(config=config, **traits) # defer setting hist_file from kwarg until after init, # otherwise the default kwarg value would clobber any value # set by config if hist_file: self.hist_file = hist_file if self.hist_file == u"": # No one has set the hist_file, yet. self.hist_file = self._get_hist_file_name(profile) if sqlite3 is None and self.enabled: warn("IPython History requires SQLite, your history will not be saved\n") self.enabled = False if sqlite3 is not None: DatabaseError = sqlite3.DatabaseError else: DatabaseError = Exception try: self.init_db() except DatabaseError: if os.path.isfile(self.hist_file): # Try to move the file out of the way base, ext = os.path.splitext(self.hist_file) newpath = base + "-corrupt" + ext os.rename(self.hist_file, newpath) print( "ERROR! History file wasn't a valid SQLite database.", "It was moved to %s" % newpath, "and a new file created.", ) self.init_db() else: # The hist_file is probably :memory: or something else. raise
def warn_format_error(method, self, *args, **kwargs): """decorator for warning on failed format call""" try: r = method(self, *args, **kwargs) except Exception as e: warn("Exception in %s formatter: %s" % (self.format_type, e)) return None if r is None or isinstance(r, self._return_type) or \ (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)): return r else: warn("%s formatter returned invalid type %s (expected %s) for object: %s" % ( self.format_type, type(r), self._return_type, pretty._safe_repr(args[0]) ))
def profile(self, parameter_s=''): """Print your currently active IPython profile. See Also -------- prun : run code using the Python profiler (:meth:`~IPython.core.magics.execution.ExecutionMagics.prun`) """ warn("%profile is now deprecated. Please use get_ipython().profile instead.") from IPython.core.application import BaseIPythonApplication if BaseIPythonApplication.initialized(): print(BaseIPythonApplication.instance().profile) else: error("profile is an application-level value, but you don't appear to be in an IPython application")
def pylab(self, line=''): """Load numpy and matplotlib to work interactively. This function lets you activate pylab (matplotlib, numpy and interactive support) at any point during an IPython session. %pylab makes the following imports:: import numpy import matplotlib from matplotlib import pylab, mlab, pyplot np = numpy plt = pyplot from IPython.display import display from IPython.core.pylabtools import figsize, getfigs from pylab import * from numpy import * If you pass `--no-import-all`, the last two `*` imports will be excluded. See the %matplotlib magic for more details about activating matplotlib without affecting the interactive namespace. """ args = magic_arguments.parse_argstring(self.pylab, line) if args.no_import_all is None: # get default from Application if Application.initialized(): app = Application.instance() try: import_all = app.pylab_import_all except AttributeError: import_all = True else: # nothing specified, no app - default True import_all = True else: # invert no-import flag import_all = not args.no_import_all gui, backend, clobbered = self.shell.enable_pylab( args.gui, import_all=import_all) self._show_matplotlib_backend(args.gui, backend) print ( "Populating the interactive namespace from numpy and matplotlib") if clobbered: warn("pylab import has clobbered these variables: %s" % clobbered + "\n`%matplotlib` prevents importing * from pylab and numpy" )
def get_ipython_dir(): """Get the IPython directory for this platform and user. This uses the logic in `get_home_dir` to find the home directory and then adds .ipython to the end of the path. """ env = os.environ pjoin = os.path.join ipdir_def = '.ipython' xdg_def = 'ipython' home_dir = get_home_dir() xdg_dir = get_xdg_dir() # import pdb; pdb.set_trace() # dbg ipdir = env.get('IPYTHON_DIR', env.get('IPYTHONDIR', None)) if ipdir is None: # not set explicitly, use XDG_CONFIG_HOME or HOME home_ipdir = pjoin(home_dir, ipdir_def) if xdg_dir: # use XDG, as long as the user isn't already # using $HOME/.ipython and *not* XDG/ipython xdg_ipdir = pjoin(xdg_dir, xdg_def) if _writable_dir(xdg_ipdir) or not _writable_dir(home_ipdir): ipdir = xdg_ipdir if ipdir is None: # not using XDG ipdir = home_ipdir ipdir = os.path.normpath(os.path.expanduser(ipdir)) if os.path.exists(ipdir) and not _writable_dir(ipdir): # ipdir exists, but is not writable warn.warn("IPython dir '%s' is not a writable location," " using a temp directory."%ipdir) ipdir = tempfile.mkdtemp() elif not os.path.exists(ipdir): parent = ipdir.rsplit(os.path.sep, 1)[0] if not _writable_dir(parent): # ipdir does not exist and parent isn't writable warn.warn("IPython parent '%s' is not a writable location," " using a temp directory."%parent) ipdir = tempfile.mkdtemp() return py3compat.cast_unicode(ipdir, fs_encoding)
def parse_command_line(self, argv=None): """override to allow old '-pylab' flag with deprecation warning""" argv = sys.argv[1:] if argv is None else argv if '-pylab' in argv: # deprecated `-pylab` given, # warn and transform into current syntax argv = argv[:] # copy, don't clobber idx = argv.index('-pylab') warn.warn("`-pylab` flag has been deprecated.\n" " Use `--matplotlib <backend>` and import pylab manually.") argv[idx] = '--pylab' return super(TerminalIPythonApp, self).parse_command_line(argv)
def get_default_editor(): try: ed = os.environ["EDITOR"] if not py3compat.PY3: ed = ed.decode() return ed except KeyError: pass except UnicodeError: warn("$EDITOR environment variable is not pure ASCII. Using platform " "default editor.") if os.name == "posix": return "vi" # the only one guaranteed to be there! else: return "notepad" # same in Windows!
def load(self, arg_s): """Load code into the current frontend. Usage:\\ %load [options] source where source can be a filename, URL, input history range or macro Options: -------- -r <lines>: Specify lines or ranges of lines to load from the source. Ranges could be specified as x-y (x..y) or in python-style x:y (x..(y-1)). Both limits x and y can be left blank (meaning the beginning and end of the file, respectively). -s <symbols>: Specify function or classes to load from python source. -y : Don't ask confirmation for loading source above 200 000 characters. This magic command can either take a local filename, a URL, an history range (see %history) or a macro as argument, it will prompt for confirmation before loading source with more than 200 000 characters, unless -y flag is passed or if the frontend does not support raw_input:: %load myscript.py %load 7-27 %load myMacro %load http://www.example.com/myscript.py %load -r 5-10 myscript.py %load -r 10-20,30,40: foo.py %load -s MyClass,wonder_function myscript.py """ opts,args = self.parse_options(arg_s,'ys:r:') if not args: raise UsageError('Missing filename, URL, input history range, ' 'or macro.') contents = self.shell.find_user_code(args) if 's' in opts: try: blocks, not_found = extract_symbols(contents, opts['s']) except SyntaxError: # non python code error("Unable to parse the input as valid Python code") return if len(not_found) == 1: warn('The symbol `%s` was not found' % not_found[0]) elif len(not_found) > 1: warn('The symbols %s were not found' % get_text_list(not_found, wrap_item_with='`') ) contents = '\n'.join(blocks) if 'r' in opts: ranges = opts['r'].replace(',', ' ') lines = contents.split('\n') slices = extract_code_ranges(ranges) contents = [lines[slice(*slc)] for slc in slices] contents = '\n'.join(chain.from_iterable(contents)) l = len(contents) # 200 000 is ~ 2500 full 80 caracter lines # so in average, more than 5000 lines if l > 200000 and 'y' not in opts: try: ans = self.shell.ask_yes_no(("The text you're trying to load seems pretty big"\ " (%d characters). Continue (y/[N]) ?" % l), default='n' ) except StdinNotImplementedError: #asume yes if raw input not implemented ans = True if ans is False : print 'Operation cancelled.' return self.shell.set_next_input(contents)
def __init__(self,shell,cache_size,Pprint, colors='NoColor',input_sep='\n', output_sep='\n',output_sep2='', ps1 = None, ps2 = None,ps_out = None,pad_left=True): cache_size_min = 3 if cache_size <= 0: self.do_full_cache = 0 cache_size = 0 elif cache_size < cache_size_min: self.do_full_cache = 0 cache_size = 0 warn('caching was disabled (min value for cache size is %s).' % cache_size_min,level=3) else: self.do_full_cache = 1 self.cache_size = cache_size self.input_sep = input_sep # we need a reference to the user-level namespace self.shell = shell self.user_ns = shell.user_ns # and to the user's input self.input_hist = shell.history.input_cache # Set input prompt strings and colors if cache_size == 0: if ps1.find('%n') > -1 or ps1.find(r'\#') > -1 \ or ps1.find(r'\N') > -1: ps1 = '>>> ' if ps2.find('%n') > -1 or ps2.find(r'\#') > -1 \ or ps2.find(r'\N') > -1: ps2 = '... ' self.ps1_str = self._set_prompt_str(ps1,'In [\\#]: ','>>> ') self.ps2_str = self._set_prompt_str(ps2,' .\\D.: ','... ') self.ps_out_str = self._set_prompt_str(ps_out,'Out[\\#]: ','') self.color_table = PromptColors self.prompt1 = Prompt1(self,sep=input_sep,prompt=self.ps1_str, pad_left=pad_left) self.prompt2 = Prompt2(self,prompt=self.ps2_str,pad_left=pad_left) self.prompt_out = PromptOut(self,sep='',prompt=self.ps_out_str, pad_left=pad_left) self.set_colors(colors) # other more normal stuff # b/c each call to the In[] prompt raises it by 1, even the first. self.prompt_count = 0 # Store the last prompt string each time, we need it for aligning # continuation and auto-rewrite prompts self.last_prompt = '' self.Pprint = Pprint self.output_sep = output_sep self.output_sep2 = output_sep2 self._,self.__,self.___ = '','','' self.pprint_types = map(type,[(),[],{}]) # these are deliberately global: to_user_ns = {'_':self._,'__':self.__,'___':self.___} self.user_ns.update(to_user_ns)
def edit(self, parameter_s='',last_call=['','']): """Bring up an editor and execute the resulting code. Usage: %edit [options] [args] %edit runs IPython's editor hook. The default version of this hook is set to call the editor specified by your $EDITOR environment variable. If this isn't found, it will default to vi under Linux/Unix and to notepad under Windows. See the end of this docstring for how to change the editor hook. You can also set the value of this editor via the ``TerminalInteractiveShell.editor`` option in your configuration file. This is useful if you wish to use a different editor from your typical default with IPython (and for Windows users who typically don't set environment variables). This command allows you to conveniently edit multi-line code right in your IPython session. If called without arguments, %edit opens up an empty editor with a temporary file and will execute the contents of this file when you close it (don't forget to save it!). Options: -n <number>: open the editor at a specified line number. By default, the IPython editor hook uses the unix syntax 'editor +N filename', but you can configure this by providing your own modified hook if your favorite editor supports line-number specifications with a different syntax. -p: this will call the editor with the same data as the previous time it was used, regardless of how long ago (in your current session) it was. -r: use 'raw' input. This option only applies to input taken from the user's history. By default, the 'processed' history is used, so that magics are loaded in their transformed version to valid Python. If this option is given, the raw input as typed as the command line is used instead. When you exit the editor, it will be executed by IPython's own processor. -x: do not execute the edited code immediately upon exit. This is mainly useful if you are editing programs which need to be called with command line arguments, which you can then do using %run. Arguments: If arguments are given, the following possibilities exist: - If the argument is a filename, IPython will load that into the editor. It will execute its contents with execfile() when you exit, loading any code in the file into your interactive namespace. - The arguments are ranges of input history, e.g. "7 ~1/4-6". The syntax is the same as in the %history magic. - If the argument is a string variable, its contents are loaded into the editor. You can thus edit any string which contains python code (including the result of previous edits). - If the argument is the name of an object (other than a string), IPython will try to locate the file where it was defined and open the editor at the point where it is defined. You can use `%edit function` to load an editor exactly at the point where 'function' is defined, edit it and have the file be executed automatically. - If the object is a macro (see %macro for details), this opens up your specified editor with a temporary file containing the macro's data. Upon exit, the macro is reloaded with the contents of the file. Note: opening at an exact line is only supported under Unix, and some editors (like kedit and gedit up to Gnome 2.8) do not understand the '+NUMBER' parameter necessary for this feature. Good editors like (X)Emacs, vi, jed, pico and joe all do. After executing your code, %edit will return as output the code you typed in the editor (except when it was an existing file). This way you can reload the code in further invocations of %edit as a variable, via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of the output. Note that %edit is also available through the alias %ed. This is an example of creating a simple function inside the editor and then modifying it. First, start up the editor:: In [1]: edit Editing... done. Executing edited code... Out[1]: 'def foo():\\n print "foo() was defined in an editing session"\\n' We can then call the function foo():: In [2]: foo() foo() was defined in an editing session Now we edit foo. IPython automatically loads the editor with the (temporary) file where foo() was previously defined:: In [3]: edit foo Editing... done. Executing edited code... And if we call foo() again we get the modified version:: In [4]: foo() foo() has now been changed! Here is an example of how to edit a code snippet successive times. First we call the editor:: In [5]: edit Editing... done. Executing edited code... hello Out[5]: "print 'hello'\\n" Now we call it again with the previous output (stored in _):: In [6]: edit _ Editing... done. Executing edited code... hello world Out[6]: "print 'hello world'\\n" Now we call it with the output #8 (stored in _8, also as Out[8]):: In [7]: edit _8 Editing... done. Executing edited code... hello again Out[7]: "print 'hello again'\\n" Changing the default editor hook: If you wish to write your own editor hook, you can put it in a configuration file which you load at startup time. The default hook is defined in the IPython.core.hooks module, and you can use that as a starting example for further modifications. That file also has general instructions on how to set a new hook for use once you've defined it.""" opts,args = self.parse_options(parameter_s,'prxn:') try: filename, lineno, is_temp = self._find_edit_target(self.shell, args, opts, last_call) except MacroToEdit as e: self._edit_macro(args, e.args[0]) return except InteractivelyDefined as e: print "Editing In[%i]" % e.index args = str(e.index) filename, lineno, is_temp = self._find_edit_target(self.shell, args, opts, last_call) if filename is None: # nothing was found, warnings have already been issued, # just give up. return # do actual editing here print 'Editing...', sys.stdout.flush() try: # Quote filenames that may have spaces in them if ' ' in filename: filename = "'%s'" % filename self.shell.hooks.editor(filename,lineno) except TryNext: warn('Could not open editor') return # XXX TODO: should this be generalized for all string vars? # For now, this is special-cased to blocks created by cpaste if args.strip() == 'pasted_block': with open(filename, 'r') as f: self.shell.user_ns['pasted_block'] = f.read() if 'x' in opts: # -x prevents actual execution print else: print 'done. Executing edited code...' with preserve_keys(self.shell.user_ns, '__file__'): if not is_temp: self.shell.user_ns['__file__'] = filename if 'r' in opts: # Untranslated IPython code with open(filename, 'r') as f: source = f.read() self.shell.run_cell(source, store_history=False) else: self.shell.safe_execfile(filename, self.shell.user_ns, self.shell.user_ns) if is_temp: try: return open(filename).read() except IOError as msg: if msg.filename == filename: warn('File not found. Did you forget to save?') return else: self.shell.showtraceback()
def _find_edit_target(shell, args, opts, last_call): """Utility method used by magic_edit to find what to edit.""" def make_filename(arg): "Make a filename from the given args" arg = unquote_filename(arg) try: filename = get_py_filename(arg) except IOError: # If it ends with .py but doesn't already exist, assume we want # a new file. if arg.endswith('.py'): filename = arg else: filename = None return filename # Set a few locals from the options for convenience: opts_prev = 'p' in opts opts_raw = 'r' in opts # custom exceptions class DataIsObject(Exception): pass # Default line number value lineno = opts.get('n',None) if opts_prev: args = '_%s' % last_call[0] if args not in shell.user_ns: args = last_call[1] # by default this is done with temp files, except when the given # arg is a filename use_temp = True data = '' # First, see if the arguments should be a filename. filename = make_filename(args) if filename: use_temp = False elif args: # Mode where user specifies ranges of lines, like in %macro. data = shell.extract_input_lines(args, opts_raw) if not data: try: # Load the parameter given as a variable. If not a string, # process it as an object instead (below) #print '*** args',args,'type',type(args) # dbg data = eval(args, shell.user_ns) if not isinstance(data, basestring): raise DataIsObject except (NameError,SyntaxError): # given argument is not a variable, try as a filename filename = make_filename(args) if filename is None: warn("Argument given (%s) can't be found as a variable " "or as a filename." % args) return (None, None, None) use_temp = False except DataIsObject: # macros have a special edit function if isinstance(data, Macro): raise MacroToEdit(data) # For objects, try to edit the file where they are defined filename = find_file(data) if filename: if 'fakemodule' in filename.lower() and \ inspect.isclass(data): # class created by %edit? Try to find source # by looking for method definitions instead, the # __module__ in those classes is FakeModule. attrs = [getattr(data, aname) for aname in dir(data)] for attr in attrs: if not inspect.ismethod(attr): continue filename = find_file(attr) if filename and \ 'fakemodule' not in filename.lower(): # change the attribute to be the edit # target instead data = attr break m = ipython_input_pat.match(os.path.basename(filename)) if m: raise InteractivelyDefined(int(m.groups()[0])) datafile = 1 if filename is None: filename = make_filename(args) datafile = 1 if filename is not None: # only warn about this if we get a real name warn('Could not find file where `%s` is defined.\n' 'Opening a file named `%s`' % (args, filename)) # Now, make sure we can actually read the source (if it was # in a temp file it's gone by now). if datafile: if lineno is None: lineno = find_source_lines(data) if lineno is None: filename = make_filename(args) if filename is None: warn('The file where `%s` was defined ' 'cannot be read or found.' % data) return (None, None, None) use_temp = False if use_temp: filename = shell.mktempfile(data) print 'IPython will make a temporary file named:',filename # use last_call to remember the state of the previous call, but don't # let it be clobbered by successive '-p' calls. try: last_call[0] = shell.displayhook.prompt_count if not opts_prev: last_call[1] = args except: pass return filename, lineno, use_temp
def xmode_switch_err(name): warn('Error changing %s exception modes.\n%s' % (name, sys.exc_info()[1]))
def _deprecated_disable(): warn("This function is deprecated: use disable_gui() instead") inputhook_manager.disable_gui()
def run(self, parameter_s='', runner=None, file_finder=get_py_filename): """Run the named file inside IPython as a program. Usage:\\ %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args] Parameters after the filename are passed as command-line arguments to the program (put in sys.argv). Then, control returns to IPython's prompt. This is similar to running at a system prompt:\\ $ python file args\\ but with the advantage of giving you IPython's tracebacks, and of loading all variables into your interactive namespace for further use (unless -p is used, see below). The file is executed in a namespace initially consisting only of __name__=='__main__' and sys.argv constructed as indicated. It thus sees its environment as if it were being run as a stand-alone program (except for sharing global objects such as previously imported modules). But after execution, the IPython interactive namespace gets updated with all variables defined in the program (except for __name__ and sys.argv). This allows for very convenient loading of code for interactive work, while giving each program a 'clean sheet' to run in. Options: -n: __name__ is NOT set to '__main__', but to the running file's name without extension (as python does under import). This allows running scripts and reloading the definitions in them without calling code protected by an ' if __name__ == "__main__" ' clause. -i: run the file in IPython's namespace instead of an empty one. This is useful if you are experimenting with code written in a text editor which depends on variables defined interactively. -e: ignore sys.exit() calls or SystemExit exceptions in the script being run. This is particularly useful if IPython is being used to run unittests, which always exit with a sys.exit() call. In such cases you are interested in the output of the test results, not in seeing a traceback of the unittest module. -t: print timing information at the end of the run. IPython will give you an estimated CPU time consumption for your script, which under Unix uses the resource module to avoid the wraparound problems of time.clock(). Under Unix, an estimate of time spent on system tasks is also given (for Windows platforms this is reported as 0.0). If -t is given, an additional -N<N> option can be given, where <N> must be an integer indicating how many times you want the script to run. The final timing report will include total and per run results. For example (testing the script uniq_stable.py):: In [1]: run -t uniq_stable IPython CPU timings (estimated):\\ User : 0.19597 s.\\ System: 0.0 s.\\ In [2]: run -t -N5 uniq_stable IPython CPU timings (estimated):\\ Total runs performed: 5\\ Times : Total Per run\\ User : 0.910862 s, 0.1821724 s.\\ System: 0.0 s, 0.0 s. -d: run your program under the control of pdb, the Python debugger. This allows you to execute your program step by step, watch variables, etc. Internally, what IPython does is similar to calling: pdb.run('execfile("YOURFILENAME")') with a breakpoint set on line 1 of your file. You can change the line number for this automatic breakpoint to be <N> by using the -bN option (where N must be an integer). For example:: %run -d -b40 myscript will set the first breakpoint at line 40 in myscript.py. Note that the first breakpoint must be set on a line which actually does something (not a comment or docstring) for it to stop execution. When the pdb debugger starts, you will see a (Pdb) prompt. You must first enter 'c' (without quotes) to start execution up to the first breakpoint. Entering 'help' gives information about the use of the debugger. You can easily see pdb's full documentation with "import pdb;pdb.help()" at a prompt. -p: run program under the control of the Python profiler module (which prints a detailed report of execution times, function calls, etc). You can pass other options after -p which affect the behavior of the profiler itself. See the docs for %prun for details. In this mode, the program's variables do NOT propagate back to the IPython interactive namespace (because they remain in the namespace where the profiler executes them). Internally this triggers a call to %prun, see its documentation for details on the options available specifically for profiling. There is one special usage for which the text above doesn't apply: if the filename ends with .ipy, the file is run as ipython script, just as if the commands were written on IPython prompt. -m: specify module name to load instead of script path. Similar to the -m option for the python interpreter. Use this option last if you want to combine with other %run options. Unlike the python interpreter only source modules are allowed no .pyc or .pyo files. For example:: %run -m example will run the example module. """ # get arguments and set sys.argv for program to be run. opts, arg_lst = self.parse_options(parameter_s, 'nidtN:b:pD:l:rs:T:em:', mode='list', list_all=1) if "m" in opts: modulename = opts["m"][0] modpath = find_mod(modulename) if modpath is None: warn('%r is not a valid modulename on sys.path' % modulename) return arg_lst = [modpath] + arg_lst try: filename = file_finder(arg_lst[0]) except IndexError: warn('you must provide at least a filename.') print '\n%run:\n', oinspect.getdoc(self.run) return except IOError as e: try: msg = str(e) except UnicodeError: msg = e.message error(msg) return if filename.lower().endswith('.ipy'): self.shell.safe_execfile_ipy(filename) return # Control the response to exit() calls made by the script being run exit_ignore = 'e' in opts # Make sure that the running script gets a proper sys.argv as if it # were run from a system shell. save_argv = sys.argv # save it for later restoring # simulate shell expansion on arguments, at least tilde expansion args = [os.path.expanduser(a) for a in arg_lst[1:]] sys.argv = [filename] + args # put in the proper filename # protect sys.argv from potential unicode strings on Python 2: if not py3compat.PY3: sys.argv = [py3compat.cast_bytes(a) for a in sys.argv] if 'i' in opts: # Run in user's interactive namespace prog_ns = self.shell.user_ns __name__save = self.shell.user_ns['__name__'] prog_ns['__name__'] = '__main__' main_mod = self.shell.new_main_mod(prog_ns) else: # Run in a fresh, empty namespace if 'n' in opts: name = os.path.splitext(os.path.basename(filename))[0] else: name = '__main__' main_mod = self.shell.new_main_mod() prog_ns = main_mod.__dict__ prog_ns['__name__'] = name # Since '%run foo' emulates 'python foo.py' at the cmd line, we must # set the __file__ global in the script's namespace prog_ns['__file__'] = filename # pickle fix. See interactiveshell for an explanation. But we need to # make sure that, if we overwrite __main__, we replace it at the end main_mod_name = prog_ns['__name__'] if main_mod_name == '__main__': restore_main = sys.modules['__main__'] else: restore_main = False # This needs to be undone at the end to prevent holding references to # every single object ever created. sys.modules[main_mod_name] = main_mod try: stats = None with self.shell.readline_no_record: if 'p' in opts: stats = self.prun('', None, False, opts, arg_lst, prog_ns) else: if 'd' in opts: deb = debugger.Pdb(self.shell.colors) # reset Breakpoint state, which is moronically kept # in a class bdb.Breakpoint.next = 1 bdb.Breakpoint.bplist = {} bdb.Breakpoint.bpbynumber = [None] # Set an initial breakpoint to stop execution maxtries = 10 bp = int(opts.get('b', [1])[0]) checkline = deb.checkline(filename, bp) if not checkline: for bp in range(bp + 1, bp + maxtries + 1): if deb.checkline(filename, bp): break else: msg = ( "\nI failed to find a valid line to set " "a breakpoint\n" "after trying up to line: %s.\n" "Please set a valid breakpoint manually " "with the -b option." % bp) error(msg) return # if we find a good linenumber, set the breakpoint deb.do_break('%s:%s' % (filename, bp)) # Start file run print "NOTE: Enter 'c' at the", print "%s prompt to start your script." % deb.prompt ns = { 'execfile': py3compat.execfile, 'prog_ns': prog_ns } try: deb.run('execfile("%s", prog_ns)' % filename, ns) except: etype, value, tb = sys.exc_info() # Skip three frames in the traceback: the %run one, # one inside bdb.py, and the command-line typed by the # user (run by exec in pdb itself). self.shell.InteractiveTB(etype, value, tb, tb_offset=3) else: if runner is None: runner = self.default_runner if runner is None: runner = self.shell.safe_execfile if 't' in opts: # timed execution try: nruns = int(opts['N'][0]) if nruns < 1: error('Number of runs must be >=1') return except (KeyError): nruns = 1 twall0 = time.time() if nruns == 1: t0 = clock2() runner(filename, prog_ns, prog_ns, exit_ignore=exit_ignore) t1 = clock2() t_usr = t1[0] - t0[0] t_sys = t1[1] - t0[1] print "\nIPython CPU timings (estimated):" print " User : %10.2f s." % t_usr print " System : %10.2f s." % t_sys else: runs = range(nruns) t0 = clock2() for nr in runs: runner(filename, prog_ns, prog_ns, exit_ignore=exit_ignore) t1 = clock2() t_usr = t1[0] - t0[0] t_sys = t1[1] - t0[1] print "\nIPython CPU timings (estimated):" print "Total runs performed:", nruns print " Times : %10.2f %10.2f" % ( 'Total', 'Per run') print " User : %10.2f s, %10.2f s." % ( t_usr, t_usr / nruns) print " System : %10.2f s, %10.2f s." % ( t_sys, t_sys / nruns) twall1 = time.time() print "Wall time: %10.2f s." % (twall1 - twall0) else: # regular execution runner(filename, prog_ns, prog_ns, exit_ignore=exit_ignore) if 'i' in opts: self.shell.user_ns['__name__'] = __name__save else: # The shell MUST hold a reference to prog_ns so after %run # exits, the python deletion mechanism doesn't zero it out # (leaving dangling references). self.shell.cache_main_mod(prog_ns, filename) # update IPython interactive namespace # Some forms of read errors on the file may mean the # __name__ key was never set; using pop we don't have to # worry about a possible KeyError. prog_ns.pop('__name__', None) self.shell.user_ns.update(prog_ns) finally: # It's a bit of a mystery why, but __builtins__ can change from # being a module to becoming a dict missing some key data after # %run. As best I can see, this is NOT something IPython is doing # at all, and similar problems have been reported before: # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html # Since this seems to be done by the interpreter itself, the best # we can do is to at least restore __builtins__ for the user on # exit. self.shell.user_ns['__builtins__'] = builtin_mod # Ensure key global structures are restored sys.argv = save_argv if restore_main: sys.modules['__main__'] = restore_main else: # Remove from sys.modules the reference to main_mod we'd # added. Otherwise it will trap references to objects # contained therein. del sys.modules[main_mod_name] return stats
def colors(self, parameter_s=''): """Switch color scheme for prompts, info system and exception handlers. Currently implemented schemes: NoColor, Linux, LightBG. Color scheme names are not case-sensitive. Examples -------- To get a plain black and white terminal:: %colors nocolor """ def color_switch_err(name): warn('Error changing %s color schemes.\n%s' % (name, sys.exc_info()[1])) new_scheme = parameter_s.strip() if not new_scheme: raise UsageError( "%colors: you must specify a color scheme. See '%colors?'") # local shortcut shell = self.shell import IPython.utils.rlineimpl as readline if not shell.colors_force and \ not readline.have_readline and \ (sys.platform == "win32" or sys.platform == "cli"): msg = """\ Proper color support under MS Windows requires the pyreadline library. You can find it at: http://ipython.org/pyreadline.html Gary's readline needs the ctypes module, from: http://starship.python.net/crew/theller/ctypes (Note that ctypes is already part of Python versions 2.5 and newer). Defaulting color scheme to 'NoColor'""" new_scheme = 'NoColor' warn(msg) # readline option is 0 if not shell.colors_force and not shell.has_readline: new_scheme = 'NoColor' # Set prompt colors try: shell.prompt_manager.color_scheme = new_scheme except: color_switch_err('prompt') else: shell.colors = \ shell.prompt_manager.color_scheme_table.active_scheme_name # Set exception colors try: shell.InteractiveTB.set_colors(scheme=new_scheme) shell.SyntaxTB.set_colors(scheme=new_scheme) except: color_switch_err('exception') # Set info (for 'object?') colors if shell.color_info: try: shell.inspector.set_active_scheme(new_scheme) except: color_switch_err('object inspector') else: shell.inspector.set_active_scheme('NoColor')
def magic_edit(self, parameter_s='', last_call=['', '']): """Bring up an editor and execute the resulting code. Usage: %edit [options] [args] %edit runs IPython's editor hook. The default version of this hook is set to call the __IPYTHON__.rc.editor command. This is read from your environment variable $EDITOR. If this isn't found, it will default to vi under Linux/Unix and to notepad under Windows. See the end of this docstring for how to change the editor hook. You can also set the value of this editor via the command line option '-editor' or in your ipythonrc file. This is useful if you wish to use specifically for IPython an editor different from your typical default (and for Windows users who typically don't set environment variables). This command allows you to conveniently edit multi-line code right in your IPython session. If called without arguments, %edit opens up an empty editor with a temporary file and will execute the contents of this file when you close it (don't forget to save it!). Options: -n <number>: open the editor at a specified line number. By default, the IPython editor hook uses the unix syntax 'editor +N filename', but you can configure this by providing your own modified hook if your favorite editor supports line-number specifications with a different syntax. -p: this will call the editor with the same data as the previous time it was used, regardless of how long ago (in your current session) it was. -r: use 'raw' input. This option only applies to input taken from the user's history. By default, the 'processed' history is used, so that magics are loaded in their transformed version to valid Python. If this option is given, the raw input as typed as the command line is used instead. When you exit the editor, it will be executed by IPython's own processor. -x: do not execute the edited code immediately upon exit. This is mainly useful if you are editing programs which need to be called with command line arguments, which you can then do using %run. Arguments: If arguments are given, the following possibilites exist: - The arguments are numbers or pairs of colon-separated numbers (like 1 4:8 9). These are interpreted as lines of previous input to be loaded into the editor. The syntax is the same of the %macro command. - If the argument doesn't start with a number, it is evaluated as a variable and its contents loaded into the editor. You can thus edit any string which contains python code (including the result of previous edits). - If the argument is the name of an object (other than a string), IPython will try to locate the file where it was defined and open the editor at the point where it is defined. You can use `%edit function` to load an editor exactly at the point where 'function' is defined, edit it and have the file be executed automatically. If the object is a macro (see %macro for details), this opens up your specified editor with a temporary file containing the macro's data. Upon exit, the macro is reloaded with the contents of the file. Note: opening at an exact line is only supported under Unix, and some editors (like kedit and gedit up to Gnome 2.8) do not understand the '+NUMBER' parameter necessary for this feature. Good editors like (X)Emacs, vi, jed, pico and joe all do. - If the argument is not found as a variable, IPython will look for a file with that name (adding .py if necessary) and load it into the editor. It will execute its contents with execfile() when you exit, loading any code in the file into your interactive namespace. After executing your code, %edit will return as output the code you typed in the editor (except when it was an existing file). This way you can reload the code in further invocations of %edit as a variable, via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of the output. Note that %edit is also available through the alias %ed. This is an example of creating a simple function inside the editor and then modifying it. First, start up the editor: In [1]: ed Editing... done. Executing edited code... Out[1]: 'def foo():n print "foo() was defined in an editing session"n' We can then call the function foo(): In [2]: foo() foo() was defined in an editing session Now we edit foo. IPython automatically loads the editor with the (temporary) file where foo() was previously defined: In [3]: ed foo Editing... done. Executing edited code... And if we call foo() again we get the modified version: In [4]: foo() foo() has now been changed! Here is an example of how to edit a code snippet successive times. First we call the editor: In [5]: ed Editing... done. Executing edited code... hello Out[5]: "print 'hello'n" Now we call it again with the previous output (stored in _): In [6]: ed _ Editing... done. Executing edited code... hello world Out[6]: "print 'hello world'n" Now we call it with the output #8 (stored in _8, also as Out[8]): In [7]: ed _8 Editing... done. Executing edited code... hello again Out[7]: "print 'hello again'n" Changing the default editor hook: If you wish to write your own editor hook, you can put it in a configuration file which you load at startup time. The default hook is defined in the IPython.core.hooks module, and you can use that as a starting example for further modifications. That file also has general instructions on how to set a new hook for use once you've defined it.""" # FIXME: This function has become a convoluted mess. It needs a # ground-up rewrite with clean, simple logic. def make_filename(arg): "Make a filename from the given args" try: filename = get_py_filename(arg) except IOError: if args.endswith('.py'): filename = arg else: filename = None return filename # custom exceptions class DataIsObject(Exception): pass opts, args = self.parse_options(parameter_s, 'prn:') # Set a few locals from the options for convenience: opts_p = opts.has_key('p') opts_r = opts.has_key('r') # Default line number value lineno = opts.get('n', None) if lineno is not None: try: lineno = int(lineno) except: warn("The -n argument must be an integer.") return if opts_p: args = '_%s' % last_call[0] if not self.shell.user_ns.has_key(args): args = last_call[1] # use last_call to remember the state of the previous call, but don't # let it be clobbered by successive '-p' calls. try: last_call[0] = self.shell.displayhook.prompt_count if not opts_p: last_call[1] = parameter_s except: pass # by default this is done with temp files, except when the given # arg is a filename use_temp = True data = '' if args[0].isdigit(): # Mode where user specifies ranges of lines, like in %macro. # This means that you can't edit files whose names begin with # numbers this way. Tough. ranges = args.split() data = ''.join(self.extract_input_slices(ranges, opts_r)) elif args.endswith('.py'): filename = make_filename(args) use_temp = False elif args: try: # Load the parameter given as a variable. If not a string, # process it as an object instead (below) #print '*** args',args,'type',type(args) # dbg data = eval(args, self.shell.user_ns) if not isinstance(data, basestring): raise DataIsObject except (NameError, SyntaxError): # given argument is not a variable, try as a filename filename = make_filename(args) if filename is None: warn("Argument given (%s) can't be found as a variable " "or as a filename." % args) return use_temp = False except DataIsObject: # macros have a special edit function if isinstance(data, Macro): self._edit_macro(args, data) return # For objects, try to edit the file where they are defined try: filename = inspect.getabsfile(data) if 'fakemodule' in filename.lower() and inspect.isclass( data): # class created by %edit? Try to find source # by looking for method definitions instead, the # __module__ in those classes is FakeModule. attrs = [getattr(data, aname) for aname in dir(data)] for attr in attrs: if not inspect.ismethod(attr): continue filename = inspect.getabsfile(attr) if filename and 'fakemodule' not in filename.lower( ): # change the attribute to be the edit target instead data = attr break datafile = 1 except TypeError: filename = make_filename(args) datafile = 1 warn('Could not find file where `%s` is defined.\n' 'Opening a file named `%s`' % (args, filename)) # Now, make sure we can actually read the source (if it was in # a temp file it's gone by now). if datafile: try: if lineno is None: lineno = inspect.getsourcelines(data)[1] except IOError: filename = make_filename(args) if filename is None: warn('The file `%s` where `%s` was defined cannot ' 'be read.' % (filename, data)) return use_temp = False if use_temp: filename = self.shell.mktempfile(data) print('IPython will make a temporary file named:', filename) # Make sure we send to the client an absolute path, in case the working # directory of client and kernel don't match filename = os.path.abspath(filename) payload = { 'source': 'IPython.zmq.zmqshell.ZMQInteractiveShell.edit_magic', 'filename': filename, 'line_number': lineno } self.payload_manager.write_payload(payload)
def interact(self, display_banner=None): """Closely emulate the interactive Python console.""" # batch run -> do not interact if self.exit_now: return if display_banner is None: display_banner = self.display_banner if display_banner: self.show_banner() more = False # Mark activity in the builtins __builtin__.__dict__['__IPYTHON__active'] += 1 if self.has_readline: self.readline_startup_hook(self.pre_readline) # exit_now is set by a call to %Exit or %Quit, through the # ask_exit callback. while not self.exit_now: self.hooks.pre_prompt_hook() if more: try: prompt = self.hooks.generate_prompt(True) except: self.showtraceback() if self.autoindent: self.rl_do_indent = True else: try: prompt = self.hooks.generate_prompt(False) except: self.showtraceback() try: line = self.raw_input(prompt) if self.exit_now: # quick exit on sys.std[in|out] close break if self.autoindent: self.rl_do_indent = False except KeyboardInterrupt: #double-guard against keyboardinterrupts during kbdint handling try: self.write('\nKeyboardInterrupt\n') self.input_splitter.reset() more = False except KeyboardInterrupt: pass except EOFError: if self.autoindent: self.rl_do_indent = False if self.has_readline: self.readline_startup_hook(None) self.write('\n') self.exit() except bdb.BdbQuit: warn( 'The Python debugger has exited with a BdbQuit exception.\n' 'Because of how pdb handles the stack, it is impossible\n' 'for IPython to properly format this particular exception.\n' 'IPython will resume normal operation.') except: # exceptions here are VERY RARE, but they can be triggered # asynchronously by signal handlers, for example. self.showtraceback() else: self.input_splitter.push(line) more = self.input_splitter.push_accepts_more() if (self.SyntaxTB.last_syntax_error and self.autoedit_syntax): self.edit_syntax_error() if not more: source_raw = self.input_splitter.source_raw_reset()[1] self.run_cell(source_raw) # We are off again... __builtin__.__dict__['__IPYTHON__active'] -= 1 # Turn off the exit flag, so the mainloop can be restarted if desired self.exit_now = False
def enable_toolkit(app=None): warn("This function is deprecated - use enable_gui(%r) instead" % name) inputhook_manager.enable_gui(name, app)
def _pylab_changed(self, name, old, new): """Replace --pylab='inline' with --pylab='auto'""" if new == 'inline': warn.warn("'inline' not available as pylab backend, " "using 'auto' instead.") self.pylab = 'auto'
def load_config(self, argv=None, aliases=None, flags=None): """Parse the configuration and generate the Config object. After loading, any arguments that are not key-value or flags will be stored in self.extra_args - a list of unparsed command-line arguments. This is used for arguments such as input files or subcommands. Parameters ---------- argv : list, optional A list that has the form of sys.argv[1:] which has unicode elements of the form u"key=value". If this is None (default), then self.argv will be used. aliases : dict A dict of aliases for configurable traits. Keys are the short aliases, Values are the resolved trait. Of the form: `{'alias' : 'Configurable.trait'}` flags : dict A dict of flags, keyed by str name. Values can be Config objects or dicts. When the flag is triggered, The config is loaded as `self.config.update(cfg)`. """ from IPython.config.configurable import Configurable self.clear() if argv is None: argv = self.argv if aliases is None: aliases = self.aliases if flags is None: flags = self.flags # ensure argv is a list of unicode strings: uargv = self._decode_argv(argv) for idx, raw in enumerate(uargv): # strip leading '-' item = raw.lstrip('-') if raw == '--': # don't parse arguments after '--' # this is useful for relaying arguments to scripts, e.g. # ipython -i foo.py --pylab=qt -- args after '--' go-to-foo.py self.extra_args.extend(uargv[idx + 1:]) break if kv_pattern.match(raw): lhs, rhs = item.split('=', 1) # Substitute longnames for aliases. if lhs in aliases: lhs = aliases[lhs] if '.' not in lhs: # probably a mistyped alias, but not technically illegal warn.warn( "Unrecognized alias: '%s', it will probably have no effect." % lhs) try: self._exec_config_str(lhs, rhs) except Exception: raise ArgumentError("Invalid argument: '%s'" % raw) elif flag_pattern.match(raw): if item in flags: cfg, help = flags[item] self._load_flag(cfg) else: raise ArgumentError("Unrecognized flag: '%s'" % raw) elif raw.startswith('-'): kv = '--' + item if kv_pattern.match(kv): raise ArgumentError( "Invalid argument: '%s', did you mean '%s'?" % (raw, kv)) else: raise ArgumentError("Invalid argument: '%s'" % raw) else: # keep all args that aren't valid in a list, # in case our parent knows what to do with them. self.extra_args.append(item) return self.config
def __init__(self, shell=None, cache_size=1000, colors='NoColor', input_sep='\n', output_sep='\n', output_sep2='', ps1=None, ps2=None, ps_out=None, pad_left=True, config=None): super(DisplayHook, self).__init__(shell=shell, config=config) cache_size_min = 3 if cache_size <= 0: self.do_full_cache = 0 cache_size = 0 elif cache_size < cache_size_min: self.do_full_cache = 0 cache_size = 0 warn('caching was disabled (min value for cache size is %s).' % cache_size_min, level=3) else: self.do_full_cache = 1 self.cache_size = cache_size self.input_sep = input_sep # we need a reference to the user-level namespace self.shell = shell # Set input prompt strings and colors if cache_size == 0: if ps1.find('%n') > -1 or ps1.find(r'\#') > -1 \ or ps1.find(r'\N') > -1: ps1 = '>>> ' if ps2.find('%n') > -1 or ps2.find(r'\#') > -1 \ or ps2.find(r'\N') > -1: ps2 = '... ' self.ps1_str = self._set_prompt_str(ps1, 'In [\\#]: ', '>>> ') self.ps2_str = self._set_prompt_str(ps2, ' .\\D.: ', '... ') self.ps_out_str = self._set_prompt_str(ps_out, 'Out[\\#]: ', '') self.color_table = prompts.PromptColors self.prompt1 = prompts.Prompt1(self, sep=input_sep, prompt=self.ps1_str, pad_left=pad_left) self.prompt2 = prompts.Prompt2(self, prompt=self.ps2_str, pad_left=pad_left) self.prompt_out = prompts.PromptOut(self, sep='', prompt=self.ps_out_str, pad_left=pad_left) self.set_colors(colors) # Store the last prompt string each time, we need it for aligning # continuation and auto-rewrite prompts self.last_prompt = '' self.output_sep = output_sep self.output_sep2 = output_sep2 self._, self.__, self.___ = '', '', '' # these are deliberately global: to_user_ns = {'_': self._, '__': self.__, '___': self.___} self.shell.user_ns.update(to_user_ns)
def make_exclude(): """Make patterns of modules and packages to exclude from testing. For the IPythonDoctest plugin, we need to exclude certain patterns that cause testing problems. We should strive to minimize the number of skipped modules, since this means untested code. These modules and packages will NOT get scanned by nose at all for tests. """ # Simple utility to make IPython paths more readably, we need a lot of # these below ipjoin = lambda *paths: pjoin('IPython', *paths) exclusions = [ ipjoin('external'), ipjoin('quarantine'), ipjoin('deathrow'), # This guy is probably attic material ipjoin('testing', 'mkdoctests'), # Testing inputhook will need a lot of thought, to figure out # how to have tests that don't lock up with the gui event # loops in the picture ipjoin('lib', 'inputhook'), # Config files aren't really importable stand-alone ipjoin('config', 'profile'), ] if not have['sqlite3']: exclusions.append(ipjoin('core', 'tests', 'test_history')) exclusions.append(ipjoin('core', 'history')) if not have['wx']: exclusions.append(ipjoin('lib', 'inputhookwx')) # We do this unconditionally, so that the test suite doesn't import # gtk, changing the default encoding and masking some unicode bugs. exclusions.append(ipjoin('lib', 'inputhookgtk')) exclusions.append(ipjoin('zmq', 'gui', 'gtkembed')) # These have to be skipped on win32 because the use echo, rm, cd, etc. # See ticket https://github.com/ipython/ipython/issues/87 if sys.platform == 'win32': exclusions.append(ipjoin('testing', 'plugin', 'test_exampleip')) exclusions.append(ipjoin('testing', 'plugin', 'dtexample')) if not have['pexpect']: exclusions.extend([ ipjoin('scripts', 'irunner'), ipjoin('lib', 'irunner'), ipjoin('lib', 'tests', 'test_irunner'), ipjoin('frontend', 'terminal', 'console'), ]) if not have['zmq']: exclusions.append(ipjoin('zmq')) exclusions.append(ipjoin('frontend', 'qt')) exclusions.append(ipjoin('frontend', 'html')) exclusions.append(ipjoin('frontend', 'consoleapp.py')) exclusions.append(ipjoin('frontend', 'terminal', 'console')) exclusions.append(ipjoin('parallel')) elif not have['qt'] or not have['pygments']: exclusions.append(ipjoin('frontend', 'qt')) if not have['pymongo']: exclusions.append(ipjoin('parallel', 'controller', 'mongodb')) exclusions.append(ipjoin('parallel', 'tests', 'test_mongodb')) if not have['matplotlib']: exclusions.extend([ ipjoin('core', 'pylabtools'), ipjoin('core', 'tests', 'test_pylabtools'), ipjoin('zmq', 'pylab'), ]) if not have['cython']: exclusions.extend([ipjoin('extensions', 'cythonmagic')]) exclusions.extend([ipjoin('extensions', 'tests', 'test_cythonmagic')]) if not have['tornado']: exclusions.append(ipjoin('frontend', 'html')) if not have['rpy2'] or not have['numpy']: exclusions.append(ipjoin('extensions', 'rmagic')) exclusions.append(ipjoin('extensions', 'tests', 'test_rmagic')) # This is needed for the reg-exp to match on win32 in the ipdoctest plugin. if sys.platform == 'win32': exclusions = [s.replace('\\', '\\\\') for s in exclusions] # check for any exclusions that don't seem to exist: parent, _ = os.path.split(get_ipython_package_dir()) for exclusion in exclusions: fullpath = pjoin(parent, exclusion) if not os.path.exists(fullpath) and not os.path.exists(fullpath + '.py'): warn("Excluding nonexistent file: %r\n" % exclusion) return exclusions
def magic_history(self, parameter_s=''): """Print input history (_i<n> variables), with most recent last. %history -> print at most 40 inputs (some may be multi-line)\\ %history n -> print at most n inputs\\ %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\ By default, input history is printed without line numbers so it can be directly pasted into an editor. With -n, each input's number <n> is shown, and is accessible as the automatically generated variable _i<n> as well as In[<n>]. Multi-line statements are printed starting at a new line for easy copy/paste. Options: -n: print line numbers for each input. This feature is only available if numbered prompts are in use. -o: also print outputs for each input. -p: print classic '>>>' python prompts before each input. This is useful for making documentation, and in conjunction with -o, for producing doctest-ready output. -r: (default) print the 'raw' history, i.e. the actual commands you typed. -t: print the 'translated' history, as IPython understands it. IPython filters your input and converts it all into valid Python source before executing it (things like magics or aliases are turned into function calls, for example). With this option, you'll see the native history instead of the user-entered version: '%cd /' will be seen as 'get_ipython().magic("%cd /")' instead of '%cd /'. -g: treat the arg as a pattern to grep for in (full) history. This includes the "shadow history" (almost all commands ever written). Use '%hist -g' to show full shadow history (may be very long). In shadow history, every index nuwber starts with 0. -f FILENAME: instead of printing the output to the screen, redirect it to the given file. The file is always overwritten, though IPython asks for confirmation first if it already exists. Examples -------- :: In [6]: %hist -n 4 6 4:a = 12 5:print a**2 """ if not self.shell.displayhook.do_full_cache: print('This feature is only available if numbered prompts are in use.') return opts, args = self.parse_options(parameter_s, 'gnoptsrf:', mode='list') # Check if output to specific file was requested. try: outfname = opts['f'] except KeyError: outfile = IPython.utils.io.Term.cout # default # We don't want to close stdout at the end! close_at_end = False else: if os.path.exists(outfname): if not ask_yes_no("File %r exists. Overwrite?" % outfname): print('Aborting.') return outfile = open(outfname, 'w') close_at_end = True if 't' in opts: input_hist = self.shell.history_manager.input_hist_parsed elif 'r' in opts: input_hist = self.shell.history_manager.input_hist_raw else: # Raw history is the default input_hist = self.shell.history_manager.input_hist_raw default_length = 40 pattern = None if 'g' in opts: init = 1 final = len(input_hist) parts = parameter_s.split(None, 1) if len(parts) == 1: parts += '*' head, pattern = parts pattern = "*" + pattern + "*" elif len(args) == 0: final = len(input_hist) - 1 init = max(1, final - default_length) elif len(args) == 1: final = len(input_hist) init = max(1, final - int(args[0])) elif len(args) == 2: init, final = map(int, args) else: warn('%hist takes 0, 1 or 2 arguments separated by spaces.') print(self.magic_hist.__doc__, file=IPython.utils.io.Term.cout) return width = len(str(final)) line_sep = ['', '\n'] print_nums = 'n' in opts print_outputs = 'o' in opts pyprompts = 'p' in opts found = False if pattern is not None: sh = self.shell.history_manager.shadowhist.all() for idx, s in sh: if fnmatch.fnmatch(s, pattern): print("0%d: %s" % (idx, s.expandtabs(4)), file=outfile) found = True if found: print("===", file=outfile) print( "shadow history ends, fetch by %rep <number> (must start with 0)", file=outfile) print("=== start of normal history ===", file=outfile) for in_num in range(init, final): # Print user history with tabs expanded to 4 spaces. The GUI clients # use hard tabs for easier usability in auto-indented code, but we want # to produce PEP-8 compliant history for safe pasting into an editor. inline = input_hist[in_num].expandtabs(4).rstrip() + '\n' if pattern is not None and not fnmatch.fnmatch(inline, pattern): continue multiline = int(inline.count('\n') > 1) if print_nums: print('%s:%s' % (str(in_num).ljust(width), line_sep[multiline]), file=outfile) if pyprompts: print('>>>', file=outfile) if multiline: lines = inline.splitlines() print('\n... '.join(lines), file=outfile) print('... ', file=outfile) else: print(inline, end='', file=outfile) else: print(inline, end='', file=outfile) if print_outputs: output = self.shell.history_manager.output_hist.get(in_num) if output is not None: print(repr(output), file=outfile) if close_at_end: outfile.close()
def run(self, parameter_s='', runner=None, file_finder=get_py_filename): """Run the named file inside IPython as a program. Usage: %run [-n -i -e -G] [( -t [-N<N>] | -d [-b<N>] | -p [profile options] )] ( -m mod | file ) [args] Parameters after the filename are passed as command-line arguments to the program (put in sys.argv). Then, control returns to IPython's prompt. This is similar to running at a system prompt:\\ $ python file args\\ but with the advantage of giving you IPython's tracebacks, and of loading all variables into your interactive namespace for further use (unless -p is used, see below). The file is executed in a namespace initially consisting only of __name__=='__main__' and sys.argv constructed as indicated. It thus sees its environment as if it were being run as a stand-alone program (except for sharing global objects such as previously imported modules). But after execution, the IPython interactive namespace gets updated with all variables defined in the program (except for __name__ and sys.argv). This allows for very convenient loading of code for interactive work, while giving each program a 'clean sheet' to run in. Arguments are expanded using shell-like glob match. Patterns '*', '?', '[seq]' and '[!seq]' can be used. Additionally, tilde '~' will be expanded into user's home directory. Unlike real shells, quotation does not suppress expansions. Use *two* back slashes (e.g., '\\\\*') to suppress expansions. To completely disable these expansions, you can use -G flag. Options: -n: __name__ is NOT set to '__main__', but to the running file's name without extension (as python does under import). This allows running scripts and reloading the definitions in them without calling code protected by an ' if __name__ == "__main__" ' clause. -i: run the file in IPython's namespace instead of an empty one. This is useful if you are experimenting with code written in a text editor which depends on variables defined interactively. -e: ignore sys.exit() calls or SystemExit exceptions in the script being run. This is particularly useful if IPython is being used to run unittests, which always exit with a sys.exit() call. In such cases you are interested in the output of the test results, not in seeing a traceback of the unittest module. -t: print timing information at the end of the run. IPython will give you an estimated CPU time consumption for your script, which under Unix uses the resource module to avoid the wraparound problems of time.clock(). Under Unix, an estimate of time spent on system tasks is also given (for Windows platforms this is reported as 0.0). If -t is given, an additional -N<N> option can be given, where <N> must be an integer indicating how many times you want the script to run. The final timing report will include total and per run results. For example (testing the script uniq_stable.py):: In [1]: run -t uniq_stable IPython CPU timings (estimated):\\ User : 0.19597 s.\\ System: 0.0 s.\\ In [2]: run -t -N5 uniq_stable IPython CPU timings (estimated):\\ Total runs performed: 5\\ Times : Total Per run\\ User : 0.910862 s, 0.1821724 s.\\ System: 0.0 s, 0.0 s. -d: run your program under the control of pdb, the Python debugger. This allows you to execute your program step by step, watch variables, etc. Internally, what IPython does is similar to calling: pdb.run('execfile("YOURFILENAME")') with a breakpoint set on line 1 of your file. You can change the line number for this automatic breakpoint to be <N> by using the -bN option (where N must be an integer). For example:: %run -d -b40 myscript will set the first breakpoint at line 40 in myscript.py. Note that the first breakpoint must be set on a line which actually does something (not a comment or docstring) for it to stop execution. Or you can specify a breakpoint in a different file:: %run -d -b myotherfile.py:20 myscript When the pdb debugger starts, you will see a (Pdb) prompt. You must first enter 'c' (without quotes) to start execution up to the first breakpoint. Entering 'help' gives information about the use of the debugger. You can easily see pdb's full documentation with "import pdb;pdb.help()" at a prompt. -p: run program under the control of the Python profiler module (which prints a detailed report of execution times, function calls, etc). You can pass other options after -p which affect the behavior of the profiler itself. See the docs for %prun for details. In this mode, the program's variables do NOT propagate back to the IPython interactive namespace (because they remain in the namespace where the profiler executes them). Internally this triggers a call to %prun, see its documentation for details on the options available specifically for profiling. There is one special usage for which the text above doesn't apply: if the filename ends with .ipy, the file is run as ipython script, just as if the commands were written on IPython prompt. -m: specify module name to load instead of script path. Similar to the -m option for the python interpreter. Use this option last if you want to combine with other %run options. Unlike the python interpreter only source modules are allowed no .pyc or .pyo files. For example:: %run -m example will run the example module. -G: disable shell-like glob expansion of arguments. """ # get arguments and set sys.argv for program to be run. opts, arg_lst = self.parse_options(parameter_s, 'nidtN:b:pD:l:rs:T:em:G', mode='list', list_all=1) if "m" in opts: modulename = opts["m"][0] modpath = find_mod(modulename) if modpath is None: warn('%r is not a valid modulename on sys.path' % modulename) return arg_lst = [modpath] + arg_lst try: filename = file_finder(arg_lst[0]) except IndexError: warn('you must provide at least a filename.') print '\n%run:\n', oinspect.getdoc(self.run) return except IOError as e: try: msg = str(e) except UnicodeError: msg = e.message error(msg) return if filename.lower().endswith('.ipy'): with preserve_keys(self.shell.user_ns, '__file__'): self.shell.user_ns['__file__'] = filename self.shell.safe_execfile_ipy(filename) return # Control the response to exit() calls made by the script being run exit_ignore = 'e' in opts # Make sure that the running script gets a proper sys.argv as if it # were run from a system shell. save_argv = sys.argv # save it for later restoring if 'G' in opts: args = arg_lst[1:] else: # tilde and glob expansion args = shellglob(map(os.path.expanduser, arg_lst[1:])) sys.argv = [filename] + args # put in the proper filename # protect sys.argv from potential unicode strings on Python 2: if not py3compat.PY3: sys.argv = [py3compat.cast_bytes(a) for a in sys.argv] if 'i' in opts: # Run in user's interactive namespace prog_ns = self.shell.user_ns __name__save = self.shell.user_ns['__name__'] prog_ns['__name__'] = '__main__' main_mod = self.shell.user_module else: # Run in a fresh, empty namespace if 'n' in opts: name = os.path.splitext(os.path.basename(filename))[0] else: name = '__main__' # The shell MUST hold a reference to prog_ns so after %run # exits, the python deletion mechanism doesn't zero it out # (leaving dangling references). See interactiveshell for details main_mod = self.shell.new_main_mod(filename) prog_ns = main_mod.__dict__ prog_ns['__name__'] = name # Since '%run foo' emulates 'python foo.py' at the cmd line, we must # set the __file__ global in the script's namespace prog_ns['__file__'] = filename # pickle fix. See interactiveshell for an explanation. But we need to # make sure that, if we overwrite __main__, we replace it at the end main_mod_name = prog_ns['__name__'] if main_mod_name == '__main__': restore_main = sys.modules['__main__'] else: restore_main = False # This needs to be undone at the end to prevent holding references to # every single object ever created. sys.modules[main_mod_name] = main_mod if 'p' in opts or 'd' in opts: if 'm' in opts: code = 'run_module(modulename, prog_ns)' code_ns = { 'run_module': self.shell.safe_run_module, 'prog_ns': prog_ns, 'modulename': modulename, } else: code = 'execfile(filename, prog_ns)' code_ns = { 'execfile': self.shell.safe_execfile, 'prog_ns': prog_ns, 'filename': get_py_filename(filename), } try: stats = None with self.shell.readline_no_record: if 'p' in opts: stats = self._run_with_profiler(code, opts, code_ns) else: if 'd' in opts: bp_file, bp_line = parse_breakpoint( opts.get('b', ['1'])[0], filename) self._run_with_debugger(code, code_ns, filename, bp_line, bp_file) else: if 'm' in opts: def run(): self.shell.safe_run_module(modulename, prog_ns) else: if runner is None: runner = self.default_runner if runner is None: runner = self.shell.safe_execfile def run(): runner(filename, prog_ns, prog_ns, exit_ignore=exit_ignore) if 't' in opts: # timed execution try: nruns = int(opts['N'][0]) if nruns < 1: error('Number of runs must be >=1') return except (KeyError): nruns = 1 self._run_with_timing(run, nruns) else: # regular execution run() if 'i' in opts: self.shell.user_ns['__name__'] = __name__save else: # update IPython interactive namespace # Some forms of read errors on the file may mean the # __name__ key was never set; using pop we don't have to # worry about a possible KeyError. prog_ns.pop('__name__', None) with preserve_keys(self.shell.user_ns, '__file__'): self.shell.user_ns.update(prog_ns) finally: # It's a bit of a mystery why, but __builtins__ can change from # being a module to becoming a dict missing some key data after # %run. As best I can see, this is NOT something IPython is doing # at all, and similar problems have been reported before: # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html # Since this seems to be done by the interpreter itself, the best # we can do is to at least restore __builtins__ for the user on # exit. self.shell.user_ns['__builtins__'] = builtin_mod # Ensure key global structures are restored sys.argv = save_argv if restore_main: sys.modules['__main__'] = restore_main else: # Remove from sys.modules the reference to main_mod we'd # added. Otherwise it will trap references to objects # contained therein. del sys.modules[main_mod_name] return stats
def make_exclude(): """Make patterns of modules and packages to exclude from testing. For the IPythonDoctest plugin, we need to exclude certain patterns that cause testing problems. We should strive to minimize the number of skipped modules, since this means untested code. These modules and packages will NOT get scanned by nose at all for tests. """ # Simple utility to make IPython paths more readably, we need a lot of # these below ipjoin = lambda *paths: pjoin('IPython', *paths) exclusions = [ ipjoin('external'), ipjoin('quarantine'), ipjoin('deathrow'), # This guy is probably attic material ipjoin('testing', 'mkdoctests'), # Testing inputhook will need a lot of thought, to figure out # how to have tests that don't lock up with the gui event # loops in the picture ipjoin('lib', 'inputhook'), # Config files aren't really importable stand-alone ipjoin('config', 'profile'), # The notebook 'static' directory contains JS, css and other # files for web serving. Occasionally projects may put a .py # file in there (MathJax ships a conf.py), so we might as # well play it safe and skip the whole thing. ipjoin('html', 'static'), ipjoin('html', 'fabfile'), ] if not have['sqlite3']: exclusions.append(ipjoin('core', 'tests', 'test_history')) exclusions.append(ipjoin('core', 'history')) if not have['wx']: exclusions.append(ipjoin('lib', 'inputhookwx')) if 'IPython.kernel.inprocess' not in sys.argv: exclusions.append(ipjoin('kernel', 'inprocess')) # FIXME: temporarily disable autoreload tests, as they can produce # spurious failures in subsequent tests (cythonmagic). exclusions.append(ipjoin('extensions', 'autoreload')) exclusions.append(ipjoin('extensions', 'tests', 'test_autoreload')) # We do this unconditionally, so that the test suite doesn't import # gtk, changing the default encoding and masking some unicode bugs. exclusions.append(ipjoin('lib', 'inputhookgtk')) exclusions.append(ipjoin('kernel', 'zmq', 'gui', 'gtkembed')) #Also done unconditionally, exclude nbconvert directories containing #config files used to test. Executing the config files with iptest would #cause an exception. exclusions.append(ipjoin('nbconvert', 'tests', 'files')) exclusions.append(ipjoin('nbconvert', 'exporters', 'tests', 'files')) # These have to be skipped on win32 because the use echo, rm, cd, etc. # See ticket https://github.com/ipython/ipython/issues/87 if sys.platform == 'win32': exclusions.append(ipjoin('testing', 'plugin', 'test_exampleip')) exclusions.append(ipjoin('testing', 'plugin', 'dtexample')) if not have['pexpect']: exclusions.extend([ ipjoin('lib', 'irunner'), ipjoin('lib', 'tests', 'test_irunner'), ipjoin('terminal', 'console'), ]) if not have['zmq']: exclusions.append(ipjoin('lib', 'kernel')) exclusions.append(ipjoin('kernel')) exclusions.append(ipjoin('qt')) exclusions.append(ipjoin('html')) exclusions.append(ipjoin('consoleapp.py')) exclusions.append(ipjoin('terminal', 'console')) exclusions.append(ipjoin('parallel')) elif not have['qt'] or not have['pygments']: exclusions.append(ipjoin('qt')) if not have['pymongo']: exclusions.append(ipjoin('parallel', 'controller', 'mongodb')) exclusions.append(ipjoin('parallel', 'tests', 'test_mongodb')) if not have['matplotlib']: exclusions.extend([ ipjoin('core', 'pylabtools'), ipjoin('core', 'tests', 'test_pylabtools'), ipjoin('kernel', 'zmq', 'pylab'), ]) if not have['cython']: exclusions.extend([ipjoin('extensions', 'cythonmagic')]) exclusions.extend([ipjoin('extensions', 'tests', 'test_cythonmagic')]) if not have['oct2py']: exclusions.extend([ipjoin('extensions', 'octavemagic')]) exclusions.extend([ipjoin('extensions', 'tests', 'test_octavemagic')]) if not have['tornado']: exclusions.append(ipjoin('html')) if not have['jinja2']: exclusions.append(ipjoin('html', 'notebookapp')) if not have['rpy2'] or not have['numpy']: exclusions.append(ipjoin('extensions', 'rmagic')) exclusions.append(ipjoin('extensions', 'tests', 'test_rmagic')) if not have['azure']: exclusions.append( ipjoin('html', 'services', 'notebooks', 'azurenbmanager')) if not all((have['pygments'], have['jinja2'], have['sphinx'])): exclusions.append(ipjoin('nbconvert')) # This is needed for the reg-exp to match on win32 in the ipdoctest plugin. if sys.platform == 'win32': exclusions = [s.replace('\\', '\\\\') for s in exclusions] # check for any exclusions that don't seem to exist: parent, _ = os.path.split(get_ipython_package_dir()) for exclusion in exclusions: if exclusion.endswith(('deathrow', 'quarantine')): # ignore deathrow/quarantine, which exist in dev, but not install continue fullpath = pjoin(parent, exclusion) if not os.path.exists(fullpath) and not glob.glob(fullpath + '.*'): warn("Excluding nonexistent file: %r" % exclusion) return exclusions
def _config_changed(self, name, old, new): # warn on change of renamed config section if new.InlineBackendConfig != old.InlineBackendConfig: warn("InlineBackendConfig has been renamed to InlineBackend") super(InlineBackend, self)._config_changed(name, old, new)
def logstart(self, parameter_s=''): """Start logging anywhere in a session. %logstart [-o|-r|-t] [log_name [log_mode]] If no name is given, it defaults to a file named 'ipython_log.py' in your current directory, in 'rotate' mode (see below). '%logstart name' saves to file 'name' in 'backup' mode. It saves your history up to that point and then continues logging. %logstart takes a second optional parameter: logging mode. This can be one of (note that the modes are given unquoted):\\ append: well, that says it.\\ backup: rename (if exists) to name~ and start name.\\ global: single logfile in your home dir, appended to.\\ over : overwrite existing log.\\ rotate: create rotating logs name.1~, name.2~, etc. Options: -o: log also IPython's output. In this mode, all commands which generate an Out[NN] prompt are recorded to the logfile, right after their corresponding input line. The output lines are always prepended with a '#[Out]# ' marker, so that the log remains valid Python code. Since this marker is always the same, filtering only the output from a log is very easy, using for example a simple awk call:: awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py -r: log 'raw' input. Normally, IPython's logs contain the processed input, so that user lines are logged in their final form, converted into valid Python. For example, %Exit is logged as _ip.magic("Exit"). If the -r flag is given, all input is logged exactly as typed, with no transformations applied. -t: put timestamps before each input line logged (these are put in comments).""" opts, par = self.parse_options(parameter_s, 'ort') log_output = 'o' in opts log_raw_input = 'r' in opts timestamp = 't' in opts logger = self.shell.logger # if no args are given, the defaults set in the logger constructor by # ipython remain valid if par: try: logfname, logmode = par.split() except: logfname = par logmode = 'backup' else: logfname = logger.logfname logmode = logger.logmode # put logfname into rc struct as if it had been called on the command # line, so it ends up saved in the log header Save it in case we need # to restore it... old_logfile = self.shell.logfile if logfname: logfname = os.path.expanduser(logfname) self.shell.logfile = logfname loghead = '# IPython log file\n\n' try: logger.logstart(logfname, loghead, logmode, log_output, timestamp, log_raw_input) except: self.shell.logfile = old_logfile warn("Couldn't start log: %s" % sys.exc_info()[1]) else: # log input history up to this point, optionally interleaving # output if requested if timestamp: # disable timestamping for the previous history, since we've # lost those already (no time machine here). logger.timestamp = False if log_raw_input: input_hist = self.shell.history_manager.input_hist_raw else: input_hist = self.shell.history_manager.input_hist_parsed if log_output: log_write = logger.log_write output_hist = self.shell.history_manager.output_hist for n in range(1, len(input_hist) - 1): log_write(input_hist[n].rstrip() + '\n') if n in output_hist: log_write(str_to_unicode(repr(output_hist[n])), 'output') else: logger.log_write('\n'.join(input_hist[1:])) logger.log_write('\n') if timestamp: # re-enable timestamping logger.timestamp = True print('Activating auto-logging. ' 'Current session state plus future input saved.') logger.logstate()
def color_switch_err(name): warn('Error changing %s color schemes.\n%s' % (name, sys.exc_info()[1]))
def interact(self, display_banner=None): """Closely emulate the interactive Python console.""" # batch run -> do not interact if self.exit_now: return if display_banner is None: display_banner = self.display_banner if isinstance(display_banner, py3compat.string_types): self.show_banner(display_banner) elif display_banner: self.show_banner() more = False if self.has_readline: self.readline_startup_hook(self.pre_readline) hlen_b4_cell = self.readline.get_current_history_length() else: hlen_b4_cell = 0 # exit_now is set by a call to %Exit or %Quit, through the # ask_exit callback. while not self.exit_now: self.hooks.pre_prompt_hook() if more: try: prompt = self.prompt_manager.render('in2') except: self.showtraceback() if self.autoindent: self.rl_do_indent = True else: try: prompt = self.separate_in + self.prompt_manager.render( 'in') except: self.showtraceback() try: line = self.raw_input(prompt) if self.exit_now: # quick exit on sys.std[in|out] close break if self.autoindent: self.rl_do_indent = False except KeyboardInterrupt: #double-guard against keyboardinterrupts during kbdint handling try: self.write('\n' + self.get_exception_only()) source_raw = self.input_splitter.raw_reset() hlen_b4_cell = \ self._replace_rlhist_multiline(source_raw, hlen_b4_cell) more = False except KeyboardInterrupt: pass except EOFError: if self.autoindent: self.rl_do_indent = False if self.has_readline: self.readline_startup_hook(None) self.write('\n') self.exit() except bdb.BdbQuit: warn( 'The Python debugger has exited with a BdbQuit exception.\n' 'Because of how pdb handles the stack, it is impossible\n' 'for IPython to properly format this particular exception.\n' 'IPython will resume normal operation.') except: # exceptions here are VERY RARE, but they can be triggered # asynchronously by signal handlers, for example. self.showtraceback() else: try: self.input_splitter.push(line) more = self.input_splitter.push_accepts_more() except SyntaxError: # Run the code directly - run_cell takes care of displaying # the exception. more = False if (self.SyntaxTB.last_syntax_error and self.autoedit_syntax): self.edit_syntax_error() if not more: source_raw = self.input_splitter.raw_reset() self.run_cell(source_raw, store_history=True) hlen_b4_cell = \ self._replace_rlhist_multiline(source_raw, hlen_b4_cell) # Turn off the exit flag, so the mainloop can be restarted if desired self.exit_now = False
def interact(self, display_banner=None): """Closely emulate the interactive Python console.""" # batch run -> do not interact if self.exit_now: return if display_banner is None: display_banner = self.display_banner if isinstance(display_banner, string_types): self.show_banner(display_banner) elif display_banner: self.show_banner() more = False # run a non-empty no-op, so that we don't get a prompt until # we know the kernel is ready. This keeps the connection # message above the first prompt. if not self.wait_for_kernel(self.kernel_timeout): error("Kernel did not respond\n") return if self.has_readline: self.readline_startup_hook(self.pre_readline) hlen_b4_cell = self.readline.get_current_history_length() else: hlen_b4_cell = 0 # exit_now is set by a call to %Exit or %Quit, through the # ask_exit callback. while not self.exit_now: if not self.client.is_alive(): # kernel died, prompt for action or exit action = "restart" if self.manager else "wait for restart" ans = self.ask_yes_no("kernel died, %s ([y]/n)?" % action, default='y') if ans: if self.manager: self.manager.restart_kernel(True) self.wait_for_kernel(self.kernel_timeout) else: self.exit_now = True continue try: # protect prompt block from KeyboardInterrupt # when sitting on ctrl-C self.hooks.pre_prompt_hook() if more: try: prompt = self.prompt_manager.render('in2') except Exception: self.showtraceback() if self.autoindent: self.rl_do_indent = True else: try: prompt = self.separate_in + self.prompt_manager.render('in') except Exception: self.showtraceback() line = self.raw_input(prompt) if self.exit_now: # quick exit on sys.std[in|out] close break if self.autoindent: self.rl_do_indent = False except KeyboardInterrupt: #double-guard against keyboardinterrupts during kbdint handling try: self.write('\n' + self.get_exception_only()) source_raw = self.input_splitter.raw_reset() hlen_b4_cell = self._replace_rlhist_multiline(source_raw, hlen_b4_cell) more = False except KeyboardInterrupt: pass except EOFError: if self.autoindent: self.rl_do_indent = False if self.has_readline: self.readline_startup_hook(None) self.write('\n') self.exit() except bdb.BdbQuit: warn('The Python debugger has exited with a BdbQuit exception.\n' 'Because of how pdb handles the stack, it is impossible\n' 'for IPython to properly format this particular exception.\n' 'IPython will resume normal operation.') except: # exceptions here are VERY RARE, but they can be triggered # asynchronously by signal handlers, for example. self.showtraceback() else: try: self.input_splitter.push(line) more = self.input_splitter.push_accepts_more() except SyntaxError: # Run the code directly - run_cell takes care of displaying # the exception. more = False if (self.SyntaxTB.last_syntax_error and self.autoedit_syntax): self.edit_syntax_error() if not more: source_raw = self.input_splitter.raw_reset() hlen_b4_cell = self._replace_rlhist_multiline(source_raw, hlen_b4_cell) self.run_cell(source_raw) # Turn off the exit flag, so the mainloop can be restarted if desired self.exit_now = False
def init_readline(self): """Command history completion/saving/reloading.""" if self.readline_use: import IPython.utils.rlineimpl as readline self.rl_next_input = None self.rl_do_indent = False if not self.readline_use or not readline.have_readline: self.readline = None # Set a number of methods that depend on readline to be no-op self.readline_no_record = NoOpContext() self.set_readline_completer = no_op self.set_custom_completer = no_op if self.readline_use: warn('Readline services not available or not loaded.') else: self.has_readline = True self.readline = readline sys.modules['readline'] = readline # Platform-specific configuration if os.name == 'nt': # FIXME - check with Frederick to see if we can harmonize # naming conventions with pyreadline to avoid this # platform-dependent check self.readline_startup_hook = readline.set_pre_input_hook else: self.readline_startup_hook = readline.set_startup_hook # Readline config order: # - IPython config (default value) # - custom inputrc # - IPython config (user customized) # load IPython config before inputrc if default # skip if libedit because parse_and_bind syntax is different if not self._custom_readline_config and not readline.uses_libedit: for rlcommand in self.readline_parse_and_bind: readline.parse_and_bind(rlcommand) # Load user's initrc file (readline config) # Or if libedit is used, load editrc. inputrc_name = os.environ.get('INPUTRC') if inputrc_name is None: inputrc_name = '.inputrc' if readline.uses_libedit: inputrc_name = '.editrc' inputrc_name = os.path.join(self.home_dir, inputrc_name) if os.path.isfile(inputrc_name): try: readline.read_init_file(inputrc_name) except: warn('Problems reading readline initialization file <%s>' % inputrc_name) # load IPython config after inputrc if user has customized if self._custom_readline_config: for rlcommand in self.readline_parse_and_bind: readline.parse_and_bind(rlcommand) # Remove some chars from the delimiters list. If we encounter # unicode chars, discard them. delims = readline.get_completer_delims() if not py3compat.PY3: delims = delims.encode("ascii", "ignore") for d in self.readline_remove_delims: delims = delims.replace(d, "") delims = delims.replace(ESC_MAGIC, '') readline.set_completer_delims(delims) # Store these so we can restore them if something like rpy2 modifies # them. self.readline_delims = delims # otherwise we end up with a monster history after a while: readline.set_history_length(self.history_length) self.refill_readline_hist() self.readline_no_record = ReadlineNoRecord(self) # Configure auto-indent for all platforms self.set_autoindent(self.autoindent)
def raw_input(self, prompt='', continue_prompt=False): """Write a prompt and read a line. The returned line does not include the trailing newline. When the user enters the EOF key sequence, EOFError is raised. Optional inputs: - prompt(''): a string to be printed to prompt the user. - continue_prompt(False): whether this line is the first one or a continuation in a sequence of inputs. """ # Code run by the user may have modified the readline completer state. # We must ensure that our completer is back in place. if self.has_readline: self.set_readline_completer() try: line = raw_input_original(prompt).decode(self.stdin_encoding) except ValueError: warn("\n********\nYou or a %run:ed script called sys.stdin.close()" " or sys.stdout.close()!\nExiting IPython!") self.ask_exit() return "" # Try to be reasonably smart about not re-indenting pasted input more # than necessary. We do this by trimming out the auto-indent initial # spaces, if the user's actual input started itself with whitespace. if self.autoindent: if num_ini_spaces(line) > self.indent_current_nsp: line = line[self.indent_current_nsp:] self.indent_current_nsp = 0 # store the unfiltered input before the user has any chance to modify # it. if line.strip(): if continue_prompt: if self.has_readline and self.readline_use: histlen = self.readline.get_current_history_length() if histlen > 1: newhist = self.history_manager.input_hist_raw[ -1].rstrip() self.readline.remove_history_item(histlen - 1) self.readline.replace_history_item( histlen - 2, newhist.encode(self.stdin_encoding)) else: self.history_manager.input_hist_raw.append('%s\n' % line) elif not continue_prompt: self.history_manager.input_hist_raw.append('\n') try: lineout = self.prefilter_manager.prefilter_lines( line, continue_prompt) except: # blanket except, in case a user-defined prefilter crashes, so it # can't take all of ipython with it. self.showtraceback() return '' else: return lineout