##// END OF EJS Templates
Merge pull request #507 from takluyver/prompt-manager...
Merge pull request #507 from takluyver/prompt-manager Prompt manager refactoring: use a new `PromptManager` class responsible for handling everything to do with the prompts. The critical part is its `render` method, which assembles the necessary information, then uses the string formatting introduced in Python 2.6 to fill in the prompt template. I've expanded the definition of 'prompts' to include the auto_rewrite prompt (`"------> "` by default). So there are now four prompts: input, continuation, output, and rewrite. This definition of prompts does not include input/output separators. For now, I've left those as attributes of the main InteractiveShell object.

File last commit:

r5390:c82649ea
r5526:272152cc merge
Show More
parallelmagic.py
325 lines | 10.1 KiB | text/x-python | PythonLexer
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 # encoding: utf-8
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 """
=============
parallelmagic
=============
Magic command interface for interactive parallel work.
Usage
=====
``%autopx``
@AUTOPX_DOC@
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 ``%px``
@PX_DOC@
``%result``
@RESULT_DOC@
"""
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
#-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2008-2011 The IPython Development Team
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
MinRK
update parallel_magic for Views...
r3689 import ast
import re
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Brian Granger
Finishing work on configurables, plugins and extensions.
r2738 from IPython.core.plugin import Plugin
Brian Granger
First take at cleaning up extensions.
r2732 from IPython.utils.traitlets import Bool, Any, Instance
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 from IPython.testing.skipdoctest import skip_doctest
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
#-----------------------------------------------------------------------------
# Definitions of magic functions for use with IPython
#-----------------------------------------------------------------------------
MinRK
update parallel_magic for Views...
r3689 NO_ACTIVE_VIEW = """
Use activate() on a DirectView object to activate it for magics.
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """
Brian Granger
Finishing work on configurables, plugins and extensions.
r2738 class ParalleMagic(Plugin):
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """A component to manage the %result, %px and %autopx magics."""
MinRK
add tests for parallel magics...
r3736 active_view = Instance('IPython.parallel.client.view.DirectView')
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 verbose = Bool(False, config=True)
Brian Granger
Moving and renaming in preparation of subclassing InteractiveShell....
r2760 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Brian Granger
Adding support for HasTraits to take keyword arguments.
r2740 def __init__(self, shell=None, config=None):
super(ParalleMagic, self).__init__(shell=shell, config=config)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 self._define_magics()
# A flag showing if autopx is activated or not
self.autopx = False
def _define_magics(self):
"""Define the magic functions."""
self.shell.define_magic('result', self.magic_result)
self.shell.define_magic('px', self.magic_px)
self.shell.define_magic('autopx', self.magic_autopx)
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 @skip_doctest
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 def magic_result(self, ipself, parameter_s=''):
"""Print the result of command i on all engines..
Bernardo B. Marques
remove all trailling spaces
r4872 To use this a :class:`DirectView` instance must be created
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 and then activated by calling its :meth:`activate` method.
Then you can do the following::
In [23]: %result
Bernardo B. Marques
remove all trailling spaces
r4872 Out[23]:
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 <Results List>
[0] In [6]: a = 10
[1] In [6]: a = 10
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 In [22]: %result 6
Bernardo B. Marques
remove all trailling spaces
r4872 Out[22]:
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 <Results List>
[0] In [6]: a = 10
[1] In [6]: a = 10
"""
MinRK
update parallel_magic for Views...
r3689 if self.active_view is None:
print NO_ACTIVE_VIEW
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return
try:
index = int(parameter_s)
except:
index = None
MinRK
update parallel_magic for Views...
r3689 result = self.active_view.get_result(index)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return result
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 @skip_doctest
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 def magic_px(self, ipself, parameter_s=''):
"""Executes the given python command in parallel.
Bernardo B. Marques
remove all trailling spaces
r4872 To use this a :class:`DirectView` instance must be created
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 and then activated by calling its :meth:`activate` method.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 Then you can do the following::
In [24]: %px a = 5
MinRK
fix %px magic output for single target...
r3997 Parallel execution on engine(s): all
Bernardo B. Marques
remove all trailling spaces
r4872 Out[24]:
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 <Results List>
[0] In [7]: a = 5
[1] In [7]: a = 5
"""
MinRK
update parallel_magic for Views...
r3689 if self.active_view is None:
print NO_ACTIVE_VIEW
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return
MinRK
fix %px magic output for single target...
r3997 print "Parallel execution on engine(s): %s" % self.active_view.targets
MinRK
add tests for parallel magics...
r3736 result = self.active_view.execute(parameter_s, block=False)
if self.active_view.block:
result.get()
self._maybe_display_output(result)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 @skip_doctest
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 def magic_autopx(self, ipself, parameter_s=''):
"""Toggles auto parallel mode.
Bernardo B. Marques
remove all trailling spaces
r4872 To use this a :class:`DirectView` instance must be created
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 and then activated by calling its :meth:`activate` method. Once this
is called, all commands typed at the command line are send to
the engines to be executed in parallel. To control which engine
are used, set the ``targets`` attributed of the multiengine client
before entering ``%autopx`` mode.
Then you can do the following::
In [25]: %autopx
%autopx to enabled
In [26]: a = 10
MinRK
fix %px magic output for single target...
r3997 Parallel execution on engine(s): [0,1,2,3]
MinRK
add tests for parallel magics...
r3736 In [27]: print a
MinRK
fix %px magic output for single target...
r3997 Parallel execution on engine(s): [0,1,2,3]
MinRK
add tests for parallel magics...
r3736 [stdout:0] 10
[stdout:1] 10
[stdout:2] 10
[stdout:3] 10
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
In [27]: %autopx
%autopx disabled
"""
if self.autopx:
self._disable_autopx()
else:
self._enable_autopx()
def _enable_autopx(self):
Bernardo B. Marques
remove all trailling spaces
r4872 """Enable %autopx mode by saving the original run_cell and installing
MinRK
update parallel_magic for Views...
r3689 pxrun_cell.
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """
MinRK
update parallel_magic for Views...
r3689 if self.active_view is None:
print NO_ACTIVE_VIEW
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 # override run_cell and run_code
MinRK
update parallel_magic for Views...
r3689 self._original_run_cell = self.shell.run_cell
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 self.shell.run_cell = self.pxrun_cell
self._original_run_code = self.shell.run_code
self.shell.run_code = self.pxrun_code
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 self.autopx = True
print "%autopx enabled"
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 def _disable_autopx(self):
MinRK
update parallel_magic for Views...
r3689 """Disable %autopx by restoring the original InteractiveShell.run_cell.
Fernando Perez
Update many names to pep-8: savehist -> save_hist....
r3096 """
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 if self.autopx:
MinRK
update parallel_magic for Views...
r3689 self.shell.run_cell = self._original_run_cell
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 self.shell.run_code = self._original_run_code
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 self.autopx = False
print "%autopx disabled"
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 def _maybe_display_output(self, result):
"""Maybe display the output of a parallel result.
If self.active_view.block is True, wait for the result
and display the result. Otherwise, this is a noop.
"""
MinRK
fix %px magic output for single target...
r3997 if isinstance(result.stdout, basestring):
# single result
stdouts = [result.stdout.rstrip()]
else:
stdouts = [s.rstrip() for s in result.stdout]
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
add tests for parallel magics...
r3736 targets = self.active_view.targets
if isinstance(targets, int):
targets = [targets]
MinRK
fix %px magic output for single target...
r3997 elif targets == 'all':
MinRK
add tests for parallel magics...
r3736 targets = self.active_view.client.ids
MinRK
fix %px magic output for single target...
r3997
if any(stdouts):
for eid,stdout in zip(targets, stdouts):
print '[stdout:%i]'%eid, stdout
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738 def pxrun_cell(self, raw_cell, store_history=True):
MinRK
update parallel_magic for Views...
r3689 """drop-in replacement for InteractiveShell.run_cell.
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 This executes code remotely, instead of in the local namespace.
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
See InteractiveShell.run_cell for details.
MinRK
update parallel_magic for Views...
r3689 """
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738 if (not raw_cell) or raw_cell.isspace():
return
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 ipself = self.shell
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 with ipself.builtin_trap:
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738 cell = ipself.prefilter_manager.prefilter_lines(raw_cell)
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 # Store raw and processed history
if store_history:
Bernardo B. Marques
remove all trailling spaces
r4872 ipself.history_manager.store_inputs(ipself.execution_count,
MinRK
update parallel_magic for Views...
r3689 cell, raw_cell)
Brian Granger
Updating IPython.kernel to fix minor bugs....
r3239
MinRK
update parallel_magic for Views...
r3689 # ipself.logger.log(cell, raw_cell)
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 cell_name = ipself.compile.cache(cell, ipself.execution_count)
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 try:
code_ast = ast.parse(cell, filename=cell_name)
except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
# Case 1
ipself.showsyntaxerror()
ipself.execution_count += 1
return None
except NameError:
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 # ignore name errors, because we don't know the remote keys
MinRK
update parallel_magic for Views...
r3689 pass
if store_history:
# Write output to the database. Does nothing unless
# history output logging is enabled.
ipself.history_manager.store_output(ipself.execution_count)
# Each cell is a *single* input, regardless of how many lines it has
ipself.execution_count += 1
MinRK
fix autopx regex after recent change...
r5364 if re.search(r'get_ipython\(\)\.magic\(u?["\']%?autopx', cell):
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 self._disable_autopx()
return False
else:
try:
MinRK
update parallel_magic for Views...
r3689 result = self.active_view.execute(cell, block=False)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 except:
ipself.showtraceback()
MinRK
add tests for parallel magics...
r3736 return True
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 else:
MinRK
add tests for parallel magics...
r3736 if self.active_view.block:
try:
result.get()
except:
self.shell.showtraceback()
return True
else:
self._maybe_display_output(result)
return False
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738 def pxrun_code(self, code_obj):
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 """drop-in replacement for InteractiveShell.run_code.
This executes code remotely, instead of in the local namespace.
See InteractiveShell.run_code for details.
"""
ipself = self.shell
# check code object for the autopx magic
if 'get_ipython' in code_obj.co_names and 'magic' in code_obj.co_names and \
any( [ isinstance(c, basestring) and 'autopx' in c for c in code_obj.co_consts ]):
self._disable_autopx()
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return False
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 else:
try:
result = self.active_view.execute(code_obj, block=False)
except:
ipself.showtraceback()
MinRK
add tests for parallel magics...
r3736 return True
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 else:
MinRK
add tests for parallel magics...
r3736 if self.active_view.block:
try:
result.get()
except:
self.shell.showtraceback()
return True
else:
self._maybe_display_output(result)
return False
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 __doc__ = __doc__.replace('@AUTOPX_DOC@',
" " + ParalleMagic.magic_autopx.__doc__)
__doc__ = __doc__.replace('@PX_DOC@',
" " + ParalleMagic.magic_px.__doc__)
__doc__ = __doc__.replace('@RESULT_DOC@',
" " + ParalleMagic.magic_result.__doc__)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
_loaded = False
def load_ipython_extension(ip):
"""Load the extension in IPython."""
global _loaded
if not _loaded:
Brian Granger
Adding support for HasTraits to take keyword arguments.
r2740 plugin = ParalleMagic(shell=ip, config=ip.config)
Brian Granger
Updating IPython.kernel to fix minor bugs....
r3239 ip.plugin_manager.register_plugin('parallelmagic', plugin)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 _loaded = True