##// END OF EJS Templates
Refactor static printing.
Refactor static printing.

File last commit:

r3997:b5507781
r4615:968e3fe4
Show More
parallelmagic.py
300 lines | 9.7 KiB | text/x-python | PythonLexer
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 #!/usr/bin/env python
# encoding: utf-8
"""Magic command interface for interactive parallel work."""
#-----------------------------------------------------------------------------
# Copyright (C) 2008-2009 The IPython Development Team
#
# 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..
MinRK
update parallel_magic for Views...
r3689 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
Out[23]:
<Results List>
[0] In [6]: a = 10
[1] In [6]: a = 10
In [22]: %result 6
Out[22]:
<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.
MinRK
update parallel_magic for Views...
r3689 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 [24]: %px a = 5
MinRK
fix %px magic output for single target...
r3997 Parallel execution on engine(s): all
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 Out[24]:
<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.
MinRK
update parallel_magic for Views...
r3689 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):
MinRK
update parallel_magic for Views...
r3689 """Enable %autopx mode by saving the original run_cell and installing
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"
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]
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.
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 """
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738
if (not raw_cell) or raw_cell.isspace():
return
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 ipself = self.shell
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738
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)
MinRK
update parallel_magic for Views...
r3689
# Store raw and processed history
if store_history:
ipself.history_manager.store_inputs(ipself.execution_count,
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)
Brian Granger
Updating IPython.kernel to fix minor bugs....
r3239
MinRK
update parallel_magic for Views...
r3689 cell_name = ipself.compile.cache(cell, ipself.execution_count)
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
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
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