##// END OF EJS Templates
General work on inputhook and the docs....
Brian Granger -
Show More

The requested changes are too big and content was truncated. Show full diff

1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,181 +1,226 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 Inputhook management for GUI event loop integration.
5 5 """
6 6
7 7 #-----------------------------------------------------------------------------
8 8 # Copyright (C) 2008-2009 The IPython Development Team
9 9 #
10 10 # Distributed under the terms of the BSD License. The full license is in
11 11 # the file COPYING, distributed as part of this software.
12 12 #-----------------------------------------------------------------------------
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Imports
16 16 #-----------------------------------------------------------------------------
17 17
18 18 import ctypes
19 19 import sys
20 20
21 21 #-----------------------------------------------------------------------------
22 22 # Code
23 23 #-----------------------------------------------------------------------------
24 24
25 25
26 26 class InputHookManager(object):
27 """Manage PyOS_InputHook for different GUI toolkits."""
27 """Manage PyOS_InputHook for different GUI toolkits.
28
29 This class installs various hooks under ``PyOSInputHook`` to handle
30 GUI event loop integration.
31 """
28 32
29 33 def __init__(self):
30 34 self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int)
31 35 self._reset()
32 36
33 37 def _reset(self):
34 38 self._callback_pyfunctype = None
35 39 self._callback = None
36 40 self._installed = False
41 self._current_gui = None
37 42
38 43 def get_pyos_inputhook(self):
39 44 """Return the current PyOS_InputHook as a ctypes.c_void_p.
40 45 """
41 46 return ctypes.c_void_p.in_dll(ctypes.pythonapi,"PyOS_InputHook")
42 47
43 48 def get_pyos_inputhook_as_func(self):
44 49 """Return the current PyOS_InputHook as a ctypes.PYFUNCYPE.
45 50 """
46 51 return self.PYFUNC.in_dll(ctypes.pythonapi,"PyOS_InputHook")
47 52
48 53 def set_inputhook(self, callback):
49 54 """Set PyOS_InputHook to callback and return the previous one.
50 55 """
51 56 self._callback = callback
52 57 self._callback_pyfunctype = self.PYFUNC(callback)
53 58 pyos_inputhook_ptr = self.get_pyos_inputhook()
54 59 original = self.get_pyos_inputhook_as_func()
55 60 pyos_inputhook_ptr.value = \
56 61 ctypes.cast(self._callback_pyfunctype, ctypes.c_void_p).value
57 62 self._installed = True
58 63 return original
59 64
60 65 def clear_inputhook(self):
61 66 """Set PyOS_InputHook to NULL and return the previous one.
62 67 """
63 68 pyos_inputhook_ptr = self.get_pyos_inputhook()
64 69 original = self.get_pyos_inputhook_as_func()
65 70 pyos_inputhook_ptr.value = ctypes.c_void_p(None).value
66 71 self._reset()
67 72 return original
68 73
69 74 def enable_wx(self, app=False):
70 75 """Enable event loop integration with wxPython.
71
76
77 Parameters
78 ----------
79 app : bool
80 Create a running application object or not.
81
82 Notes
83 -----
72 84 This methods sets the PyOS_InputHook for wxPython, which allows
73 85 the wxPython to integrate with terminal based applications like
74 86 IPython.
75 87
76 88 Once this has been called, you can use wx interactively by doing::
77 89
78 90 >>> import wx
79 91 >>> app = wx.App(redirect=False, clearSigInt=False)
80 92
81 93 Both options this constructor are important for things to work
82 94 properly in an interactive context.
83 95
84 96 But, *don't start the event loop*. That is handled automatically by
85 97 PyOS_InputHook.
86 98 """
87 99 from IPython.lib.inputhookwx import inputhook_wx
88 100 self.set_inputhook(inputhook_wx)
101 self._current_gui = 'wx'
89 102 if app:
90 103 import wx
91 104 app = wx.App(redirect=False, clearSigInt=False)
92 105 return app
93 106
94 107 def disable_wx(self):
95 108 """Disable event loop integration with wxPython.
96 109
97 110 This merely sets PyOS_InputHook to NULL.
98 111 """
99 112 self.clear_inputhook()
100 113
101 114 def enable_qt4(self, app=False):
102 115 """Enable event loop integration with PyQt4.
103 116
117 Parameters
118 ----------
119 app : bool
120 Create a running application object or not.
121
122 Notes
123 -----
104 124 This methods sets the PyOS_InputHook for wxPython, which allows
105 125 the PyQt4 to integrate with terminal based applications like
106 126 IPython.
107 127
108 128 Once this has been called, you can simply create a QApplication and
109 129 use it. But, *don't start the event loop*. That is handled
110 130 automatically by PyOS_InputHook.
111 131 """
112 132 from PyQt4 import QtCore
113 133 # PyQt4 has had this since 4.3.1. In version 4.2, PyOS_InputHook
114 134 # was set when QtCore was imported, but if it ever got removed,
115 135 # you couldn't reset it. For earlier versions we can
116 136 # probably implement a ctypes version.
117 137 try:
118 138 QtCore.pyqtRestoreInputHook()
119 139 except AttributeError:
120 140 pass
141 self._current_gui = 'qt4'
121 142 if app:
122 143 from PyQt4 import QtGui
123 144 app = QtGui.QApplication(sys.argv)
124 145 return app
125 146
126 147 def disable_qt4(self):
127 148 """Disable event loop integration with PyQt4.
128 149
129 150 This merely sets PyOS_InputHook to NULL.
130 151 """
131 152 self.clear_inputhook()
132 153
133 154 def enable_gtk(self, app=False):
134 155 """Enable event loop integration with PyGTK.
135
156
157 Parameters
158 ----------
159 app : bool
160 Create a running application object or not.
161
162 Notes
163 -----
136 164 This methods sets the PyOS_InputHook for PyGTK, which allows
137 165 the PyGTK to integrate with terminal based applications like
138 166 IPython.
139 167
140 168 Once this has been called, you can simple create PyGTK objects and
141 169 use them. But, *don't start the event loop*. That is handled
142 170 automatically by PyOS_InputHook.
143 171 """
144 172 import gtk
145 173 try:
146 174 gtk.set_interactive(True)
175 self._current_gui = 'gtk'
147 176 except AttributeError:
148 177 # For older versions of gtk, use our own ctypes version
149 178 from IPython.lib.inputhookgtk import inputhook_gtk
150 179 add_inputhook(inputhook_gtk)
151 180
152 181 def disable_gtk(self):
153 182 """Disable event loop integration with PyGTK.
154 183
155 184 This merely sets PyOS_InputHook to NULL.
156 185 """
157 186 self.clear_inputhook()
158 187
159 188 def enable_tk(self, app=False):
160 # Creating a Tkinter.Tk object sets PyOS_InputHook()
161 pass
189 """Enable event loop integration with Tk.
190
191 Parameters
192 ----------
193 app : bool
194 Create a running application object or not.
195
196 Notes
197 -----
198 Currently this is a no-op as creating a :class:`Tkinter.Tk` object
199 sets ``PyOS_InputHook``.
200 """
201 self._current_gui = 'tk'
162 202
163 203 def disable_tk(self):
164 204 """Disable event loop integration with Tkinter.
165 205
166 206 This merely sets PyOS_InputHook to NULL.
167 207 """
168 208 self.clear_inputhook()
169 209
210 def current_gui(self):
211 """Return a string indicating the currently active GUI or None."""
212 return self._current_gui
213
170 214 inputhook_manager = InputHookManager()
171 215
172 216 enable_wx = inputhook_manager.enable_wx
173 217 disable_wx = inputhook_manager.disable_wx
174 218 enable_qt4 = inputhook_manager.enable_qt4
175 219 disable_qt4 = inputhook_manager.disable_qt4
176 220 enable_gtk = inputhook_manager.enable_gtk
177 221 disable_gtk = inputhook_manager.disable_gtk
178 222 enable_tk = inputhook_manager.enable_tk
179 223 disable_tk = inputhook_manager.disable_tk
180 224 clear_inputhook = inputhook_manager.clear_inputhook
181 set_inputhook = inputhook_manager.set_inputhook No newline at end of file
225 set_inputhook = inputhook_manager.set_inputhook
226 current_gui = inputhook_manager.current_gui No newline at end of file
@@ -1,34 +1,36 b''
1 1 #!/usr/bin/env python
2 2 """Script to auto-generate our API docs.
3 3 """
4 4 # stdlib imports
5 5 import os
6 6 import sys
7 7
8 8 # local imports
9 9 sys.path.append(os.path.abspath('sphinxext'))
10 10 from apigen import ApiDocWriter
11 11
12 12 #*****************************************************************************
13 13 if __name__ == '__main__':
14 14 pjoin = os.path.join
15 15 package = 'IPython'
16 16 outdir = pjoin('source','api','generated')
17 17 docwriter = ApiDocWriter(package,rst_extension='.txt')
18 18 docwriter.package_skip_patterns += [r'\.fixes$',
19 19 r'\.externals$',
20 20 r'\.extensions',
21 21 r'\.kernel.config',
22 22 r'\.attic',
23 r'\.quarantine',
24 r'\.deathrow'
23 25 ]
24 docwriter.module_skip_patterns += [ r'\.FakeModule',
26 docwriter.module_skip_patterns += [ r'\.core.fakemodule',
25 27 r'\.cocoa',
26 28 r'\.ipdoctest',
27 29 r'\.Gnuplot',
28 30 r'\.frontend.process.winprocess',
29 31 ]
30 32 docwriter.write_api_docs(outdir)
31 33 docwriter.write_index(outdir, 'gen',
32 34 relative_to = pjoin('source','api')
33 35 )
34 36 print '%d files written' % len(docwriter.written_modules)
@@ -1,515 +1,517 b''
1 1 .. _development:
2 2
3 3 ==============================
4 4 IPython development guidelines
5 5 ==============================
6 6
7 7
8 8 Overview
9 9 ========
10 10
11 11 This document describes IPython from the perspective of developers. Most
12 12 importantly, it gives information for people who want to contribute to the
13 13 development of IPython. So if you want to help out, read on!
14 14
15 15 How to contribute to IPython
16 16 ============================
17 17
18 18 IPython development is done using Bazaar [Bazaar]_ and Launchpad [Launchpad]_.
19 19 This makes it easy for people to contribute to the development of IPython.
20 20 There are several ways in which you can join in.
21 21
22 22 If you have a small change that you want to send to the team, you can edit your
23 23 bazaar checkout of IPython (see below) in-place, and ask bazaar for the
24 24 differences::
25 25
26 26 $ cd /path/to/your/copy/of/ipython
27 27 $ bzr diff > my_fixes.diff
28 28
29 29 This produces a patch file with your fixes, which we can apply to the source
30 30 tree. This file should then be attached to a ticket in our `bug tracker
31 31 <https://bugs.launchpad.net/ipython>`_, indicating what it does.
32 32
33 33 This model of creating small, self-contained patches works very well and there
34 34 are open source projects that do their entire development this way. However,
35 35 in IPython we have found that for tracking larger changes, making use of
36 36 bazaar's full capabilities in conjunction with Launchpad's code hosting
37 37 services makes for a much better experience.
38 38
39 39 Making your own branch of IPython allows you to refine your changes over time,
40 40 track the development of the main team, and propose your own full version of
41 41 the code for others to use and review, with a minimum amount of fuss. The next
42 42 parts of this document will explain how to do this.
43 43
44 44 Install Bazaar and create a Launchpad account
45 45 ---------------------------------------------
46 46
47 47 First make sure you have installed Bazaar (see their `website
48 48 <http://bazaar-vcs.org/>`_). To see that Bazaar is installed and knows about
49 49 you, try the following::
50 50
51 51 $ bzr whoami
52 52 Joe Coder <jcoder@gmail.com>
53 53
54 54 This should display your name and email. Next, you will want to create an
55 55 account on the `Launchpad website <http://www.launchpad.net>`_ and setup your
56 56 ssh keys. For more information of setting up your ssh keys, see `this link
57 57 <https://help.launchpad.net/YourAccount/CreatingAnSSHKeyPair>`_.
58 58
59 59 Get the main IPython branch from Launchpad
60 60 ------------------------------------------
61 61
62 62 Now, you can get a copy of the main IPython development branch (we call this
63 63 the "trunk")::
64 64
65 65 $ bzr branch lp:ipython
66 66
67 67 Create a working branch
68 68 -----------------------
69 69
70 70 When working on IPython, you won't actually make edits directly to the
71 71 :file:`lp:ipython` branch. Instead, you will create a separate branch for your
72 72 changes. For now, let's assume you want to do your work in a branch named
73 73 "ipython-mybranch". Create this branch by doing::
74 74
75 75 $ bzr branch ipython ipython-mybranch
76 76
77 77 When you actually create a branch, you will want to give it a name that
78 78 reflects the nature of the work that you will be doing in it, like
79 79 "install-docs-update".
80 80
81 81 Make edits in your working branch
82 82 ---------------------------------
83 83
84 84 Now you are ready to actually make edits in your :file:`ipython-mybranch`
85 85 branch. Before doing this, it is helpful to install this branch so you can
86 86 test your changes as you work. This is easiest if you have setuptools
87 87 installed. Then, just do::
88 88
89 89 $ cd ipython-mybranch
90 90 $ python setupegg.py develop
91 91
92 92 Now, make some changes. After a while, you will want to commit your changes.
93 93 This let's Bazaar know that you like the changes you have made and gives you
94 94 an opportunity to keep a nice record of what you have done. This looks like
95 95 this::
96 96
97 97 $ ...do work in ipython-mybranch...
98 98 $ bzr commit -m "the commit message goes here"
99 99
100 100 Please note that since we now don't use an old-style linear ChangeLog (that
101 101 tends to cause problems with distributed version control systems), you should
102 102 ensure that your log messages are reasonably detailed. Use a docstring-like
103 103 approach in the commit messages (including the second line being left
104 104 *blank*)::
105 105
106 106 Single line summary of changes being committed.
107 107
108 108 * more details when warranted ...
109 109 * including crediting outside contributors if they sent the
110 110 code/bug/idea!
111 111
112 112 As you work, you will repeat this edit/commit cycle many times. If you work on
113 113 your branch for a long time, you will also want to get the latest changes from
114 114 the :file:`lp:ipython` branch. This can be done with the following sequence of
115 115 commands::
116 116
117 117 $ ls
118 118 ipython
119 119 ipython-mybranch
120 120
121 121 $ cd ipython
122 122 $ bzr pull
123 123 $ cd ../ipython-mybranch
124 124 $ bzr merge ../ipython
125 125 $ bzr commit -m "Merging changes from trunk"
126 126
127 127 Along the way, you should also run the IPython test suite. You can do this
128 128 using the :command:`iptest` command (which is basically a customized version of
129 129 :command:`nosetests`)::
130 130
131 131 $ cd
132 132 $ iptest
133 133
134 134 The :command:`iptest` command will also pick up and run any tests you have
135 written. See :ref:`_devel_testing` for further details on the testing system.
135 written. See :ref:`testing documentation <devel_testing>` for further details
136 on the testing system.
136 137
137 138
138 139 Post your branch and request a code review
139 140 ------------------------------------------
140 141
141 142 Once you are done with your edits, you should post your branch on Launchpad so
142 143 that other IPython developers can review the changes and help you merge your
143 144 changes into the main development branch. To post your branch on Launchpad,
144 145 do::
145 146
146 147 $ cd ipython-mybranch
147 148 $ bzr push lp:~yourusername/ipython/ipython-mybranch
148 149
149 150 Then, go to the `IPython Launchpad site <www.launchpad.net/ipython>`_, and you
150 151 should see your branch under the "Code" tab. If you click on your branch, you
151 152 can provide a short description of the branch as well as mark its status. Most
152 153 importantly, you should click the link that reads "Propose for merging into
153 154 another branch". What does this do?
154 155
155 156 This let's the other IPython developers know that your branch is ready to be
156 157 reviewed and merged into the main development branch. During this review
157 158 process, other developers will give you feedback and help you get your code
158 159 ready to be merged. What types of things will we be looking for:
159 160
160 161 * All code is documented.
161 162 * All code has tests.
162 163 * The entire IPython test suite passes.
163 164
164 165 Once your changes have been reviewed and approved, someone will merge them
165 166 into the main development branch.
166 167
167 168
168 169 Some notes for core developers when merging third-party contributions
169 170 =====================================================================
170 171
171 172 Core developers, who ultimately merge any approved branch (from themselves,
172 173 another developer, or any third-party contribution) will typically use
173 :command:`bzr merge` to merge the branch into the trunk and push it to the main
174 Launcphad site. This is a short list of things to keep in mind when doing this
175 process, so that the project history is easy to understand in the long run, and
176 that generating release notes is as painless and accurate as possible.
177
178 - When you merge any non-trivial functionality (from one small bug fix to a big
179 feature branch), please remember to always edit the changes_ file
180 accordingly. This file has one main section for each release, and if you
181 edit it as you go, noting what new features, bug fixes or API changes you
182 have made, the release notes will be almost finished when they are needed
183 later. This is much easier if done when you merge the work, rather than
184 weeks or months later by re-reading a massive Bazaar log.
185
186 - When big merges are done, the practice of putting a summary commit message in
187 the merge is *extremely* useful. It makes this kind of job much nicer,
174 :command:`bzr merge` to merge the branch into the trunk and push it to the
175 main Launcphad site. This is a short list of things to keep in mind when doing
176 this process, so that the project history is easy to understand in the long
177 run, and that generating release notes is as painless and accurate as
178 possible.
179
180 - When you merge any non-trivial functionality (from one small bug fix to a
181 big feature branch), please remember to always edit the :file:`changes.txt`
182 file accordingly. This file has one main section for each release, and if
183 you edit it as you go, noting what new features, bug fixes or API changes
184 you have made, the release notes will be almost finished when they are
185 needed later. This is much easier if done when you merge the work, rather
186 than weeks or months later by re-reading a massive Bazaar log.
187
188 - When big merges are done, the practice of putting a summary commit message
189 in the merge is *extremely* useful. It makes this kind of job much nicer,
188 190 because that summary log message can be almost copy/pasted without changes,
189 191 if it was well written, rather than dissecting the next-level messages from
190 192 the individual commits.
191 193
192 194 - It's important that we remember to always credit who gave us something if
193 it's not the committer. In general, we have been fairly good on this front,
194 this is just a reminder to keep things up. As a note, if you are ever
195 it's not the committer. In general, we have been fairly good on this front,
196 this is just a reminder to keep things up. As a note, if you are ever
195 197 committing something that is completely (or almost so) a third-party
196 198 contribution, do the commit as::
197 199
198 200 $ bzr commit --author="Someone Else"
199 201
200 202 This way it will show that name separately in the log, which makes it even
201 easier to spot. Obviously we often rework third party contributions
203 easier to spot. Obviously we often rework third party contributions
202 204 extensively, but this is still good to keep in mind for cases when we don't
203 205 touch the code too much.
204 206
205 207
206 208 Documentation
207 209 =============
208 210
209 211 Standalone documentation
210 212 ------------------------
211 213
212 214 All standalone documentation should be written in plain text (``.txt``) files
213 215 using reStructuredText [reStructuredText]_ for markup and formatting. All such
214 216 documentation should be placed in directory :file:`docs/source` of the IPython
215 217 source tree. The documentation in this location will serve as the main source
216 218 for IPython documentation and all existing documentation should be converted
217 219 to this format.
218 220
219 221 To build the final documentation, we use Sphinx [Sphinx]_. Once you have
220 222 Sphinx installed, you can build the html docs yourself by doing::
221 223
222 224 $ cd ipython-mybranch/docs
223 225 $ make html
224 226
225 227 Docstring format
226 228 ----------------
227 229
228 230 Good docstrings are very important. All new code should have docstrings that
229 231 are formatted using reStructuredText for markup and formatting, since it is
230 232 understood by a wide variety of tools. Details about using reStructuredText
231 233 for docstrings can be found `here
232 234 <http://epydoc.sourceforge.net/manual-othermarkup.html>`_.
233 235
234 236 Additional PEPs of interest regarding documentation of code:
235 237
236 238 * `Docstring Conventions <http://www.python.org/peps/pep-0257.html>`_
237 239 * `Docstring Processing System Framework <http://www.python.org/peps/pep-0256.html>`_
238 240 * `Docutils Design Specification <http://www.python.org/peps/pep-0258.html>`_
239 241
240 242
241 243 Coding conventions
242 244 ==================
243 245
244 246 General
245 247 -------
246 248
247 249 In general, we'll try to follow the standard Python style conventions as
248 250 described here:
249 251
250 252 * `Style Guide for Python Code <http://www.python.org/peps/pep-0008.html>`_
251 253
252 254
253 255 Other comments:
254 256
255 257 * In a large file, top level classes and functions should be
256 258 separated by 2-3 lines to make it easier to separate them visually.
257 259 * Use 4 spaces for indentation.
258 260 * Keep the ordering of methods the same in classes that have the same
259 261 methods. This is particularly true for classes that implement an interface.
260 262
261 263 Naming conventions
262 264 ------------------
263 265
264 266 In terms of naming conventions, we'll follow the guidelines from the `Style
265 267 Guide for Python Code`_.
266 268
267 269 For all new IPython code (and much existing code is being refactored), we'll
268 270 use:
269 271
270 272 * All ``lowercase`` module names.
271 273
272 274 * ``CamelCase`` for class names.
273 275
274 276 * ``lowercase_with_underscores`` for methods, functions, variables and
275 277 attributes.
276 278
277 279 There are, however, some important exceptions to these rules. In some cases,
278 280 IPython code will interface with packages (Twisted, Wx, Qt) that use other
279 281 conventions. At some level this makes it impossible to adhere to our own
280 282 standards at all times. In particular, when subclassing classes that use other
281 283 naming conventions, you must follow their naming conventions. To deal with
282 284 cases like this, we propose the following policy:
283 285
284 286 * If you are subclassing a class that uses different conventions, use its
285 287 naming conventions throughout your subclass. Thus, if you are creating a
286 288 Twisted Protocol class, used Twisted's
287 289 ``namingSchemeForMethodsAndAttributes.``
288 290
289 291 * All IPython's official interfaces should use our conventions. In some cases
290 292 this will mean that you need to provide shadow names (first implement
291 293 ``fooBar`` and then ``foo_bar = fooBar``). We want to avoid this at all
292 294 costs, but it will probably be necessary at times. But, please use this
293 295 sparingly!
294 296
295 297 Implementation-specific *private* methods will use
296 298 ``_single_underscore_prefix``. Names with a leading double underscore will
297 299 *only* be used in special cases, as they makes subclassing difficult (such
298 300 names are not easily seen by child classes).
299 301
300 302 Occasionally some run-in lowercase names are used, but mostly for very short
301 303 names or where we are implementing methods very similar to existing ones in a
302 304 base class (like ``runlines()`` where ``runsource()`` and ``runcode()`` had
303 305 established precedent).
304 306
305 307 The old IPython codebase has a big mix of classes and modules prefixed with an
306 308 explicit ``IP``. In Python this is mostly unnecessary, redundant and frowned
307 309 upon, as namespaces offer cleaner prefixing. The only case where this approach
308 310 is justified is for classes which are expected to be imported into external
309 311 namespaces and a very generic name (like Shell) is too likely to clash with
310 312 something else. We'll need to revisit this issue as we clean up and refactor
311 313 the code, but in general we should remove as many unnecessary ``IP``/``ip``
312 314 prefixes as possible. However, if a prefix seems absolutely necessary the more
313 315 specific ``IPY`` or ``ipy`` are preferred.
314 316
315 317 .. _devel_testing:
316 318
317 319 Testing system
318 320 ==============
319 321
320 322 It is extremely important that all code contributed to IPython has tests.
321 323 Tests should be written as unittests, doctests or as entities that the Nose
322 324 [Nose]_ testing package will find. Regardless of how the tests are written, we
323 325 will use Nose for discovering and running the tests. Nose will be required to
324 326 run the IPython test suite, but will not be required to simply use IPython.
325 327
326 328 Tests of Twisted using code need to follow two additional guidelines:
327 329
328 330 1. Twisted using tests should be written by subclassing the :class:`TestCase`
329 331 class that comes with :mod:`twisted.trial.unittest`.
330 332
331 333 2. All :class:`Deferred` instances that are created in the test must be
332 334 properly chained and the final one *must* be the return value of the test
333 335 method.
334 336
335 337 When these two things are done, Nose will be able to run the tests and the
336 338 twisted reactor will be handled correctly.
337 339
338 340 Each subpackage in IPython should have its own :file:`tests` directory that
339 341 contains all of the tests for that subpackage. This allows each subpackage to
340 342 be self-contained. A good convention to follow is to have a file named
341 343 :file:`test_foo.py` for each module :file:`foo.py` in the package. This makes
342 344 it easy to organize the tests, though like most conventions, it's OK to break
343 345 it if logic and common sense dictate otherwise.
344 346
345 347 If a subpackage has any dependencies beyond the Python standard library, the
346 348 tests for that subpackage should be skipped if the dependencies are not
347 349 found. This is very important so users don't get tests failing simply because
348 350 they don't have dependencies. We ship a set of decorators in the
349 351 :mod:`IPython.testing` package to tag tests that may be platform-specific or
350 352 otherwise may have restrictions; if the existing ones don't fit your needs, add
351 353 a new decorator in that location so other tests can reuse it.
352 354
353 355 To run the IPython test suite, use the :command:`iptest` command that is
354 356 installed with IPython (if you are using IPython in-place, without installing
355 357 it, you can find this script in the :file:`scripts` directory)::
356 358
357 359 $ iptest
358 360
359 361 This command colects all IPython tests into separate groups, and then calls
360 362 either Nose with the proper options and extensions, or Twisted's
361 363 :command:`trial`. This ensures that tests that need the Twisted reactor
362 364 management facilities execute separate of Nose. If any individual test group
363 365 fails, :command:`iptest` will print what you need to type so you can rerun that
364 366 particular test group alone for debugging.
365 367
366 368 By default, :command:`iptest` runs the entire IPython test
367 369 suite (skipping tests that may be platform-specific or which depend on tools
368 370 you may not have). But you can also use it to run only one specific test file,
369 371 or a specific test function. For example, this will run only the
370 372 :file:`test_magic` file from the test suite::
371 373
372 374 $ iptest IPython.tests.test_magic
373 375 ----------------------------------------------------------------------
374 376 Ran 10 tests in 0.348s
375 377
376 378 OK (SKIP=3)
377 379 Deleting object: second_pass
378 380
379 381 while the ``path:function`` syntax allows you to select a specific function in
380 382 that file to run::
381 383
382 384 $ iptest IPython.tests.test_magic:test_obj_del
383 385 ----------------------------------------------------------------------
384 386 Ran 1 test in 0.204s
385 387
386 388 OK
387 389
388 390 Since :command:`iptest` is based on nosetests, you can pass it any regular
389 391 nosetests option. For example, you can use ``--pdb`` or ``--pdb-failures`` to
390 392 automatically activate the interactive Pdb debugger on errors or failures. See
391 393 the nosetests documentation for further details.
392 394
393 395
394 396 A few tips for writing tests
395 397 ----------------------------
396 398
397 399 You can write tests either as normal test files, using all the conventions that
398 400 Nose recognizes, or as doctests. Note that *all* IPython functions should have
399 401 at least one example that serves as a doctest, whenever technically feasible.
400 402 However, example doctests should only be in the main docstring if they are *a
401 403 good example*, i.e. if they convey useful information about the function. If
402 404 you simply would like to write a test as a doctest, put it in a separate test
403 405 file and write a no-op function whose only purpose is its docstring.
404 406
405 407 Note, however, that in a file named :file:`test_X`, functions whose only test
406 408 is their docstring (as a doctest) and which have no test functionality of their
407 409 own, should be called *doctest_foo* instead of *test_foo*, otherwise they get
408 410 double-counted (the empty function call is counted as a test, which just
409 411 inflates tests numbers artificially). This restriction does not apply to
410 412 functions in files with other names, due to how Nose discovers tests.
411 413
412 414 You can use IPython examples in your docstrings. Those can make full use of
413 415 IPython functionality (magics, variable substitution, etc), but be careful to
414 416 keep them generic enough that they run identically on all Operating Systems.
415 417
416 418 The prompts in your doctests can be either of the plain Python ``>>>`` variety
417 419 or ``In [1]:`` IPython style. Since this is the IPython system, after all, we
418 420 encourage you to use IPython prompts throughout, unless you are illustrating a
419 421 specific aspect of the normal prompts (such as the ``%doctest_mode`` magic).
420 422
421 423 If a test isn't safe to run inside the main nose process (e.g. because it loads
422 424 a GUI toolkit), consider running it in a subprocess and capturing its output
423 425 for evaluation and test decision later. Here is an example of how to do it, by
424 426 relying on the builtin ``_ip`` object that contains the public IPython api as
425 427 defined in :mod:`IPython.ipapi`::
426 428
427 429 def test_obj_del():
428 430 """Test that object's __del__ methods are called on exit."""
429 431 test_dir = os.path.dirname(__file__)
430 432 del_file = os.path.join(test_dir,'obj_del.py')
431 433 out = _ip.IP.getoutput('ipython %s' % del_file)
432 434 nt.assert_equals(out,'object A deleted')
433 435
434 436
435 437
436 438 If a doctest contains input whose output you don't want to verify identically
437 439 via doctest (random output, an object id, etc), you can mark a docstring with
438 440 ``#random``. All of these test will have their code executed but no output
439 441 checking will be done::
440 442
441 443 >>> 1+3
442 444 junk goes here... # random
443 445
444 446 >>> 1+2
445 447 again, anything goes #random
446 448 if multiline, the random mark is only needed once.
447 449
448 450 >>> 1+2
449 451 You can also put the random marker at the end:
450 452 # random
451 453
452 454 >>> 1+2
453 455 # random
454 456 .. or at the beginning.
455 457
456 458 In a case where you want an *entire* docstring to be executed but not verified
457 459 (this only serves to check that the code runs without crashing, so it should be
458 460 used very sparingly), you can put ``# all-random`` in the docstring.
459 461
460 462 .. _devel_config:
461 463
462 464 Release checklist
463 465 =================
464 466
465 467 Most of the release process is automated by the :file:`release` script in the
466 468 :file:`tools` directory. This is just a handy reminder for the release manager.
467 469
468 470 #. First, run :file:`build_release`, which does all the file checking and
469 471 building that the real release script will do. This will let you do test
470 472 installations, check that the build procedure runs OK, etc. You may want to
471 473 disable a few things like multi-version RPM building while testing, because
472 474 otherwise the build takes really long.
473 475
474 476 #. Run the release script, which makes the tar.gz, eggs and Win32 .exe
475 477 installer. It posts them to the site and registers the release with PyPI.
476 478
477 479 #. Updating the website with announcements and links to the updated
478 480 changes.txt in html form. Remember to put a short note both on the news
479 481 page of the site and on Launcphad.
480 482
481 483 #. Drafting a short release announcement with i) highlights and ii) a link to
482 484 the html changes.txt.
483 485
484 486 #. Make sure that the released version of the docs is live on the site.
485 487
486 488 #. Celebrate!
487 489
488 490 Porting to 3.0
489 491 ==============
490 492
491 493 There are no definite plans for porting of IPython to python 3. The major
492 494 issue is the dependency on twisted framework for the networking/threading
493 495 stuff. It is possible that it the traditional IPython interactive console
494 496 could be ported more easily since it has no such dependency. Here are a few
495 497 things that will need to be considered when doing such a port especially
496 498 if we want to have a codebase that works directly on both 2.x and 3.x.
497 499
498 500 1. The syntax for exceptions changed (PEP 3110). The old
499 501 `except exc, var` changed to `except exc as var`. At last
500 502 count there was 78 occurences of this usage in the codebase. This
501 503 is a particularly problematic issue, because it's not easy to
502 504 implement it in a 2.5-compatible way.
503 505
504 506 Because it is quite difficult to support simultaneously Python 2.5 and 3.x, we
505 507 will likely at some point put out a release that requires strictly 2.6 and
506 508 abandons 2.5 compatibility. This will then allow us to port the code to using
507 509 :func:`print` as a function, `except exc as var` syntax, etc. But as of
508 510 version 0.11 at least, we will retain Python 2.5 compatibility.
509 511
510 512
511 513 .. [Bazaar] Bazaar. http://bazaar-vcs.org/
512 514 .. [Launchpad] Launchpad. http://www.launchpad.net/ipython
513 515 .. [reStructuredText] reStructuredText. http://docutils.sourceforge.net/rst.html
514 516 .. [Sphinx] Sphinx. http://sphinx.pocoo.org/
515 517 .. [Nose] Nose: a discovery based unittest extension. http://code.google.com/p/python-nose/
@@ -1,94 +1,84 b''
1 1 =============================
2 2 IPython module reorganization
3 3 =============================
4 4
5 5 Currently, IPython has many top-level modules that serve many different
6 6 purposes. The lack of organization make it very difficult for developers to
7 7 work on IPython and understand its design. This document contains notes about
8 8 how we will reorganize the modules into sub-packages.
9 9
10 10 .. warning::
11 11
12 12 This effort will possibly break third party packages that use IPython as
13 13 a library or hack on the IPython internals.
14 14
15 15 .. warning::
16 16
17 17 This effort will result in the removal from IPython of certain modules
18 18 that are not used anymore, don't currently work, are unmaintained, etc.
19 19
20 20
21 21 Current subpackges
22 22 ==================
23 23
24 24 IPython currently has the following sub-packages:
25 25
26 26 * :mod:`IPython.config`
27 27
28 28 * :mod:`IPython.Extensions`
29 29
30 30 * :mod:`IPython.external`
31 31
32 32 * :mod:`IPython.frontend`
33 33
34 34 * :mod:`IPython.gui`
35 35
36 36 * :mod:`IPython.kernel`
37 37
38 38 * :mod:`IPython.testing`
39 39
40 40 * :mod:`IPython.tests`
41 41
42 42 * :mod:`IPython.tools`
43 43
44 44 * :mod:`IPython.UserConfig`
45 45
46 46 New Subpackages to be created
47 47 =============================
48 48
49 49 We propose to create the following new sub-packages:
50 50
51 51 * :mod:`IPython.core`. This sub-package will contain the core of the IPython
52 52 interpreter, but none of its extended capabilities.
53 53
54 54 * :mod:`IPython.lib`. IPython has many extended capabilities that are not part
55 55 of the IPython core. These things will go here.
56 56
57 57 * :mod:`IPython.utils`. This sub-package will contain anything that might
58 58 eventually be found in the Python standard library, like things in
59 59 :mod:`genutils`. Each sub-module in this sub-package should contain
60 60 functions and classes that serve a single purpose.
61 61
62 62 * :mod:`IPython.deathrow`. This is for code that is untested and/or rotting
63 63 and needs to be removed from IPython. Eventually all this code will either
64 64 i) be revived by someone willing to maintain it with tests and docs and
65 65 re-included into IPython or 2) be removed from IPython proper, but put into
66 66 a separate top-level (not IPython) package that we keep around. No new code
67 67 will be allowed here.
68 68
69 69 * :mod:`IPython.quarantine`. This is for code that doesn't meet IPython's
70 70 standards, but that we plan on keeping. To be moved out of this sub-package
71 71 a module needs to have a maintainer, tests and documentation.
72 72
73 73 Procedure
74 74 =========
75 75
76 76 1. Move the file to its new location with its new name.
77 77 2. Rename all import statements to reflect the change.
78 78 3. Run PyFlakes on each changes module.
79 3. Add tests/test_imports.py to test it.
79 4. Add tests/test_imports.py to test it.
80 80
81 81 Status
82 82 ======
83 83
84 The new subpackages have been created and the top-level modules have been
85 moved and renamed. Import tests have been created for all of the moved and
86 renamed modules. The build infrastructure (setup.py and friends) have been
87 updated and tested on Mac and Windows. Finally, a compatibility layer has been
88 added for iplib, ipapi and Shell. The follow things still need to be done::
89
90 * I need to modify iptests to properly skip modules that are no longer top
91 level modules.
92
93 * When running python setup.py sdist, the Sphinx API docs fail to build
94 because of something going on with IPython.core.fakemodule
84 This branch was merged into trunk in early August of 2009.
@@ -1,81 +1,73 b''
1 1 .. _roadmap:
2 2
3 3 ===================
4 4 Development roadmap
5 5 ===================
6 6
7 IPython is an ambitious project that is still under heavy development. However, we want IPython to become useful to as many people as possible, as quickly as possible. To help us accomplish this, we are laying out a roadmap of where we are headed and what needs to happen to get there. Hopefully, this will help the IPython developers figure out the best things to work on for each upcoming release.
7 IPython is an ambitious project that is still under heavy development.
8 However, we want IPython to become useful to as many people as possible, as
9 quickly as possible. To help us accomplish this, we are laying out a roadmap
10 of where we are headed and what needs to happen to get there. Hopefully, this
11 will help the IPython developers figure out the best things to work on for
12 each upcoming release.
8 13
9 14 Work targeted to particular releases
10 15 ====================================
11 16
12 Release 0.10
13 ------------
14
15 * Initial refactor of :command:`ipcluster`.
16
17 * Better TextMate integration.
18
19 * Merge in the daemon branch.
20
21 17 Release 0.11
22 18 ------------
23 19
24 * Refactor the configuration system and command line options for
25 :command:`ipengine` and :command:`ipcontroller`. This will include the
26 creation of cluster directories that encapsulate all the configuration
27 files, log files and security related files for a particular cluster.
20 * [DONE] Full module and package reorganization.
21
22 * [DONE] Removal of the threaded shells and new implementation of GUI support
23 based on ``PyOSInputHook``.
28 24
29 * Refactor :command:`ipcluster` to support the new configuration system.
25 * Refactor the configuration system.
30 26
31 * Refactor the daemon stuff to support the new configuration system.
27 * Prepare to refactor IPython's core by creating a new component and
28 application system.
32 29
33 * Merge back in the core of the notebook.
34 30
35 31 Release 0.12
36 32 ------------
37 33
38 * Fully integrate process startup with the daemons for full process
39 management.
40 34
41 * Make the capabilites of :command:`ipcluster` available from simple Python
42 classes.
43 35
44 36 Major areas of work
45 37 ===================
46 38
47 39 Refactoring the main IPython core
48 40 ---------------------------------
49 41
50 42 Process management for :mod:`IPython.kernel`
51 43 --------------------------------------------
52 44
53 45 Configuration system
54 46 --------------------
55 47
56 48 Performance problems
57 49 --------------------
58 50
59 51 Currently, we have a number of performance issues that are waiting to bite users:
60 52
61 53 * The controller stores a large amount of state in Python dictionaries. Under
62 54 heavy usage, these dicts with get very large, causing memory usage problems.
63 55 We need to develop more scalable solutions to this problem, such as using a
64 56 sqlite database to store this state. This will also help the controller to
65 57 be more fault tolerant.
66 58
67 59 * We currently don't have a good way of handling large objects in the
68 60 controller. The biggest problem is that because we don't have any way of
69 61 streaming objects, we get lots of temporary copies in the low-level buffers.
70 62 We need to implement a better serialization approach and true streaming
71 63 support.
72 64
73 65 * The controller currently unpickles and repickles objects. We need to use the
74 66 [push|pull]_serialized methods instead.
75 67
76 68 * Currently the controller is a bottleneck. The best approach for this is to
77 69 separate the controller itself into multiple processes, one for the core
78 70 controller and one each for the controller interfaces.
79 71
80 72
81 73
@@ -1,1632 +1,1539 b''
1 1 =================
2 2 IPython reference
3 3 =================
4 4
5 5 .. _command_line_options:
6 6
7 7 Command-line usage
8 8 ==================
9 9
10 10 You start IPython with the command::
11 11
12 12 $ ipython [options] files
13 13
14 14 If invoked with no options, it executes all the files listed in sequence
15 15 and drops you into the interpreter while still acknowledging any options
16 16 you may have set in your ipythonrc file. This behavior is different from
17 17 standard Python, which when called as python -i will only execute one
18 18 file and ignore your configuration setup.
19 19
20 20 Please note that some of the configuration options are not available at
21 21 the command line, simply because they are not practical here. Look into
22 22 your ipythonrc configuration file for details on those. This file
23 23 typically installed in the $HOME/.ipython directory. For Windows users,
24 24 $HOME resolves to C:\\Documents and Settings\\YourUserName in most
25 25 instances. In the rest of this text, we will refer to this directory as
26 26 IPYTHONDIR.
27 27
28 .. _Threading options:
29 28
30 29
31 30 Special Threading Options
32 31 -------------------------
33 32
34 The following special options are ONLY valid at the beginning of the
35 command line, and not later. This is because they control the initial-
36 ization of ipython itself, before the normal option-handling mechanism
37 is active.
38
39 -gthread, -qthread, -q4thread, -wthread, -pylab:
40 Only one of these can be given, and it can only be given as
41 the first option passed to IPython (it will have no effect in
42 any other position). They provide threading support for the
43 GTK, Qt (versions 3 and 4) and WXPython toolkits, and for the
44 matplotlib library.
45
46 With any of the first four options, IPython starts running a
47 separate thread for the graphical toolkit's operation, so that
48 you can open and control graphical elements from within an
49 IPython command line, without blocking. All four provide
50 essentially the same functionality, respectively for GTK, Qt3,
51 Qt4 and WXWidgets (via their Python interfaces).
52
53 Note that with -wthread, you can additionally use the
54 -wxversion option to request a specific version of wx to be
55 used. This requires that you have the wxversion Python module
56 installed, which is part of recent wxPython distributions.
57
58 If -pylab is given, IPython loads special support for the mat
59 plotlib library (http://matplotlib.sourceforge.net), allowing
60 interactive usage of any of its backends as defined in the
61 user's ~/.matplotlib/matplotlibrc file. It automatically
62 activates GTK, Qt or WX threading for IPyhton if the choice of
63 matplotlib backend requires it. It also modifies the %run
64 command to correctly execute (without blocking) any
65 matplotlib-based script which calls show() at the end.
66
67 -tk
68 The -g/q/q4/wthread options, and -pylab (if matplotlib is
69 configured to use GTK, Qt3, Qt4 or WX), will normally block Tk
70 graphical interfaces. This means that when either GTK, Qt or WX
71 threading is active, any attempt to open a Tk GUI will result in a
72 dead window, and possibly cause the Python interpreter to crash.
73 An extra option, -tk, is available to address this issue. It can
74 only be given as a second option after any of the above (-gthread,
75 -wthread or -pylab).
76
77 If -tk is given, IPython will try to coordinate Tk threading
78 with GTK, Qt or WX. This is however potentially unreliable, and
79 you will have to test on your platform and Python configuration to
80 determine whether it works for you. Debian users have reported
81 success, apparently due to the fact that Debian builds all of Tcl,
82 Tk, Tkinter and Python with pthreads support. Under other Linux
83 environments (such as Fedora Core 2/3), this option has caused
84 random crashes and lockups of the Python interpreter. Under other
85 operating systems (Mac OSX and Windows), you'll need to try it to
86 find out, since currently no user reports are available.
87
88 There is unfortunately no way for IPython to determine at run time
89 whether -tk will work reliably or not, so you will need to do some
90 experiments before relying on it for regular work.
91
92
33 Previously IPython had command line options for controlling GUI event loop
34 integration (-gthread, -qthread, -q4thread, -wthread, -pylab). As of IPython
35 version 0.11, these have been deprecated. Please see the new ``%gui``
36 magic command or :ref:`this section <gui_support>` for details on the new
37 interface.
93 38
94 39 Regular Options
95 40 ---------------
96 41
97 42 After the above threading options have been given, regular options can
98 43 follow in any order. All options can be abbreviated to their shortest
99 44 non-ambiguous form and are case-sensitive. One or two dashes can be
100 45 used. Some options have an alternate short form, indicated after a ``|``.
101 46
102 47 Most options can also be set from your ipythonrc configuration file. See
103 48 the provided example for more details on what the options do. Options
104 49 given at the command line override the values set in the ipythonrc file.
105 50
106 51 All options with a [no] prepended can be specified in negated form
107 52 (-nooption instead of -option) to turn the feature off.
108 53
109 54 -help print a help message and exit.
110 55
111 56 -pylab
112 this can only be given as the first option passed to IPython
113 (it will have no effect in any other position). It adds
114 special support for the matplotlib library
115 (http://matplotlib.sourceforge.ne), allowing interactive usage
116 of any of its backends as defined in the user's .matplotlibrc
117 file. It automatically activates GTK or WX threading for
118 IPyhton if the choice of matplotlib backend requires it. It
119 also modifies the %run command to correctly execute (without
120 blocking) any matplotlib-based script which calls show() at
121 the end. See `Matplotlib support`_ for more details.
57 Deprecated. See :ref:`Matplotlib support <matplotlib_support>`
58 for more details.
122 59
123 60 -autocall <val>
124 61 Make IPython automatically call any callable object even if you
125 62 didn't type explicit parentheses. For example, 'str 43' becomes
126 63 'str(43)' automatically. The value can be '0' to disable the feature,
127 64 '1' for smart autocall, where it is not applied if there are no more
128 65 arguments on the line, and '2' for full autocall, where all callable
129 66 objects are automatically called (even if no arguments are
130 67 present). The default is '1'.
131 68
132 69 -[no]autoindent
133 70 Turn automatic indentation on/off.
134 71
135 72 -[no]automagic
136 73 make magic commands automatic (without needing their first character
137 74 to be %). Type %magic at the IPython prompt for more information.
138 75
139 76 -[no]autoedit_syntax
140 77 When a syntax error occurs after editing a file, automatically
141 78 open the file to the trouble causing line for convenient
142 79 fixing.
143 80
144 81 -[no]banner Print the initial information banner (default on).
145 82
146 83 -c <command>
147 84 execute the given command string. This is similar to the -c
148 85 option in the normal Python interpreter.
149 86
150 87 -cache_size, cs <n>
151 88 size of the output cache (maximum number of entries to hold in
152 89 memory). The default is 1000, you can change it permanently in your
153 90 config file. Setting it to 0 completely disables the caching system,
154 91 and the minimum value accepted is 20 (if you provide a value less than
155 92 20, it is reset to 0 and a warning is issued) This limit is defined
156 93 because otherwise you'll spend more time re-flushing a too small cache
157 94 than working.
158 95
159 96 -classic, cl
160 97 Gives IPython a similar feel to the classic Python
161 98 prompt.
162 99
163 100 -colors <scheme>
164 101 Color scheme for prompts and exception reporting. Currently
165 102 implemented: NoColor, Linux and LightBG.
166 103
167 104 -[no]color_info
168 105 IPython can display information about objects via a set of functions,
169 106 and optionally can use colors for this, syntax highlighting source
170 107 code and various other elements. However, because this information is
171 108 passed through a pager (like 'less') and many pagers get confused with
172 109 color codes, this option is off by default. You can test it and turn
173 110 it on permanently in your ipythonrc file if it works for you. As a
174 111 reference, the 'less' pager supplied with Mandrake 8.2 works ok, but
175 112 that in RedHat 7.2 doesn't.
176 113
177 114 Test it and turn it on permanently if it works with your
178 115 system. The magic function %color_info allows you to toggle this
179 116 interactively for testing.
180 117
181 118 -[no]debug
182 119 Show information about the loading process. Very useful to pin down
183 120 problems with your configuration files or to get details about
184 121 session restores.
185 122
186 123 -[no]deep_reload:
187 124 IPython can use the deep_reload module which reloads changes in
188 125 modules recursively (it replaces the reload() function, so you don't
189 126 need to change anything to use it). deep_reload() forces a full
190 127 reload of modules whose code may have changed, which the default
191 128 reload() function does not.
192 129
193 130 When deep_reload is off, IPython will use the normal reload(),
194 131 but deep_reload will still be available as dreload(). This
195 132 feature is off by default [which means that you have both
196 133 normal reload() and dreload()].
197 134
198 135 -editor <name>
199 136 Which editor to use with the %edit command. By default,
200 137 IPython will honor your EDITOR environment variable (if not
201 138 set, vi is the Unix default and notepad the Windows one).
202 139 Since this editor is invoked on the fly by IPython and is
203 140 meant for editing small code snippets, you may want to use a
204 141 small, lightweight editor here (in case your default EDITOR is
205 142 something like Emacs).
206 143
207 144 -ipythondir <name>
208 145 name of your IPython configuration directory IPYTHONDIR. This
209 146 can also be specified through the environment variable
210 147 IPYTHONDIR.
211 148
212 149 -log, l
213 150 generate a log file of all input. The file is named
214 151 ipython_log.py in your current directory (which prevents logs
215 152 from multiple IPython sessions from trampling each other). You
216 153 can use this to later restore a session by loading your
217 154 logfile as a file to be executed with option -logplay (see
218 155 below).
219 156
220 157 -logfile, lf <name> specify the name of your logfile.
221 158
222 159 -logplay, lp <name>
223 160
224 161 you can replay a previous log. For restoring a session as close as
225 162 possible to the state you left it in, use this option (don't just run
226 163 the logfile). With -logplay, IPython will try to reconstruct the
227 164 previous working environment in full, not just execute the commands in
228 165 the logfile.
229 166
230 167 When a session is restored, logging is automatically turned on
231 168 again with the name of the logfile it was invoked with (it is
232 169 read from the log header). So once you've turned logging on for
233 170 a session, you can quit IPython and reload it as many times as
234 171 you want and it will continue to log its history and restore
235 172 from the beginning every time.
236 173
237 174 Caveats: there are limitations in this option. The history
238 175 variables _i*,_* and _dh don't get restored properly. In the
239 176 future we will try to implement full session saving by writing
240 177 and retrieving a 'snapshot' of the memory state of IPython. But
241 178 our first attempts failed because of inherent limitations of
242 179 Python's Pickle module, so this may have to wait.
243 180
244 181 -[no]messages
245 182 Print messages which IPython collects about its startup
246 183 process (default on).
247 184
248 185 -[no]pdb
249 186 Automatically call the pdb debugger after every uncaught
250 187 exception. If you are used to debugging using pdb, this puts
251 188 you automatically inside of it after any call (either in
252 189 IPython or in code called by it) which triggers an exception
253 190 which goes uncaught.
254 191
255 192 -pydb
256 193 Makes IPython use the third party "pydb" package as debugger,
257 194 instead of pdb. Requires that pydb is installed.
258 195
259 196 -[no]pprint
260 197 ipython can optionally use the pprint (pretty printer) module
261 198 for displaying results. pprint tends to give a nicer display
262 199 of nested data structures. If you like it, you can turn it on
263 200 permanently in your config file (default off).
264 201
265 202 -profile, p <name>
266 203
267 204 assume that your config file is ipythonrc-<name> or
268 205 ipy_profile_<name>.py (looks in current dir first, then in
269 206 IPYTHONDIR). This is a quick way to keep and load multiple
270 207 config files for different tasks, especially if you use the
271 208 include option of config files. You can keep a basic
272 209 IPYTHONDIR/ipythonrc file and then have other 'profiles' which
273 210 include this one and load extra things for particular
274 211 tasks. For example:
275 212
276 213 1. $HOME/.ipython/ipythonrc : load basic things you always want.
277 214 2. $HOME/.ipython/ipythonrc-math : load (1) and basic math-related modules.
278 215 3. $HOME/.ipython/ipythonrc-numeric : load (1) and Numeric and plotting modules.
279 216
280 217 Since it is possible to create an endless loop by having
281 218 circular file inclusions, IPython will stop if it reaches 15
282 219 recursive inclusions.
283 220
284 221 -prompt_in1, pi1 <string>
285 222
286 223 Specify the string used for input prompts. Note that if you are using
287 224 numbered prompts, the number is represented with a '\#' in the
288 225 string. Don't forget to quote strings with spaces embedded in
289 226 them. Default: 'In [\#]:'. The :ref:`prompts section <prompts>`
290 227 discusses in detail all the available escapes to customize your
291 228 prompts.
292 229
293 230 -prompt_in2, pi2 <string>
294 231 Similar to the previous option, but used for the continuation
295 232 prompts. The special sequence '\D' is similar to '\#', but
296 233 with all digits replaced dots (so you can have your
297 234 continuation prompt aligned with your input prompt). Default:
298 235 ' .\D.:' (note three spaces at the start for alignment with
299 236 'In [\#]').
300 237
301 238 -prompt_out,po <string>
302 239 String used for output prompts, also uses numbers like
303 240 prompt_in1. Default: 'Out[\#]:'
304 241
305 242 -quick start in bare bones mode (no config file loaded).
306 243
307 244 -rcfile <name>
308 245 name of your IPython resource configuration file. Normally
309 246 IPython loads ipythonrc (from current directory) or
310 247 IPYTHONDIR/ipythonrc.
311 248
312 249 If the loading of your config file fails, IPython starts with
313 250 a bare bones configuration (no modules loaded at all).
314 251
315 252 -[no]readline
316 253 use the readline library, which is needed to support name
317 254 completion and command history, among other things. It is
318 255 enabled by default, but may cause problems for users of
319 256 X/Emacs in Python comint or shell buffers.
320 257
321 258 Note that X/Emacs 'eterm' buffers (opened with M-x term) support
322 259 IPython's readline and syntax coloring fine, only 'emacs' (M-x
323 260 shell and C-c !) buffers do not.
324 261
325 262 -screen_length, sl <n>
326 263 number of lines of your screen. This is used to control
327 264 printing of very long strings. Strings longer than this number
328 265 of lines will be sent through a pager instead of directly
329 266 printed.
330 267
331 268 The default value for this is 0, which means IPython will
332 269 auto-detect your screen size every time it needs to print certain
333 270 potentially long strings (this doesn't change the behavior of the
334 271 'print' keyword, it's only triggered internally). If for some
335 272 reason this isn't working well (it needs curses support), specify
336 273 it yourself. Otherwise don't change the default.
337 274
338 275 -separate_in, si <string>
339 276
340 277 separator before input prompts.
341 278 Default: '\n'
342 279
343 280 -separate_out, so <string>
344 281 separator before output prompts.
345 282 Default: nothing.
346 283
347 284 -separate_out2, so2
348 285 separator after output prompts.
349 286 Default: nothing.
350 287 For these three options, use the value 0 to specify no separator.
351 288
352 289 -nosep
353 290 shorthand for '-SeparateIn 0 -SeparateOut 0 -SeparateOut2
354 291 0'. Simply removes all input/output separators.
355 292
356 293 -upgrade
357 294 allows you to upgrade your IPYTHONDIR configuration when you
358 295 install a new version of IPython. Since new versions may
359 296 include new command line options or example files, this copies
360 297 updated ipythonrc-type files. However, it backs up (with a
361 298 .old extension) all files which it overwrites so that you can
362 299 merge back any customizations you might have in your personal
363 300 files. Note that you should probably use %upgrade instead,
364 301 it's a safer alternative.
365 302
366 303
367 304 -Version print version information and exit.
368 305
369 306 -wxversion <string>
370 Select a specific version of wxPython (used in conjunction
371 with -wthread). Requires the wxversion module, part of recent
372 wxPython distributions
307 Deprecated.
373 308
374 309 -xmode <modename>
375 310
376 311 Mode for exception reporting.
377 312
378 313 Valid modes: Plain, Context and Verbose.
379 314
380 315 * Plain: similar to python's normal traceback printing.
381 316 * Context: prints 5 lines of context source code around each
382 317 line in the traceback.
383 318 * Verbose: similar to Context, but additionally prints the
384 319 variables currently visible where the exception happened
385 320 (shortening their strings if too long). This can potentially be
386 321 very slow, if you happen to have a huge data structure whose
387 322 string representation is complex to compute. Your computer may
388 323 appear to freeze for a while with cpu usage at 100%. If this
389 324 occurs, you can cancel the traceback with Ctrl-C (maybe hitting it
390 325 more than once).
391 326
392 327 Interactive use
393 328 ===============
394 329
395 330 Warning: IPython relies on the existence of a global variable called
396 331 _ip which controls the shell itself. If you redefine _ip to anything,
397 332 bizarre behavior will quickly occur.
398 333
399 334 Other than the above warning, IPython is meant to work as a drop-in
400 335 replacement for the standard interactive interpreter. As such, any code
401 336 which is valid python should execute normally under IPython (cases where
402 337 this is not true should be reported as bugs). It does, however, offer
403 338 many features which are not available at a standard python prompt. What
404 339 follows is a list of these.
405 340
406 341
407 342 Caution for Windows users
408 343 -------------------------
409 344
410 345 Windows, unfortunately, uses the '\' character as a path
411 346 separator. This is a terrible choice, because '\' also represents the
412 347 escape character in most modern programming languages, including
413 348 Python. For this reason, using '/' character is recommended if you
414 349 have problems with ``\``. However, in Windows commands '/' flags
415 350 options, so you can not use it for the root directory. This means that
416 351 paths beginning at the root must be typed in a contrived manner like:
417 352 ``%copy \opt/foo/bar.txt \tmp``
418 353
419 354 .. _magic:
420 355
421 356 Magic command system
422 357 --------------------
423 358
424 359 IPython will treat any line whose first character is a % as a special
425 360 call to a 'magic' function. These allow you to control the behavior of
426 361 IPython itself, plus a lot of system-type features. They are all
427 362 prefixed with a % character, but parameters are given without
428 363 parentheses or quotes.
429 364
430 365 Example: typing '%cd mydir' (without the quotes) changes you working
431 366 directory to 'mydir', if it exists.
432 367
433 368 If you have 'automagic' enabled (in your ipythonrc file, via the command
434 369 line option -automagic or with the %automagic function), you don't need
435 370 to type in the % explicitly. IPython will scan its internal list of
436 371 magic functions and call one if it exists. With automagic on you can
437 372 then just type 'cd mydir' to go to directory 'mydir'. The automagic
438 373 system has the lowest possible precedence in name searches, so defining
439 374 an identifier with the same name as an existing magic function will
440 375 shadow it for automagic use. You can still access the shadowed magic
441 376 function by explicitly using the % character at the beginning of the line.
442 377
443 378 An example (with automagic on) should clarify all this::
444 379
445 380 In [1]: cd ipython # %cd is called by automagic
446 381
447 382 /home/fperez/ipython
448 383
449 384 In [2]: cd=1 # now cd is just a variable
450 385
451 386 In [3]: cd .. # and doesn't work as a function anymore
452 387
453 388 ------------------------------
454 389
455 390 File "<console>", line 1
456 391
457 392 cd ..
458 393
459 394 ^
460 395
461 396 SyntaxError: invalid syntax
462 397
463 398 In [4]: %cd .. # but %cd always works
464 399
465 400 /home/fperez
466 401
467 402 In [5]: del cd # if you remove the cd variable
468 403
469 404 In [6]: cd ipython # automagic can work again
470 405
471 406 /home/fperez/ipython
472 407
473 408 You can define your own magic functions to extend the system. The
474 409 following example defines a new magic command, %impall::
475 410
476 411 import IPython.ipapi
477 412
478 413 ip = IPython.ipapi.get()
479 414
480 415 def doimp(self, arg):
481 416
482 417 ip = self.api
483 418
484 419 ip.ex("import %s; reload(%s); from %s import *" % (
485 420
486 421 arg,arg,arg)
487 422
488 423 )
489 424
490 425 ip.expose_magic('impall', doimp)
491 426
492 427 You can also define your own aliased names for magic functions. In your
493 428 ipythonrc file, placing a line like::
494 429
495 430 execute __IP.magic_cl = __IP.magic_clear
496 431
497 432 will define %cl as a new name for %clear.
498 433
499 434 Type %magic for more information, including a list of all available
500 435 magic functions at any time and their docstrings. You can also type
501 436 %magic_function_name? (see sec. 6.4 <#sec:dyn-object-info> for
502 437 information on the '?' system) to get information about any particular
503 438 magic function you are interested in.
504 439
505 440 The API documentation for the :mod:`IPython.Magic` module contains the full
506 441 docstrings of all currently available magic commands.
507 442
508 443
509 444 Access to the standard Python help
510 445 ----------------------------------
511 446
512 447 As of Python 2.1, a help system is available with access to object docstrings
513 448 and the Python manuals. Simply type 'help' (no quotes) to access it. You can
514 449 also type help(object) to obtain information about a given object, and
515 450 help('keyword') for information on a keyword. As noted :ref:`here
516 451 <accessing_help>`, you need to properly configure your environment variable
517 452 PYTHONDOCS for this feature to work correctly.
518 453
519 454 .. _dynamic_object_info:
520 455
521 456 Dynamic object information
522 457 --------------------------
523 458
524 459 Typing ?word or word? prints detailed information about an object. If
525 460 certain strings in the object are too long (docstrings, code, etc.) they
526 461 get snipped in the center for brevity. This system gives access variable
527 462 types and values, full source code for any object (if available),
528 463 function prototypes and other useful information.
529 464
530 465 Typing ??word or word?? gives access to the full information without
531 466 snipping long strings. Long strings are sent to the screen through the
532 467 less pager if longer than the screen and printed otherwise. On systems
533 468 lacking the less command, IPython uses a very basic internal pager.
534 469
535 470 The following magic functions are particularly useful for gathering
536 471 information about your working environment. You can get more details by
537 472 typing %magic or querying them individually (use %function_name? with or
538 473 without the %), this is just a summary:
539 474
540 475 * **%pdoc <object>**: Print (or run through a pager if too long) the
541 476 docstring for an object. If the given object is a class, it will
542 477 print both the class and the constructor docstrings.
543 478 * **%pdef <object>**: Print the definition header for any callable
544 479 object. If the object is a class, print the constructor information.
545 480 * **%psource <object>**: Print (or run through a pager if too long)
546 481 the source code for an object.
547 482 * **%pfile <object>**: Show the entire source file where an object was
548 483 defined via a pager, opening it at the line where the object
549 484 definition begins.
550 485 * **%who/%whos**: These functions give information about identifiers
551 486 you have defined interactively (not things you loaded or defined
552 487 in your configuration files). %who just prints a list of
553 488 identifiers and %whos prints a table with some basic details about
554 489 each identifier.
555 490
556 491 Note that the dynamic object information functions (?/??, %pdoc, %pfile,
557 492 %pdef, %psource) give you access to documentation even on things which
558 493 are not really defined as separate identifiers. Try for example typing
559 494 {}.get? or after doing import os, type os.path.abspath??.
560 495
561 496
562 497 .. _readline:
563 498
564 499 Readline-based features
565 500 -----------------------
566 501
567 502 These features require the GNU readline library, so they won't work if
568 503 your Python installation lacks readline support. We will first describe
569 504 the default behavior IPython uses, and then how to change it to suit
570 505 your preferences.
571 506
572 507
573 508 Command line completion
574 509 +++++++++++++++++++++++
575 510
576 511 At any time, hitting TAB will complete any available python commands or
577 512 variable names, and show you a list of the possible completions if
578 513 there's no unambiguous one. It will also complete filenames in the
579 514 current directory if no python names match what you've typed so far.
580 515
581 516
582 517 Search command history
583 518 ++++++++++++++++++++++
584 519
585 520 IPython provides two ways for searching through previous input and thus
586 521 reduce the need for repetitive typing:
587 522
588 523 1. Start typing, and then use Ctrl-p (previous,up) and Ctrl-n
589 524 (next,down) to search through only the history items that match
590 525 what you've typed so far. If you use Ctrl-p/Ctrl-n at a blank
591 526 prompt, they just behave like normal arrow keys.
592 527 2. Hit Ctrl-r: opens a search prompt. Begin typing and the system
593 528 searches your history for lines that contain what you've typed so
594 529 far, completing as much as it can.
595 530
596 531
597 532 Persistent command history across sessions
598 533 ++++++++++++++++++++++++++++++++++++++++++
599 534
600 535 IPython will save your input history when it leaves and reload it next
601 536 time you restart it. By default, the history file is named
602 537 $IPYTHONDIR/history, but if you've loaded a named profile,
603 538 '-PROFILE_NAME' is appended to the name. This allows you to keep
604 539 separate histories related to various tasks: commands related to
605 540 numerical work will not be clobbered by a system shell history, for
606 541 example.
607 542
608 543
609 544 Autoindent
610 545 ++++++++++
611 546
612 547 IPython can recognize lines ending in ':' and indent the next line,
613 548 while also un-indenting automatically after 'raise' or 'return'.
614 549
615 550 This feature uses the readline library, so it will honor your ~/.inputrc
616 551 configuration (or whatever file your INPUTRC variable points to). Adding
617 552 the following lines to your .inputrc file can make indenting/unindenting
618 553 more convenient (M-i indents, M-u unindents)::
619 554
620 555 $if Python
621 556 "\M-i": " "
622 557 "\M-u": "\d\d\d\d"
623 558 $endif
624 559
625 560 Note that there are 4 spaces between the quote marks after "M-i" above.
626 561
627 562 Warning: this feature is ON by default, but it can cause problems with
628 563 the pasting of multi-line indented code (the pasted code gets
629 564 re-indented on each line). A magic function %autoindent allows you to
630 565 toggle it on/off at runtime. You can also disable it permanently on in
631 566 your ipythonrc file (set autoindent 0).
632 567
633 568
634 569 Customizing readline behavior
635 570 +++++++++++++++++++++++++++++
636 571
637 572 All these features are based on the GNU readline library, which has an
638 573 extremely customizable interface. Normally, readline is configured via a
639 574 file which defines the behavior of the library; the details of the
640 575 syntax for this can be found in the readline documentation available
641 576 with your system or on the Internet. IPython doesn't read this file (if
642 577 it exists) directly, but it does support passing to readline valid
643 578 options via a simple interface. In brief, you can customize readline by
644 579 setting the following options in your ipythonrc configuration file (note
645 580 that these options can not be specified at the command line):
646 581
647 582 * **readline_parse_and_bind**: this option can appear as many times as
648 583 you want, each time defining a string to be executed via a
649 584 readline.parse_and_bind() command. The syntax for valid commands
650 585 of this kind can be found by reading the documentation for the GNU
651 586 readline library, as these commands are of the kind which readline
652 587 accepts in its configuration file.
653 588 * **readline_remove_delims**: a string of characters to be removed
654 589 from the default word-delimiters list used by readline, so that
655 590 completions may be performed on strings which contain them. Do not
656 591 change the default value unless you know what you're doing.
657 592 * **readline_omit__names**: when tab-completion is enabled, hitting
658 593 <tab> after a '.' in a name will complete all attributes of an
659 594 object, including all the special methods whose names include
660 595 double underscores (like __getitem__ or __class__). If you'd
661 596 rather not see these names by default, you can set this option to
662 597 1. Note that even when this option is set, you can still see those
663 598 names by explicitly typing a _ after the period and hitting <tab>:
664 599 'name._<tab>' will always complete attribute names starting with '_'.
665 600
666 601 This option is off by default so that new users see all
667 602 attributes of any objects they are dealing with.
668 603
669 604 You will find the default values along with a corresponding detailed
670 605 explanation in your ipythonrc file.
671 606
672 607
673 608 Session logging and restoring
674 609 -----------------------------
675 610
676 611 You can log all input from a session either by starting IPython with the
677 612 command line switches -log or -logfile (see :ref:`here <command_line_options>`)
678 613 or by activating the logging at any moment with the magic function %logstart.
679 614
680 615 Log files can later be reloaded with the -logplay option and IPython
681 616 will attempt to 'replay' the log by executing all the lines in it, thus
682 617 restoring the state of a previous session. This feature is not quite
683 618 perfect, but can still be useful in many cases.
684 619
685 620 The log files can also be used as a way to have a permanent record of
686 621 any code you wrote while experimenting. Log files are regular text files
687 622 which you can later open in your favorite text editor to extract code or
688 623 to 'clean them up' before using them to replay a session.
689 624
690 625 The %logstart function for activating logging in mid-session is used as
691 626 follows:
692 627
693 628 %logstart [log_name [log_mode]]
694 629
695 630 If no name is given, it defaults to a file named 'log' in your
696 631 IPYTHONDIR directory, in 'rotate' mode (see below).
697 632
698 633 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
699 634 history up to that point and then continues logging.
700 635
701 636 %logstart takes a second optional parameter: logging mode. This can be
702 637 one of (note that the modes are given unquoted):
703 638
704 639 * [over:] overwrite existing log_name.
705 640 * [backup:] rename (if exists) to log_name~ and start log_name.
706 641 * [append:] well, that says it.
707 642 * [rotate:] create rotating logs log_name.1~, log_name.2~, etc.
708 643
709 644 The %logoff and %logon functions allow you to temporarily stop and
710 645 resume logging to a file which had previously been started with
711 646 %logstart. They will fail (with an explanation) if you try to use them
712 647 before logging has been started.
713 648
714 649 .. _system_shell_access:
715 650
716 651 System shell access
717 652 -------------------
718 653
719 654 Any input line beginning with a ! character is passed verbatim (minus
720 655 the !, of course) to the underlying operating system. For example,
721 656 typing !ls will run 'ls' in the current directory.
722 657
723 658 Manual capture of command output
724 659 --------------------------------
725 660
726 661 If the input line begins with two exclamation marks, !!, the command is
727 662 executed but its output is captured and returned as a python list, split
728 663 on newlines. Any output sent by the subprocess to standard error is
729 664 printed separately, so that the resulting list only captures standard
730 665 output. The !! syntax is a shorthand for the %sx magic command.
731 666
732 667 Finally, the %sc magic (short for 'shell capture') is similar to %sx,
733 668 but allowing more fine-grained control of the capture details, and
734 669 storing the result directly into a named variable. The direct use of
735 670 %sc is now deprecated, and you should ise the ``var = !cmd`` syntax
736 671 instead.
737 672
738 673 IPython also allows you to expand the value of python variables when
739 674 making system calls. Any python variable or expression which you prepend
740 675 with $ will get expanded before the system call is made::
741 676
742 677 In [1]: pyvar='Hello world'
743 678 In [2]: !echo "A python variable: $pyvar"
744 679 A python variable: Hello world
745 680
746 681 If you want the shell to actually see a literal $, you need to type it
747 682 twice::
748 683
749 684 In [3]: !echo "A system variable: $$HOME"
750 685 A system variable: /home/fperez
751 686
752 687 You can pass arbitrary expressions, though you'll need to delimit them
753 688 with {} if there is ambiguity as to the extent of the expression::
754 689
755 690 In [5]: x=10
756 691 In [6]: y=20
757 692 In [13]: !echo $x+y
758 693 10+y
759 694 In [7]: !echo ${x+y}
760 695 30
761 696
762 697 Even object attributes can be expanded::
763 698
764 699 In [12]: !echo $sys.argv
765 700 [/home/fperez/usr/bin/ipython]
766 701
767 702
768 703 System command aliases
769 704 ----------------------
770 705
771 706 The %alias magic function and the alias option in the ipythonrc
772 707 configuration file allow you to define magic functions which are in fact
773 708 system shell commands. These aliases can have parameters.
774 709
775 710 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
776 711
777 712 Then, typing '%alias_name params' will execute the system command 'cmd
778 713 params' (from your underlying operating system).
779 714
780 715 You can also define aliases with parameters using %s specifiers (one per
781 716 parameter). The following example defines the %parts function as an
782 717 alias to the command 'echo first %s second %s' where each %s will be
783 718 replaced by a positional parameter to the call to %parts::
784 719
785 720 In [1]: alias parts echo first %s second %s
786 721 In [2]: %parts A B
787 722 first A second B
788 723 In [3]: %parts A
789 724 Incorrect number of arguments: 2 expected.
790 725 parts is an alias to: 'echo first %s second %s'
791 726
792 727 If called with no parameters, %alias prints the table of currently
793 728 defined aliases.
794 729
795 730 The %rehash/rehashx magics allow you to load your entire $PATH as
796 731 ipython aliases. See their respective docstrings (or sec. 6.2
797 732 <#sec:magic> for further details).
798 733
799 734
800 735 .. _dreload:
801 736
802 737 Recursive reload
803 738 ----------------
804 739
805 740 The dreload function does a recursive reload of a module: changes made
806 741 to the module since you imported will actually be available without
807 742 having to exit.
808 743
809 744
810 745 Verbose and colored exception traceback printouts
811 746 -------------------------------------------------
812 747
813 748 IPython provides the option to see very detailed exception tracebacks,
814 749 which can be especially useful when debugging large programs. You can
815 750 run any Python file with the %run function to benefit from these
816 751 detailed tracebacks. Furthermore, both normal and verbose tracebacks can
817 752 be colored (if your terminal supports it) which makes them much easier
818 753 to parse visually.
819 754
820 755 See the magic xmode and colors functions for details (just type %magic).
821 756
822 757 These features are basically a terminal version of Ka-Ping Yee's cgitb
823 758 module, now part of the standard Python library.
824 759
825 760
826 761 .. _input_caching:
827 762
828 763 Input caching system
829 764 --------------------
830 765
831 766 IPython offers numbered prompts (In/Out) with input and output caching
832 767 (also referred to as 'input history'). All input is saved and can be
833 768 retrieved as variables (besides the usual arrow key recall), in
834 769 addition to the %rep magic command that brings a history entry
835 770 up for editing on the next command line.
836 771
837 772 The following GLOBAL variables always exist (so don't overwrite them!):
838 773 _i: stores previous input. _ii: next previous. _iii: next-next previous.
839 774 _ih : a list of all input _ih[n] is the input from line n and this list
840 775 is aliased to the global variable In. If you overwrite In with a
841 776 variable of your own, you can remake the assignment to the internal list
842 777 with a simple 'In=_ih'.
843 778
844 779 Additionally, global variables named _i<n> are dynamically created (<n>
845 780 being the prompt counter), such that
846 781 _i<n> == _ih[<n>] == In[<n>].
847 782
848 783 For example, what you typed at prompt 14 is available as _i14, _ih[14]
849 784 and In[14].
850 785
851 786 This allows you to easily cut and paste multi line interactive prompts
852 787 by printing them out: they print like a clean string, without prompt
853 788 characters. You can also manipulate them like regular variables (they
854 789 are strings), modify or exec them (typing 'exec _i9' will re-execute the
855 790 contents of input prompt 9, 'exec In[9:14]+In[18]' will re-execute lines
856 791 9 through 13 and line 18).
857 792
858 793 You can also re-execute multiple lines of input easily by using the
859 794 magic %macro function (which automates the process and allows
860 795 re-execution without having to type 'exec' every time). The macro system
861 796 also allows you to re-execute previous lines which include magic
862 797 function calls (which require special processing). Type %macro? or see
863 798 sec. 6.2 <#sec:magic> for more details on the macro system.
864 799
865 800 A history function %hist allows you to see any part of your input
866 801 history by printing a range of the _i variables.
867 802
868 803 You can also search ('grep') through your history by typing
869 804 '%hist -g somestring'. This also searches through the so called *shadow history*,
870 805 which remembers all the commands (apart from multiline code blocks)
871 806 you have ever entered. Handy for searching for svn/bzr URL's, IP adrresses
872 807 etc. You can bring shadow history entries listed by '%hist -g' up for editing
873 808 (or re-execution by just pressing ENTER) with %rep command. Shadow history
874 809 entries are not available as _iNUMBER variables, and they are identified by
875 810 the '0' prefix in %hist -g output. That is, history entry 12 is a normal
876 811 history entry, but 0231 is a shadow history entry.
877 812
878 813 Shadow history was added because the readline history is inherently very
879 814 unsafe - if you have multiple IPython sessions open, the last session
880 815 to close will overwrite the history of previountly closed session. Likewise,
881 816 if a crash occurs, history is never saved, whereas shadow history entries
882 817 are added after entering every command (so a command executed
883 818 in another IPython session is immediately available in other IPython
884 819 sessions that are open).
885 820
886 821 To conserve space, a command can exist in shadow history only once - it doesn't
887 822 make sense to store a common line like "cd .." a thousand times. The idea is
888 823 mainly to provide a reliable place where valuable, hard-to-remember commands can
889 824 always be retrieved, as opposed to providing an exact sequence of commands
890 825 you have entered in actual order.
891 826
892 827 Because shadow history has all the commands you have ever executed,
893 828 time taken by %hist -g will increase oven time. If it ever starts to take
894 829 too long (or it ends up containing sensitive information like passwords),
895 830 clear the shadow history by `%clear shadow_nuke`.
896 831
897 832 Time taken to add entries to shadow history should be negligible, but
898 833 in any case, if you start noticing performance degradation after using
899 834 IPython for a long time (or running a script that floods the shadow history!),
900 835 you can 'compress' the shadow history by executing
901 836 `%clear shadow_compress`. In practice, this should never be necessary
902 837 in normal use.
903 838
904 839 .. _output_caching:
905 840
906 841 Output caching system
907 842 ---------------------
908 843
909 844 For output that is returned from actions, a system similar to the input
910 845 cache exists but using _ instead of _i. Only actions that produce a
911 846 result (NOT assignments, for example) are cached. If you are familiar
912 847 with Mathematica, IPython's _ variables behave exactly like
913 848 Mathematica's % variables.
914 849
915 850 The following GLOBAL variables always exist (so don't overwrite them!):
916 851
917 852 * [_] (a single underscore) : stores previous output, like Python's
918 853 default interpreter.
919 854 * [__] (two underscores): next previous.
920 855 * [___] (three underscores): next-next previous.
921 856
922 857 Additionally, global variables named _<n> are dynamically created (<n>
923 858 being the prompt counter), such that the result of output <n> is always
924 859 available as _<n> (don't use the angle brackets, just the number, e.g.
925 860 _21).
926 861
927 862 These global variables are all stored in a global dictionary (not a
928 863 list, since it only has entries for lines which returned a result)
929 864 available under the names _oh and Out (similar to _ih and In). So the
930 865 output from line 12 can be obtained as _12, Out[12] or _oh[12]. If you
931 866 accidentally overwrite the Out variable you can recover it by typing
932 867 'Out=_oh' at the prompt.
933 868
934 869 This system obviously can potentially put heavy memory demands on your
935 870 system, since it prevents Python's garbage collector from removing any
936 871 previously computed results. You can control how many results are kept
937 872 in memory with the option (at the command line or in your ipythonrc
938 873 file) cache_size. If you set it to 0, the whole system is completely
939 874 disabled and the prompts revert to the classic '>>>' of normal Python.
940 875
941 876
942 877 Directory history
943 878 -----------------
944 879
945 880 Your history of visited directories is kept in the global list _dh, and
946 881 the magic %cd command can be used to go to any entry in that list. The
947 882 %dhist command allows you to view this history. Do ``cd -<TAB`` to
948 883 conventiently view the directory history.
949 884
950 885
951 886 Automatic parentheses and quotes
952 887 --------------------------------
953 888
954 889 These features were adapted from Nathan Gray's LazyPython. They are
955 890 meant to allow less typing for common situations.
956 891
957 892
958 893 Automatic parentheses
959 894 ---------------------
960 895
961 896 Callable objects (i.e. functions, methods, etc) can be invoked like this
962 897 (notice the commas between the arguments)::
963 898
964 899 >>> callable_ob arg1, arg2, arg3
965 900
966 901 and the input will be translated to this::
967 902
968 903 -> callable_ob(arg1, arg2, arg3)
969 904
970 905 You can force automatic parentheses by using '/' as the first character
971 906 of a line. For example::
972 907
973 908 >>> /globals # becomes 'globals()'
974 909
975 910 Note that the '/' MUST be the first character on the line! This won't work::
976 911
977 912 >>> print /globals # syntax error
978 913
979 914 In most cases the automatic algorithm should work, so you should rarely
980 915 need to explicitly invoke /. One notable exception is if you are trying
981 916 to call a function with a list of tuples as arguments (the parenthesis
982 917 will confuse IPython)::
983 918
984 919 In [1]: zip (1,2,3),(4,5,6) # won't work
985 920
986 921 but this will work::
987 922
988 923 In [2]: /zip (1,2,3),(4,5,6)
989 924 ---> zip ((1,2,3),(4,5,6))
990 925 Out[2]= [(1, 4), (2, 5), (3, 6)]
991 926
992 927 IPython tells you that it has altered your command line by displaying
993 928 the new command line preceded by ->. e.g.::
994 929
995 930 In [18]: callable list
996 931 ----> callable (list)
997 932
998 933
999 934 Automatic quoting
1000 935 -----------------
1001 936
1002 937 You can force automatic quoting of a function's arguments by using ','
1003 938 or ';' as the first character of a line. For example::
1004 939
1005 940 >>> ,my_function /home/me # becomes my_function("/home/me")
1006 941
1007 942 If you use ';' instead, the whole argument is quoted as a single string
1008 943 (while ',' splits on whitespace)::
1009 944
1010 945 >>> ,my_function a b c # becomes my_function("a","b","c")
1011 946
1012 947 >>> ;my_function a b c # becomes my_function("a b c")
1013 948
1014 949 Note that the ',' or ';' MUST be the first character on the line! This
1015 950 won't work::
1016 951
1017 952 >>> x = ,my_function /home/me # syntax error
1018 953
1019 954 IPython as your default Python environment
1020 955 ==========================================
1021 956
1022 957 Python honors the environment variable PYTHONSTARTUP and will execute at
1023 958 startup the file referenced by this variable. If you put at the end of
1024 959 this file the following two lines of code::
1025 960
1026 961 import IPython
1027 962 IPython.Shell.IPShell().mainloop(sys_exit=1)
1028 963
1029 964 then IPython will be your working environment anytime you start Python.
1030 965 The sys_exit=1 is needed to have IPython issue a call to sys.exit() when
1031 966 it finishes, otherwise you'll be back at the normal Python '>>>'
1032 967 prompt.
1033 968
1034 969 This is probably useful to developers who manage multiple Python
1035 970 versions and don't want to have correspondingly multiple IPython
1036 971 versions. Note that in this mode, there is no way to pass IPython any
1037 972 command-line options, as those are trapped first by Python itself.
1038 973
1039 974 .. _Embedding:
1040 975
1041 976 Embedding IPython
1042 977 =================
1043 978
1044 979 It is possible to start an IPython instance inside your own Python
1045 980 programs. This allows you to evaluate dynamically the state of your
1046 981 code, operate with your variables, analyze them, etc. Note however that
1047 982 any changes you make to values while in the shell do not propagate back
1048 983 to the running code, so it is safe to modify your values because you
1049 984 won't break your code in bizarre ways by doing so.
1050 985
1051 986 This feature allows you to easily have a fully functional python
1052 987 environment for doing object introspection anywhere in your code with a
1053 988 simple function call. In some cases a simple print statement is enough,
1054 989 but if you need to do more detailed analysis of a code fragment this
1055 990 feature can be very valuable.
1056 991
1057 992 It can also be useful in scientific computing situations where it is
1058 993 common to need to do some automatic, computationally intensive part and
1059 994 then stop to look at data, plots, etc.
1060 995 Opening an IPython instance will give you full access to your data and
1061 996 functions, and you can resume program execution once you are done with
1062 997 the interactive part (perhaps to stop again later, as many times as
1063 998 needed).
1064 999
1065 1000 The following code snippet is the bare minimum you need to include in
1066 1001 your Python programs for this to work (detailed examples follow later)::
1067 1002
1068 1003 from IPython.Shell import IPShellEmbed
1069 1004
1070 1005 ipshell = IPShellEmbed()
1071 1006
1072 1007 ipshell() # this call anywhere in your program will start IPython
1073 1008
1074 1009 You can run embedded instances even in code which is itself being run at
1075 1010 the IPython interactive prompt with '%run <filename>'. Since it's easy
1076 1011 to get lost as to where you are (in your top-level IPython or in your
1077 1012 embedded one), it's a good idea in such cases to set the in/out prompts
1078 1013 to something different for the embedded instances. The code examples
1079 1014 below illustrate this.
1080 1015
1081 1016 You can also have multiple IPython instances in your program and open
1082 1017 them separately, for example with different options for data
1083 1018 presentation. If you close and open the same instance multiple times,
1084 1019 its prompt counters simply continue from each execution to the next.
1085 1020
1086 1021 Please look at the docstrings in the Shell.py module for more details on
1087 1022 the use of this system.
1088 1023
1089 1024 The following sample file illustrating how to use the embedding
1090 1025 functionality is provided in the examples directory as example-embed.py.
1091 1026 It should be fairly self-explanatory::
1092 1027
1093 1028
1094 1029 #!/usr/bin/env python
1095 1030
1096 1031 """An example of how to embed an IPython shell into a running program.
1097 1032
1098 1033 Please see the documentation in the IPython.Shell module for more details.
1099 1034
1100 1035 The accompanying file example-embed-short.py has quick code fragments for
1101 1036 embedding which you can cut and paste in your code once you understand how
1102 1037 things work.
1103 1038
1104 1039 The code in this file is deliberately extra-verbose, meant for learning."""
1105 1040
1106 1041 # The basics to get you going:
1107 1042
1108 1043 # IPython sets the __IPYTHON__ variable so you can know if you have nested
1109 1044 # copies running.
1110 1045
1111 1046 # Try running this code both at the command line and from inside IPython (with
1112 1047 # %run example-embed.py)
1113 1048 try:
1114 1049 __IPYTHON__
1115 1050 except NameError:
1116 1051 nested = 0
1117 1052 args = ['']
1118 1053 else:
1119 1054 print "Running nested copies of IPython."
1120 1055 print "The prompts for the nested copy have been modified"
1121 1056 nested = 1
1122 1057 # what the embedded instance will see as sys.argv:
1123 1058 args = ['-pi1','In <\\#>: ','-pi2',' .\\D.: ',
1124 1059 '-po','Out<\\#>: ','-nosep']
1125 1060
1126 1061 # First import the embeddable shell class
1127 1062 from IPython.Shell import IPShellEmbed
1128 1063
1129 1064 # Now create an instance of the embeddable shell. The first argument is a
1130 1065 # string with options exactly as you would type them if you were starting
1131 1066 # IPython at the system command line. Any parameters you want to define for
1132 1067 # configuration can thus be specified here.
1133 1068 ipshell = IPShellEmbed(args,
1134 1069 banner = 'Dropping into IPython',
1135 1070 exit_msg = 'Leaving Interpreter, back to program.')
1136 1071
1137 1072 # Make a second instance, you can have as many as you want.
1138 1073 if nested:
1139 1074 args[1] = 'In2<\\#>'
1140 1075 else:
1141 1076 args = ['-pi1','In2<\\#>: ','-pi2',' .\\D.: ',
1142 1077 '-po','Out<\\#>: ','-nosep']
1143 1078 ipshell2 = IPShellEmbed(args,banner = 'Second IPython instance.')
1144 1079
1145 1080 print '\nHello. This is printed from the main controller program.\n'
1146 1081
1147 1082 # You can then call ipshell() anywhere you need it (with an optional
1148 1083 # message):
1149 1084 ipshell('***Called from top level. '
1150 1085 'Hit Ctrl-D to exit interpreter and continue program.\n'
1151 1086 'Note that if you use %kill_embedded, you can fully deactivate\n'
1152 1087 'This embedded instance so it will never turn on again')
1153 1088
1154 1089 print '\nBack in caller program, moving along...\n'
1155 1090
1156 1091 #---------------------------------------------------------------------------
1157 1092 # More details:
1158 1093
1159 1094 # IPShellEmbed instances don't print the standard system banner and
1160 1095 # messages. The IPython banner (which actually may contain initialization
1161 1096 # messages) is available as <instance>.IP.BANNER in case you want it.
1162 1097
1163 1098 # IPShellEmbed instances print the following information everytime they
1164 1099 # start:
1165 1100
1166 1101 # - A global startup banner.
1167 1102
1168 1103 # - A call-specific header string, which you can use to indicate where in the
1169 1104 # execution flow the shell is starting.
1170 1105
1171 1106 # They also print an exit message every time they exit.
1172 1107
1173 1108 # Both the startup banner and the exit message default to None, and can be set
1174 1109 # either at the instance constructor or at any other time with the
1175 1110 # set_banner() and set_exit_msg() methods.
1176 1111
1177 1112 # The shell instance can be also put in 'dummy' mode globally or on a per-call
1178 1113 # basis. This gives you fine control for debugging without having to change
1179 1114 # code all over the place.
1180 1115
1181 1116 # The code below illustrates all this.
1182 1117
1183 1118
1184 1119 # This is how the global banner and exit_msg can be reset at any point
1185 1120 ipshell.set_banner('Entering interpreter - New Banner')
1186 1121 ipshell.set_exit_msg('Leaving interpreter - New exit_msg')
1187 1122
1188 1123 def foo(m):
1189 1124 s = 'spam'
1190 1125 ipshell('***In foo(). Try @whos, or print s or m:')
1191 1126 print 'foo says m = ',m
1192 1127
1193 1128 def bar(n):
1194 1129 s = 'eggs'
1195 1130 ipshell('***In bar(). Try @whos, or print s or n:')
1196 1131 print 'bar says n = ',n
1197 1132
1198 1133 # Some calls to the above functions which will trigger IPython:
1199 1134 print 'Main program calling foo("eggs")\n'
1200 1135 foo('eggs')
1201 1136
1202 1137 # The shell can be put in 'dummy' mode where calls to it silently return. This
1203 1138 # allows you, for example, to globally turn off debugging for a program with a
1204 1139 # single call.
1205 1140 ipshell.set_dummy_mode(1)
1206 1141 print '\nTrying to call IPython which is now "dummy":'
1207 1142 ipshell()
1208 1143 print 'Nothing happened...'
1209 1144 # The global 'dummy' mode can still be overridden for a single call
1210 1145 print '\nOverriding dummy mode manually:'
1211 1146 ipshell(dummy=0)
1212 1147
1213 1148 # Reactivate the IPython shell
1214 1149 ipshell.set_dummy_mode(0)
1215 1150
1216 1151 print 'You can even have multiple embedded instances:'
1217 1152 ipshell2()
1218 1153
1219 1154 print '\nMain program calling bar("spam")\n'
1220 1155 bar('spam')
1221 1156
1222 1157 print 'Main program finished. Bye!'
1223 1158
1224 1159 #********************** End of file <example-embed.py> ***********************
1225 1160
1226 1161 Once you understand how the system functions, you can use the following
1227 1162 code fragments in your programs which are ready for cut and paste::
1228 1163
1229 1164
1230 1165 """Quick code snippets for embedding IPython into other programs.
1231 1166
1232 1167 See example-embed.py for full details, this file has the bare minimum code for
1233 1168 cut and paste use once you understand how to use the system."""
1234 1169
1235 1170 #---------------------------------------------------------------------------
1236 1171 # This code loads IPython but modifies a few things if it detects it's running
1237 1172 # embedded in another IPython session (helps avoid confusion)
1238 1173
1239 1174 try:
1240 1175 __IPYTHON__
1241 1176 except NameError:
1242 1177 argv = ['']
1243 1178 banner = exit_msg = ''
1244 1179 else:
1245 1180 # Command-line options for IPython (a list like sys.argv)
1246 1181 argv = ['-pi1','In <\\#>:','-pi2',' .\\D.:','-po','Out<\\#>:']
1247 1182 banner = '*** Nested interpreter ***'
1248 1183 exit_msg = '*** Back in main IPython ***'
1249 1184
1250 1185 # First import the embeddable shell class
1251 1186 from IPython.Shell import IPShellEmbed
1252 1187 # Now create the IPython shell instance. Put ipshell() anywhere in your code
1253 1188 # where you want it to open.
1254 1189 ipshell = IPShellEmbed(argv,banner=banner,exit_msg=exit_msg)
1255 1190
1256 1191 #---------------------------------------------------------------------------
1257 1192 # This code will load an embeddable IPython shell always with no changes for
1258 1193 # nested embededings.
1259 1194
1260 1195 from IPython.Shell import IPShellEmbed
1261 1196 ipshell = IPShellEmbed()
1262 1197 # Now ipshell() will open IPython anywhere in the code.
1263 1198
1264 1199 #---------------------------------------------------------------------------
1265 1200 # This code loads an embeddable shell only if NOT running inside
1266 1201 # IPython. Inside IPython, the embeddable shell variable ipshell is just a
1267 1202 # dummy function.
1268 1203
1269 1204 try:
1270 1205 __IPYTHON__
1271 1206 except NameError:
1272 1207 from IPython.Shell import IPShellEmbed
1273 1208 ipshell = IPShellEmbed()
1274 1209 # Now ipshell() will open IPython anywhere in the code
1275 1210 else:
1276 1211 # Define a dummy ipshell() so the same code doesn't crash inside an
1277 1212 # interactive IPython
1278 1213 def ipshell(): pass
1279 1214
1280 1215 #******************* End of file <example-embed-short.py> ********************
1281 1216
1282 1217 Using the Python debugger (pdb)
1283 1218 ===============================
1284 1219
1285 1220 Running entire programs via pdb
1286 1221 -------------------------------
1287 1222
1288 1223 pdb, the Python debugger, is a powerful interactive debugger which
1289 1224 allows you to step through code, set breakpoints, watch variables,
1290 1225 etc. IPython makes it very easy to start any script under the control
1291 1226 of pdb, regardless of whether you have wrapped it into a 'main()'
1292 1227 function or not. For this, simply type '%run -d myscript' at an
1293 1228 IPython prompt. See the %run command's documentation (via '%run?' or
1294 1229 in Sec. magic_ for more details, including how to control where pdb
1295 1230 will stop execution first.
1296 1231
1297 1232 For more information on the use of the pdb debugger, read the included
1298 1233 pdb.doc file (part of the standard Python distribution). On a stock
1299 1234 Linux system it is located at /usr/lib/python2.3/pdb.doc, but the
1300 1235 easiest way to read it is by using the help() function of the pdb module
1301 1236 as follows (in an IPython prompt):
1302 1237
1303 1238 In [1]: import pdb
1304 1239 In [2]: pdb.help()
1305 1240
1306 1241 This will load the pdb.doc document in a file viewer for you automatically.
1307 1242
1308 1243
1309 1244 Automatic invocation of pdb on exceptions
1310 1245 -----------------------------------------
1311 1246
1312 1247 IPython, if started with the -pdb option (or if the option is set in
1313 1248 your rc file) can call the Python pdb debugger every time your code
1314 1249 triggers an uncaught exception. This feature
1315 1250 can also be toggled at any time with the %pdb magic command. This can be
1316 1251 extremely useful in order to find the origin of subtle bugs, because pdb
1317 1252 opens up at the point in your code which triggered the exception, and
1318 1253 while your program is at this point 'dead', all the data is still
1319 1254 available and you can walk up and down the stack frame and understand
1320 1255 the origin of the problem.
1321 1256
1322 1257 Furthermore, you can use these debugging facilities both with the
1323 1258 embedded IPython mode and without IPython at all. For an embedded shell
1324 1259 (see sec. Embedding_), simply call the constructor with
1325 1260 '-pdb' in the argument string and automatically pdb will be called if an
1326 1261 uncaught exception is triggered by your code.
1327 1262
1328 1263 For stand-alone use of the feature in your programs which do not use
1329 1264 IPython at all, put the following lines toward the top of your 'main'
1330 1265 routine::
1331 1266
1332 1267 import sys
1333 1268 from IPython.core import ultratb
1334 1269 sys.excepthook = ultratb.FormattedTB(mode='Verbose',
1335 1270 color_scheme='Linux', call_pdb=1)
1336 1271
1337 1272 The mode keyword can be either 'Verbose' or 'Plain', giving either very
1338 1273 detailed or normal tracebacks respectively. The color_scheme keyword can
1339 1274 be one of 'NoColor', 'Linux' (default) or 'LightBG'. These are the same
1340 1275 options which can be set in IPython with -colors and -xmode.
1341 1276
1342 1277 This will give any of your programs detailed, colored tracebacks with
1343 1278 automatic invocation of pdb.
1344 1279
1345 1280
1346 1281 Extensions for syntax processing
1347 1282 ================================
1348 1283
1349 1284 This isn't for the faint of heart, because the potential for breaking
1350 1285 things is quite high. But it can be a very powerful and useful feature.
1351 1286 In a nutshell, you can redefine the way IPython processes the user input
1352 1287 line to accept new, special extensions to the syntax without needing to
1353 1288 change any of IPython's own code.
1354 1289
1355 1290 In the IPython/extensions directory you will find some examples
1356 1291 supplied, which we will briefly describe now. These can be used 'as is'
1357 1292 (and both provide very useful functionality), or you can use them as a
1358 1293 starting point for writing your own extensions.
1359 1294
1360 1295
1361 1296 Pasting of code starting with '>>> ' or '... '
1362 1297 ----------------------------------------------
1363 1298
1364 1299 In the python tutorial it is common to find code examples which have
1365 1300 been taken from real python sessions. The problem with those is that all
1366 1301 the lines begin with either '>>> ' or '... ', which makes it impossible
1367 1302 to paste them all at once. One must instead do a line by line manual
1368 1303 copying, carefully removing the leading extraneous characters.
1369 1304
1370 1305 This extension identifies those starting characters and removes them
1371 1306 from the input automatically, so that one can paste multi-line examples
1372 1307 directly into IPython, saving a lot of time. Please look at the file
1373 1308 InterpreterPasteInput.py in the IPython/extensions directory for details
1374 1309 on how this is done.
1375 1310
1376 1311 IPython comes with a special profile enabling this feature, called
1377 1312 tutorial. Simply start IPython via 'ipython -p tutorial' and the feature
1378 1313 will be available. In a normal IPython session you can activate the
1379 1314 feature by importing the corresponding module with:
1380 1315 In [1]: import IPython.extensions.InterpreterPasteInput
1381 1316
1382 1317 The following is a 'screenshot' of how things work when this extension
1383 1318 is on, copying an example from the standard tutorial::
1384 1319
1385 1320 IPython profile: tutorial
1386 1321
1387 1322 *** Pasting of code with ">>>" or "..." has been enabled.
1388 1323
1389 1324 In [1]: >>> def fib2(n): # return Fibonacci series up to n
1390 1325 ...: ... """Return a list containing the Fibonacci series up to
1391 1326 n."""
1392 1327 ...: ... result = []
1393 1328 ...: ... a, b = 0, 1
1394 1329 ...: ... while b < n:
1395 1330 ...: ... result.append(b) # see below
1396 1331 ...: ... a, b = b, a+b
1397 1332 ...: ... return result
1398 1333 ...:
1399 1334
1400 1335 In [2]: fib2(10)
1401 1336 Out[2]: [1, 1, 2, 3, 5, 8]
1402 1337
1403 1338 Note that as currently written, this extension does not recognize
1404 1339 IPython's prompts for pasting. Those are more complicated, since the
1405 1340 user can change them very easily, they involve numbers and can vary in
1406 1341 length. One could however extract all the relevant information from the
1407 1342 IPython instance and build an appropriate regular expression. This is
1408 1343 left as an exercise for the reader.
1409 1344
1410 1345
1411 1346 Input of physical quantities with units
1412 1347 ---------------------------------------
1413 1348
1414 1349 The module PhysicalQInput allows a simplified form of input for physical
1415 1350 quantities with units. This file is meant to be used in conjunction with
1416 1351 the PhysicalQInteractive module (in the same directory) and
1417 1352 Physics.PhysicalQuantities from Konrad Hinsen's ScientificPython
1418 1353 (http://dirac.cnrs-orleans.fr/ScientificPython/).
1419 1354
1420 1355 The Physics.PhysicalQuantities module defines PhysicalQuantity objects,
1421 1356 but these must be declared as instances of a class. For example, to
1422 1357 define v as a velocity of 3 m/s, normally you would write::
1423 1358
1424 1359 In [1]: v = PhysicalQuantity(3,'m/s')
1425 1360
1426 1361 Using the PhysicalQ_Input extension this can be input instead as:
1427 1362 In [1]: v = 3 m/s
1428 1363 which is much more convenient for interactive use (even though it is
1429 1364 blatantly invalid Python syntax).
1430 1365
1431 1366 The physics profile supplied with IPython (enabled via 'ipython -p
1432 1367 physics') uses these extensions, which you can also activate with:
1433 1368
1434 1369 from math import * # math MUST be imported BEFORE PhysicalQInteractive
1435 1370 from IPython.extensions.PhysicalQInteractive import *
1436 1371 import IPython.extensions.PhysicalQInput
1437 1372
1373 .. _gui_support:
1438 1374
1439 Threading support
1440 =================
1375 GUI event loop support support
1376 ==============================
1377
1378 .. versionadded:: 0.11
1379 The ``%gui`` magic and :mod:`IPython.lib.inputhook`.
1380
1381 IPython has excellent support for working interactively with Graphical User
1382 Interface (GUI) toolkits, such as wxPython, PyQt4, PyGTK and Tk. This is
1383 implemented using Python's builtin ``PyOSInputHook`` hook. This implementation
1384 is extremely robust compared to our previous threaded based version. The
1385 advantages of
1386
1387 * GUIs can be enabled and disabled dynamically at runtime.
1388 * The active GUI can be switched dynamically at runtime.
1389 * In some cases, multiple GUIs can run simultaneously with no problems.
1390 * There is a developer API in :mod:`IPython.lib.inputhook` for customizing
1391 all of these things.
1392
1393 For users, enabling GUI event loop integration is simple. You simple use the
1394 ``%gui`` magic as follows::
1395
1396 %gui [-a] [GUINAME]
1397
1398 With no arguments, ``%gui`` removes all GUI support. Valid ``GUINAME``
1399 arguments are ``wx``, ``qt4``, ``gtk`` and ``tk``. The ``-a`` option will
1400 create and return a running application object for the selected GUI toolkit.
1401
1402 This to use wxPython interactively and create a running :class:`wx.App`
1403 object, do::
1404
1405 %gui -a wx
1406
1407 For information on IPython's Matplotlib integration (and the ``pylab`` mode)
1408 see :ref:`this section <matplotlib_support>`.
1441 1409
1442 WARNING: The threading support is still somewhat experimental, and it
1443 has only seen reasonable testing under Linux. Threaded code is
1444 particularly tricky to debug, and it tends to show extremely
1445 platform-dependent behavior. Since I only have access to Linux machines,
1446 I will have to rely on user's experiences and assistance for this area
1447 of IPython to improve under other platforms.
1448
1449 IPython, via the -gthread , -qthread, -q4thread and -wthread options
1450 (described in Sec. `Threading options`_), can run in
1451 multithreaded mode to support pyGTK, Qt3, Qt4 and WXPython applications
1452 respectively. These GUI toolkits need to control the python main loop of
1453 execution, so under a normal Python interpreter, starting a pyGTK, Qt3,
1454 Qt4 or WXPython application will immediately freeze the shell.
1455
1456 IPython, with one of these options (you can only use one at a time),
1457 separates the graphical loop and IPython's code execution run into
1458 different threads. This allows you to test interactively (with %run, for
1459 example) your GUI code without blocking.
1460
1461 A nice mini-tutorial on using IPython along with the Qt Designer
1462 application is available at the SciPy wiki:
1463 http://www.scipy.org/Cookbook/Matplotlib/Qt_with_IPython_and_Designer.
1464
1465
1466 Tk issues
1467 ---------
1468
1469 As indicated in Sec. `Threading options`_, a special -tk option is
1470 provided to try and allow Tk graphical applications to coexist
1471 interactively with WX, Qt or GTK ones. Whether this works at all,
1472 however, is very platform and configuration dependent. Please
1473 experiment with simple test cases before committing to using this
1474 combination of Tk and GTK/Qt/WX threading in a production environment.
1475
1476
1477 I/O pitfalls
1478 ------------
1479
1480 Be mindful that the Python interpreter switches between threads every
1481 $N$ bytecodes, where the default value as of Python 2.3 is $N=100.$ This
1482 value can be read by using the sys.getcheckinterval() function, and it
1483 can be reset via sys.setcheckinterval(N). This switching of threads can
1484 cause subtly confusing effects if one of your threads is doing file I/O.
1485 In text mode, most systems only flush file buffers when they encounter a
1486 '\n'. An instruction as simple as::
1487
1488 print >> filehandle, ''hello world''
1489
1490 actually consists of several bytecodes, so it is possible that the
1491 newline does not reach your file before the next thread switch.
1492 Similarly, if you are writing to a file in binary mode, the file won't
1493 be flushed until the buffer fills, and your other thread may see
1494 apparently truncated files.
1495
1496 For this reason, if you are using IPython's thread support and have (for
1497 example) a GUI application which will read data generated by files
1498 written to from the IPython thread, the safest approach is to open all
1499 of your files in unbuffered mode (the third argument to the file/open
1500 function is the buffering value)::
1501
1502 filehandle = open(filename,mode,0)
1503
1504 This is obviously a brute force way of avoiding race conditions with the
1505 file buffering. If you want to do it cleanly, and you have a resource
1506 which is being shared by the interactive IPython loop and your GUI
1507 thread, you should really handle it with thread locking and
1508 syncrhonization properties. The Python documentation discusses these.
1410 For developers that want to use IPython's GUI event loop integration in
1411 the form of a library, the capabilities are exposed in library form
1412 in the :mod:`IPython.lib.inputhook`. Interested developers should see the
1413 module docstrings for more information.
1414
1415 .. _matplotlib_support:
1416
1417 Plotting with matplotlib
1418 ========================
1419
1420
1421 `Matplotlib`_ provides high quality 2D and
1422 3D plotting for Python. Matplotlib can produce plots on screen using a variety
1423 of GUI toolkits, including Tk, PyGTK, PyQt4 and wxPython. It also provides a
1424 number of commands useful for scientific computing, all with a syntax
1425 compatible with that of the popular Matlab program.
1426
1427 Many IPython users have come to rely on IPython's ``-pylab`` mode which
1428 automates the integration of Matplotlib with IPython. We are still in the
1429 process of working with the Matplotlib developers to finalize the new pylab
1430 API, but for now you can use Matplotlib interactively using the following
1431 commands::
1432
1433 %gui -a wx
1434 import matplotlib
1435 matplotlib.use('wxagg')
1436 from matplotlib import pylab
1437 pylab.interactive(True)
1438
1439 All of this will soon be automated as Matplotlib beings to include
1440 new logic that uses our new GUI support.
1509 1441
1510 1442 .. _interactive_demos:
1511 1443
1512 1444 Interactive demos with IPython
1513 1445 ==============================
1514 1446
1515 1447 IPython ships with a basic system for running scripts interactively in
1516 1448 sections, useful when presenting code to audiences. A few tags embedded
1517 1449 in comments (so that the script remains valid Python code) divide a file
1518 1450 into separate blocks, and the demo can be run one block at a time, with
1519 1451 IPython printing (with syntax highlighting) the block before executing
1520 1452 it, and returning to the interactive prompt after each block. The
1521 1453 interactive namespace is updated after each block is run with the
1522 1454 contents of the demo's namespace.
1523 1455
1524 1456 This allows you to show a piece of code, run it and then execute
1525 1457 interactively commands based on the variables just created. Once you
1526 1458 want to continue, you simply execute the next block of the demo. The
1527 1459 following listing shows the markup necessary for dividing a script into
1528 1460 sections for execution as a demo::
1529 1461
1530 1462
1531 1463 """A simple interactive demo to illustrate the use of IPython's Demo class.
1532 1464
1533 1465 Any python script can be run as a demo, but that does little more than showing
1534 1466 it on-screen, syntax-highlighted in one shot. If you add a little simple
1535 1467 markup, you can stop at specified intervals and return to the ipython prompt,
1536 1468 resuming execution later.
1537 1469 """
1538 1470
1539 1471 print 'Hello, welcome to an interactive IPython demo.'
1540 1472 print 'Executing this block should require confirmation before proceeding,'
1541 1473 print 'unless auto_all has been set to true in the demo object'
1542 1474
1543 1475 # The mark below defines a block boundary, which is a point where IPython will
1544 1476 # stop execution and return to the interactive prompt.
1545 1477 # Note that in actual interactive execution,
1546 1478 # <demo> --- stop ---
1547 1479
1548 1480 x = 1
1549 1481 y = 2
1550 1482
1551 1483 # <demo> --- stop ---
1552 1484
1553 1485 # the mark below makes this block as silent
1554 1486 # <demo> silent
1555 1487
1556 1488 print 'This is a silent block, which gets executed but not printed.'
1557 1489
1558 1490 # <demo> --- stop ---
1559 1491 # <demo> auto
1560 1492 print 'This is an automatic block.'
1561 1493 print 'It is executed without asking for confirmation, but printed.'
1562 1494 z = x+y
1563 1495
1564 1496 print 'z=',x
1565 1497
1566 1498 # <demo> --- stop ---
1567 1499 # This is just another normal block.
1568 1500 print 'z is now:', z
1569 1501
1570 1502 print 'bye!'
1571 1503
1572 1504 In order to run a file as a demo, you must first make a Demo object out
1573 1505 of it. If the file is named myscript.py, the following code will make a
1574 1506 demo::
1575 1507
1576 1508 from IPython.demo import Demo
1577 1509
1578 1510 mydemo = Demo('myscript.py')
1579 1511
1580 1512 This creates the mydemo object, whose blocks you run one at a time by
1581 1513 simply calling the object with no arguments. If you have autocall active
1582 1514 in IPython (the default), all you need to do is type::
1583 1515
1584 1516 mydemo
1585 1517
1586 1518 and IPython will call it, executing each block. Demo objects can be
1587 1519 restarted, you can move forward or back skipping blocks, re-execute the
1588 1520 last block, etc. Simply use the Tab key on a demo object to see its
1589 1521 methods, and call '?' on them to see their docstrings for more usage
1590 1522 details. In addition, the demo module itself contains a comprehensive
1591 1523 docstring, which you can access via::
1592 1524
1593 1525 from IPython import demo
1594 1526
1595 1527 demo?
1596 1528
1597 1529 Limitations: It is important to note that these demos are limited to
1598 1530 fairly simple uses. In particular, you can not put division marks in
1599 1531 indented code (loops, if statements, function definitions, etc.)
1600 1532 Supporting something like this would basically require tracking the
1601 1533 internal execution state of the Python interpreter, so only top-level
1602 1534 divisions are allowed. If you want to be able to open an IPython
1603 1535 instance at an arbitrary point in a program, you can use IPython's
1604 1536 embedding facilities, described in detail in Sec. 9
1605 1537
1538 .. [Matplotlib] Matplotlib. http://matplotlib.sourceforge.net
1606 1539
1607 .. _Matplotlib support:
1608
1609 Plotting with matplotlib
1610 ========================
1611
1612 The matplotlib library (http://matplotlib.sourceforge.net
1613 http://matplotlib.sourceforge.net) provides high quality 2D plotting for
1614 Python. Matplotlib can produce plots on screen using a variety of GUI
1615 toolkits, including Tk, GTK and WXPython. It also provides a number of
1616 commands useful for scientific computing, all with a syntax compatible
1617 with that of the popular Matlab program.
1618
1619 IPython accepts the special option -pylab (see :ref:`here
1620 <command_line_options>`). This configures it to support matplotlib, honoring
1621 the settings in the .matplotlibrc file. IPython will detect the user's choice
1622 of matplotlib GUI backend, and automatically select the proper threading model
1623 to prevent blocking. It also sets matplotlib in interactive mode and modifies
1624 %run slightly, so that any matplotlib-based script can be executed using %run
1625 and the final show() command does not block the interactive shell.
1626
1627 The -pylab option must be given first in order for IPython to configure its
1628 threading mode. However, you can still issue other options afterwards. This
1629 allows you to have a matplotlib-based environment customized with additional
1630 modules using the standard IPython profile mechanism (see :ref:`here
1631 <profiles>`): ``ipython -pylab -p myprofile`` will load the profile defined in
1632 ipythonrc-myprofile after configuring matplotlib.
@@ -1,16 +1,15 b''
1 1 .. _parallel_index:
2 2
3 3 ====================================
4 4 Using IPython for parallel computing
5 5 ====================================
6 6
7 7 .. toctree::
8 8 :maxdepth: 2
9 9
10 10 parallel_intro.txt
11 11 parallel_process.txt
12 12 parallel_multiengine.txt
13 13 parallel_task.txt
14 14 parallel_mpi.txt
15 15 parallel_security.txt
16 visionhpc.txt
@@ -1,205 +1,237 b''
1 1 .. _ip1par:
2 2
3 3 ============================
4 4 Overview and getting started
5 5 ============================
6 6
7 7 Introduction
8 8 ============
9 9
10 10 This section gives an overview of IPython's sophisticated and powerful
11 11 architecture for parallel and distributed computing. This architecture
12 12 abstracts out parallelism in a very general way, which enables IPython to
13 13 support many different styles of parallelism including:
14 14
15 15 * Single program, multiple data (SPMD) parallelism.
16 16 * Multiple program, multiple data (MPMD) parallelism.
17 17 * Message passing using MPI.
18 18 * Task farming.
19 19 * Data parallel.
20 20 * Combinations of these approaches.
21 21 * Custom user defined approaches.
22 22
23 23 Most importantly, IPython enables all types of parallel applications to
24 24 be developed, executed, debugged and monitored *interactively*. Hence,
25 25 the ``I`` in IPython. The following are some example usage cases for IPython:
26 26
27 27 * Quickly parallelize algorithms that are embarrassingly parallel
28 28 using a number of simple approaches. Many simple things can be
29 29 parallelized interactively in one or two lines of code.
30 30
31 31 * Steer traditional MPI applications on a supercomputer from an
32 32 IPython session on your laptop.
33 33
34 34 * Analyze and visualize large datasets (that could be remote and/or
35 35 distributed) interactively using IPython and tools like
36 36 matplotlib/TVTK.
37 37
38 38 * Develop, test and debug new parallel algorithms
39 39 (that may use MPI) interactively.
40 40
41 41 * Tie together multiple MPI jobs running on different systems into
42 42 one giant distributed and parallel system.
43 43
44 44 * Start a parallel job on your cluster and then have a remote
45 45 collaborator connect to it and pull back data into their
46 46 local IPython session for plotting and analysis.
47 47
48 48 * Run a set of tasks on a set of CPUs using dynamic load balancing.
49 49
50 50 Architecture overview
51 51 =====================
52 52
53 53 The IPython architecture consists of three components:
54 54
55 55 * The IPython engine.
56 56 * The IPython controller.
57 57 * Various controller clients.
58 58
59 59 These components live in the :mod:`IPython.kernel` package and are
60 60 installed with IPython. They do, however, have additional dependencies
61 61 that must be installed. For more information, see our
62 62 :ref:`installation documentation <install_index>`.
63 63
64 64 IPython engine
65 65 ---------------
66 66
67 67 The IPython engine is a Python instance that takes Python commands over a
68 68 network connection. Eventually, the IPython engine will be a full IPython
69 69 interpreter, but for now, it is a regular Python interpreter. The engine
70 70 can also handle incoming and outgoing Python objects sent over a network
71 71 connection. When multiple engines are started, parallel and distributed
72 72 computing becomes possible. An important feature of an IPython engine is
73 73 that it blocks while user code is being executed. Read on for how the
74 74 IPython controller solves this problem to expose a clean asynchronous API
75 75 to the user.
76 76
77 77 IPython controller
78 78 ------------------
79 79
80 80 The IPython controller provides an interface for working with a set of
81 81 engines. At an general level, the controller is a process to which
82 82 IPython engines can connect. For each connected engine, the controller
83 83 manages a queue. All actions that can be performed on the engine go
84 84 through this queue. While the engines themselves block when user code is
85 85 run, the controller hides that from the user to provide a fully
86 86 asynchronous interface to a set of engines.
87 87
88 88 .. note::
89 89
90 90 Because the controller listens on a network port for engines to
91 91 connect to it, it must be started *before* any engines are started.
92 92
93 The controller also provides a single point of contact for users who wish
94 to utilize the engines connected to the controller. There are different
95 ways of working with a controller. In IPython these ways correspond to different interfaces that the controller is adapted to. Currently we have two default interfaces to the controller:
93 The controller also provides a single point of contact for users who wish to
94 utilize the engines connected to the controller. There are different ways of
95 working with a controller. In IPython these ways correspond to different
96 interfaces that the controller is adapted to. Currently we have two default
97 interfaces to the controller:
96 98
97 99 * The MultiEngine interface, which provides the simplest possible way of
98 100 working with engines interactively.
99 * The Task interface, which provides presents the engines as a load balanced
101 * The Task interface, which presents the engines as a load balanced
100 102 task farming system.
101 103
102 104 Advanced users can easily add new custom interfaces to enable other
103 105 styles of parallelism.
104 106
105 107 .. note::
106 108
107 109 A single controller and set of engines can be accessed
108 110 through multiple interfaces simultaneously. This opens the
109 111 door for lots of interesting things.
110 112
111 113 Controller clients
112 114 ------------------
113 115
114 116 For each controller interface, there is a corresponding client. These
115 117 clients allow users to interact with a set of engines through the
116 118 interface. Here are the two default clients:
117 119
118 120 * The :class:`MultiEngineClient` class.
119 121 * The :class:`TaskClient` class.
120 122
121 123 Security
122 124 --------
123 125
124 By default (as long as `pyOpenSSL` is installed) all network connections between the controller and engines and the controller and clients are secure. What does this mean? First of all, all of the connections will be encrypted using SSL. Second, the connections are authenticated. We handle authentication in a capability based security model [Capability]_. In this model, a "capability (known in some systems as a key) is a communicable, unforgeable token of authority". Put simply, a capability is like a key to your house. If you have the key to your house, you can get in. If not, you can't.
125
126 In our architecture, the controller is the only process that listens on network ports, and is thus responsible to creating these keys. In IPython, these keys are known as Foolscap URLs, or FURLs, because of the underlying network protocol we are using. As a user, you don't need to know anything about the details of these FURLs, other than that when the controller starts, it saves a set of FURLs to files named :file:`something.furl`. The default location of these files is the :file:`~./ipython/security` directory.
127
128 To connect and authenticate to the controller an engine or client simply needs to present an appropriate FURL (that was originally created by the controller) to the controller. Thus, the FURL files need to be copied to a location where the clients and engines can find them. Typically, this is the :file:`~./ipython/security` directory on the host where the client/engine is running (which could be a different host than the controller). Once the FURL files are copied over, everything should work fine.
126 By default (as long as `pyOpenSSL` is installed) all network connections
127 between the controller and engines and the controller and clients are secure.
128 What does this mean? First of all, all of the connections will be encrypted
129 using SSL. Second, the connections are authenticated. We handle authentication
130 in a capability based security model [Capability]_. In this model, a
131 "capability (known in some systems as a key) is a communicable, unforgeable
132 token of authority". Put simply, a capability is like a key to your house. If
133 you have the key to your house, you can get in. If not, you can't.
134
135 In our architecture, the controller is the only process that listens on
136 network ports, and is thus responsible to creating these keys. In IPython,
137 these keys are known as Foolscap URLs, or FURLs, because of the underlying
138 network protocol we are using. As a user, you don't need to know anything
139 about the details of these FURLs, other than that when the controller starts,
140 it saves a set of FURLs to files named :file:`something.furl`. The default
141 location of these files is the :file:`~./ipython/security` directory.
142
143 To connect and authenticate to the controller an engine or client simply needs
144 to present an appropriate FURL (that was originally created by the controller)
145 to the controller. Thus, the FURL files need to be copied to a location where
146 the clients and engines can find them. Typically, this is the
147 :file:`~./ipython/security` directory on the host where the client/engine is
148 running (which could be a different host than the controller). Once the FURL
149 files are copied over, everything should work fine.
129 150
130 151 Currently, there are three FURL files that the controller creates:
131 152
132 153 ipcontroller-engine.furl
133 154 This FURL file is the key that gives an engine the ability to connect
134 155 to a controller.
135 156
136 157 ipcontroller-tc.furl
137 158 This FURL file is the key that a :class:`TaskClient` must use to
138 159 connect to the task interface of a controller.
139 160
140 161 ipcontroller-mec.furl
141 162 This FURL file is the key that a :class:`MultiEngineClient` must use
142 163 to connect to the multiengine interface of a controller.
143 164
144 165 More details of how these FURL files are used are given below.
145 166
146 167 A detailed description of the security model and its implementation in IPython
147 168 can be found :ref:`here <parallelsecurity>`.
148 169
149 170 Getting Started
150 171 ===============
151 172
152 To use IPython for parallel computing, you need to start one instance of
153 the controller and one or more instances of the engine. Initially, it is best to simply start a controller and engines on a single host using the :command:`ipcluster` command. To start a controller and 4 engines on you localhost, just do::
173 To use IPython for parallel computing, you need to start one instance of the
174 controller and one or more instances of the engine. Initially, it is best to
175 simply start a controller and engines on a single host using the
176 :command:`ipcluster` command. To start a controller and 4 engines on your
177 localhost, just do::
154 178
155 179 $ ipcluster local -n 4
156 180
157 More details about starting the IPython controller and engines can be found :ref:`here <parallel_process>`
181 More details about starting the IPython controller and engines can be found
182 :ref:`here <parallel_process>`
158 183
159 184 Once you have started the IPython controller and one or more engines, you
160 185 are ready to use the engines to do something useful. To make sure
161 186 everything is working correctly, try the following commands:
162 187
163 188 .. sourcecode:: ipython
164 189
165 190 In [1]: from IPython.kernel import client
166 191
167 192 In [2]: mec = client.MultiEngineClient()
168 193
169 194 In [4]: mec.get_ids()
170 195 Out[4]: [0, 1, 2, 3]
171 196
172 197 In [5]: mec.execute('print "Hello World"')
173 198 Out[5]:
174 199 <Results List>
175 200 [0] In [1]: print "Hello World"
176 201 [0] Out[1]: Hello World
177 202
178 203 [1] In [1]: print "Hello World"
179 204 [1] Out[1]: Hello World
180 205
181 206 [2] In [1]: print "Hello World"
182 207 [2] Out[1]: Hello World
183 208
184 209 [3] In [1]: print "Hello World"
185 210 [3] Out[1]: Hello World
186 211
187 Remember, a client also needs to present a FURL file to the controller. How does this happen? When a multiengine client is created with no arguments, the client tries to find the corresponding FURL file in the local :file:`~./ipython/security` directory. If it finds it, you are set. If you have put the FURL file in a different location or it has a different name, create the client like this::
212 Remember, a client also needs to present a FURL file to the controller. How
213 does this happen? When a multiengine client is created with no arguments, the
214 client tries to find the corresponding FURL file in the local
215 :file:`~./ipython/security` directory. If it finds it, you are set. If you
216 have put the FURL file in a different location or it has a different name,
217 create the client like this::
188 218
189 219 mec = client.MultiEngineClient('/path/to/my/ipcontroller-mec.furl')
190 220
191 221 Same thing hold true of creating a task client::
192 222
193 223 tc = client.TaskClient('/path/to/my/ipcontroller-tc.furl')
194 224
195 You are now ready to learn more about the :ref:`MultiEngine <parallelmultiengine>` and :ref:`Task <paralleltask>` interfaces to the controller.
225 You are now ready to learn more about the :ref:`MultiEngine
226 <parallelmultiengine>` and :ref:`Task <paralleltask>` interfaces to the
227 controller.
196 228
197 229 .. note::
198 230
199 231 Don't forget that the engine, multiengine client and task client all have
200 232 *different* furl files. You must move *each* of these around to an
201 233 appropriate location so that the engines and clients can use them to
202 234 connect to the controller.
203 235
204 236 .. [Capability] Capability-based security, http://en.wikipedia.org/wiki/Capability-based_security
205 237
@@ -1,157 +1,176 b''
1 1 .. _parallelmpi:
2 2
3 3 =======================
4 4 Using MPI with IPython
5 5 =======================
6 6
7 Often, a parallel algorithm will require moving data between the engines. One way of accomplishing this is by doing a pull and then a push using the multiengine client. However, this will be slow as all the data has to go through the controller to the client and then back through the controller, to its final destination.
7 Often, a parallel algorithm will require moving data between the engines. One
8 way of accomplishing this is by doing a pull and then a push using the
9 multiengine client. However, this will be slow as all the data has to go
10 through the controller to the client and then back through the controller, to
11 its final destination.
8 12
9 A much better way of moving data between engines is to use a message passing library, such as the Message Passing Interface (MPI) [MPI]_. IPython's parallel computing architecture has been designed from the ground up to integrate with MPI. This document describes how to use MPI with IPython.
13 A much better way of moving data between engines is to use a message passing
14 library, such as the Message Passing Interface (MPI) [MPI]_. IPython's
15 parallel computing architecture has been designed from the ground up to
16 integrate with MPI. This document describes how to use MPI with IPython.
10 17
11 18 Additional installation requirements
12 19 ====================================
13 20
14 21 If you want to use MPI with IPython, you will need to install:
15 22
16 23 * A standard MPI implementation such as OpenMPI [OpenMPI]_ or MPICH.
17 24 * The mpi4py [mpi4py]_ package.
18 25
19 26 .. note::
20 27
21 28 The mpi4py package is not a strict requirement. However, you need to
22 29 have *some* way of calling MPI from Python. You also need some way of
23 30 making sure that :func:`MPI_Init` is called when the IPython engines start
24 31 up. There are a number of ways of doing this and a good number of
25 32 associated subtleties. We highly recommend just using mpi4py as it
26 33 takes care of most of these problems. If you want to do something
27 34 different, let us know and we can help you get started.
28 35
29 36 Starting the engines with MPI enabled
30 37 =====================================
31 38
32 39 To use code that calls MPI, there are typically two things that MPI requires.
33 40
34 41 1. The process that wants to call MPI must be started using
35 42 :command:`mpiexec` or a batch system (like PBS) that has MPI support.
36 43 2. Once the process starts, it must call :func:`MPI_Init`.
37 44
38 There are a couple of ways that you can start the IPython engines and get these things to happen.
45 There are a couple of ways that you can start the IPython engines and get
46 these things to happen.
39 47
40 48 Automatic starting using :command:`mpiexec` and :command:`ipcluster`
41 49 --------------------------------------------------------------------
42 50
43 The easiest approach is to use the `mpiexec` mode of :command:`ipcluster`, which will first start a controller and then a set of engines using :command:`mpiexec`::
51 The easiest approach is to use the `mpiexec` mode of :command:`ipcluster`,
52 which will first start a controller and then a set of engines using
53 :command:`mpiexec`::
44 54
45 55 $ ipcluster mpiexec -n 4
46 56
47 57 This approach is best as interrupting :command:`ipcluster` will automatically
48 58 stop and clean up the controller and engines.
49 59
50 60 Manual starting using :command:`mpiexec`
51 61 ----------------------------------------
52 62
53 If you want to start the IPython engines using the :command:`mpiexec`, just do::
63 If you want to start the IPython engines using the :command:`mpiexec`, just
64 do::
54 65
55 66 $ mpiexec -n 4 ipengine --mpi=mpi4py
56 67
57 68 This requires that you already have a controller running and that the FURL
58 69 files for the engines are in place. We also have built in support for
59 70 PyTrilinos [PyTrilinos]_, which can be used (assuming is installed) by
60 71 starting the engines with::
61 72
62 73 mpiexec -n 4 ipengine --mpi=pytrilinos
63 74
64 75 Automatic starting using PBS and :command:`ipcluster`
65 76 -----------------------------------------------------
66 77
67 The :command:`ipcluster` command also has built-in integration with PBS. For more information on this approach, see our documentation on :ref:`ipcluster <parallel_process>`.
78 The :command:`ipcluster` command also has built-in integration with PBS. For
79 more information on this approach, see our documentation on :ref:`ipcluster
80 <parallel_process>`.
68 81
69 82 Actually using MPI
70 83 ==================
71 84
72 Once the engines are running with MPI enabled, you are ready to go. You can now call any code that uses MPI in the IPython engines. And, all of this can be done interactively. Here we show a simple example that uses mpi4py [mpi4py]_.
85 Once the engines are running with MPI enabled, you are ready to go. You can
86 now call any code that uses MPI in the IPython engines. And, all of this can
87 be done interactively. Here we show a simple example that uses mpi4py
88 [mpi4py]_.
73 89
74 First, lets define a simply function that uses MPI to calculate the sum of a distributed array. Save the following text in a file called :file:`psum.py`:
90 First, lets define a simply function that uses MPI to calculate the sum of a
91 distributed array. Save the following text in a file called :file:`psum.py`:
75 92
76 93 .. sourcecode:: python
77 94
78 95 from mpi4py import MPI
79 96 import numpy as np
80 97
81 98 def psum(a):
82 99 s = np.sum(a)
83 100 return MPI.COMM_WORLD.Allreduce(s,MPI.SUM)
84 101
85 102 Now, start an IPython cluster in the same directory as :file:`psum.py`::
86 103
87 104 $ ipcluster mpiexec -n 4
88 105
89 Finally, connect to the cluster and use this function interactively. In this case, we create a random array on each engine and sum up all the random arrays using our :func:`psum` function:
106 Finally, connect to the cluster and use this function interactively. In this
107 case, we create a random array on each engine and sum up all the random arrays
108 using our :func:`psum` function:
90 109
91 110 .. sourcecode:: ipython
92 111
93 112 In [1]: from IPython.kernel import client
94 113
95 114 In [2]: mec = client.MultiEngineClient()
96 115
97 116 In [3]: mec.activate()
98 117
99 118 In [4]: px import numpy as np
100 119 Parallel execution on engines: all
101 120 Out[4]:
102 121 <Results List>
103 122 [0] In [13]: import numpy as np
104 123 [1] In [13]: import numpy as np
105 124 [2] In [13]: import numpy as np
106 125 [3] In [13]: import numpy as np
107 126
108 127 In [6]: px a = np.random.rand(100)
109 128 Parallel execution on engines: all
110 129 Out[6]:
111 130 <Results List>
112 131 [0] In [15]: a = np.random.rand(100)
113 132 [1] In [15]: a = np.random.rand(100)
114 133 [2] In [15]: a = np.random.rand(100)
115 134 [3] In [15]: a = np.random.rand(100)
116 135
117 136 In [7]: px from psum import psum
118 137 Parallel execution on engines: all
119 138 Out[7]:
120 139 <Results List>
121 140 [0] In [16]: from psum import psum
122 141 [1] In [16]: from psum import psum
123 142 [2] In [16]: from psum import psum
124 143 [3] In [16]: from psum import psum
125 144
126 145 In [8]: px s = psum(a)
127 146 Parallel execution on engines: all
128 147 Out[8]:
129 148 <Results List>
130 149 [0] In [17]: s = psum(a)
131 150 [1] In [17]: s = psum(a)
132 151 [2] In [17]: s = psum(a)
133 152 [3] In [17]: s = psum(a)
134 153
135 154 In [9]: px print s
136 155 Parallel execution on engines: all
137 156 Out[9]:
138 157 <Results List>
139 158 [0] In [18]: print s
140 159 [0] Out[18]: 187.451545803
141 160
142 161 [1] In [18]: print s
143 162 [1] Out[18]: 187.451545803
144 163
145 164 [2] In [18]: print s
146 165 [2] Out[18]: 187.451545803
147 166
148 167 [3] In [18]: print s
149 168 [3] Out[18]: 187.451545803
150 169
151 170 Any Python code that makes calls to MPI can be used in this manner, including
152 171 compiled C, C++ and Fortran libraries that have been exposed to Python.
153 172
154 173 .. [MPI] Message Passing Interface. http://www-unix.mcs.anl.gov/mpi/
155 174 .. [mpi4py] MPI for Python. mpi4py: http://mpi4py.scipy.org/
156 175 .. [OpenMPI] Open MPI. http://www.open-mpi.org/
157 176 .. [PyTrilinos] PyTrilinos. http://trilinos.sandia.gov/packages/pytrilinos/
@@ -1,828 +1,835 b''
1 1 .. _parallelmultiengine:
2 2
3 3 ===============================
4 4 IPython's multiengine interface
5 5 ===============================
6 6
7 7 The multiengine interface represents one possible way of working with a set of
8 8 IPython engines. The basic idea behind the multiengine interface is that the
9 9 capabilities of each engine are directly and explicitly exposed to the user.
10 10 Thus, in the multiengine interface, each engine is given an id that is used to
11 11 identify the engine and give it work to do. This interface is very intuitive
12 12 and is designed with interactive usage in mind, and is thus the best place for
13 13 new users of IPython to begin.
14 14
15 15 Starting the IPython controller and engines
16 16 ===========================================
17 17
18 18 To follow along with this tutorial, you will need to start the IPython
19 19 controller and four IPython engines. The simplest way of doing this is to use
20 20 the :command:`ipcluster` command::
21 21
22 22 $ ipcluster local -n 4
23 23
24 24 For more detailed information about starting the controller and engines, see
25 25 our :ref:`introduction <ip1par>` to using IPython for parallel computing.
26 26
27 27 Creating a ``MultiEngineClient`` instance
28 28 =========================================
29 29
30 30 The first step is to import the IPython :mod:`IPython.kernel.client` module
31 31 and then create a :class:`MultiEngineClient` instance:
32 32
33 33 .. sourcecode:: ipython
34 34
35 35 In [1]: from IPython.kernel import client
36 36
37 37 In [2]: mec = client.MultiEngineClient()
38 38
39 39 This form assumes that the :file:`ipcontroller-mec.furl` is in the
40 40 :file:`~./ipython/security` directory on the client's host. If not, the
41 41 location of the FURL file must be given as an argument to the
42 42 constructor:
43 43
44 44 .. sourcecode:: ipython
45 45
46 46 In [2]: mec = client.MultiEngineClient('/path/to/my/ipcontroller-mec.furl')
47 47
48 48 To make sure there are engines connected to the controller, use can get a list
49 49 of engine ids:
50 50
51 51 .. sourcecode:: ipython
52 52
53 53 In [3]: mec.get_ids()
54 54 Out[3]: [0, 1, 2, 3]
55 55
56 56 Here we see that there are four engines ready to do work for us.
57 57
58 58 Quick and easy parallelism
59 59 ==========================
60 60
61 In many cases, you simply want to apply a Python function to a sequence of objects, but *in parallel*. The multiengine interface provides two simple ways of accomplishing this: a parallel version of :func:`map` and ``@parallel`` function decorator.
61 In many cases, you simply want to apply a Python function to a sequence of
62 objects, but *in parallel*. The multiengine interface provides two simple ways
63 of accomplishing this: a parallel version of :func:`map` and ``@parallel``
64 function decorator.
62 65
63 66 Parallel map
64 67 ------------
65 68
66 69 Python's builtin :func:`map` functions allows a function to be applied to a
67 70 sequence element-by-element. This type of code is typically trivial to
68 71 parallelize. In fact, the multiengine interface in IPython already has a
69 72 parallel version of :meth:`map` that works just like its serial counterpart:
70 73
71 74 .. sourcecode:: ipython
72 75
73 76 In [63]: serial_result = map(lambda x:x**10, range(32))
74 77
75 78 In [64]: parallel_result = mec.map(lambda x:x**10, range(32))
76 79
77 80 In [65]: serial_result==parallel_result
78 81 Out[65]: True
79 82
80 83 .. note::
81 84
82 85 The multiengine interface version of :meth:`map` does not do any load
83 86 balancing. For a load balanced version, see the task interface.
84 87
85 88 .. seealso::
86 89
87 90 The :meth:`map` method has a number of options that can be controlled by
88 91 the :meth:`mapper` method. See its docstring for more information.
89 92
90 93 Parallel function decorator
91 94 ---------------------------
92 95
93 Parallel functions are just like normal function, but they can be called on sequences and *in parallel*. The multiengine interface provides a decorator that turns any Python function into a parallel function:
96 Parallel functions are just like normal function, but they can be called on
97 sequences and *in parallel*. The multiengine interface provides a decorator
98 that turns any Python function into a parallel function:
94 99
95 100 .. sourcecode:: ipython
96 101
97 102 In [10]: @mec.parallel()
98 103 ....: def f(x):
99 104 ....: return 10.0*x**4
100 105 ....:
101 106
102 107 In [11]: f(range(32)) # this is done in parallel
103 108 Out[11]:
104 109 [0.0,10.0,160.0,...]
105 110
106 111 See the docstring for the :meth:`parallel` decorator for options.
107 112
108 113 Running Python commands
109 114 =======================
110 115
111 116 The most basic type of operation that can be performed on the engines is to
112 117 execute Python code. Executing Python code can be done in blocking or
113 118 non-blocking mode (blocking is default) using the :meth:`execute` method.
114 119
115 120 Blocking execution
116 121 ------------------
117 122
118 123 In blocking mode, the :class:`MultiEngineClient` object (called ``mec`` in
119 124 these examples) submits the command to the controller, which places the
120 125 command in the engines' queues for execution. The :meth:`execute` call then
121 126 blocks until the engines are done executing the command:
122 127
123 128 .. sourcecode:: ipython
124 129
125 130 # The default is to run on all engines
126 131 In [4]: mec.execute('a=5')
127 132 Out[4]:
128 133 <Results List>
129 134 [0] In [1]: a=5
130 135 [1] In [1]: a=5
131 136 [2] In [1]: a=5
132 137 [3] In [1]: a=5
133 138
134 139 In [5]: mec.execute('b=10')
135 140 Out[5]:
136 141 <Results List>
137 142 [0] In [2]: b=10
138 143 [1] In [2]: b=10
139 144 [2] In [2]: b=10
140 145 [3] In [2]: b=10
141 146
142 147 Python commands can be executed on specific engines by calling execute using
143 148 the ``targets`` keyword argument:
144 149
145 150 .. sourcecode:: ipython
146 151
147 152 In [6]: mec.execute('c=a+b',targets=[0,2])
148 153 Out[6]:
149 154 <Results List>
150 155 [0] In [3]: c=a+b
151 156 [2] In [3]: c=a+b
152 157
153 158
154 159 In [7]: mec.execute('c=a-b',targets=[1,3])
155 160 Out[7]:
156 161 <Results List>
157 162 [1] In [3]: c=a-b
158 163 [3] In [3]: c=a-b
159 164
160 165
161 166 In [8]: mec.execute('print c')
162 167 Out[8]:
163 168 <Results List>
164 169 [0] In [4]: print c
165 170 [0] Out[4]: 15
166 171
167 172 [1] In [4]: print c
168 173 [1] Out[4]: -5
169 174
170 175 [2] In [4]: print c
171 176 [2] Out[4]: 15
172 177
173 178 [3] In [4]: print c
174 179 [3] Out[4]: -5
175 180
176 181 This example also shows one of the most important things about the IPython
177 182 engines: they have a persistent user namespaces. The :meth:`execute` method
178 183 returns a Python ``dict`` that contains useful information:
179 184
180 185 .. sourcecode:: ipython
181 186
182 187 In [9]: result_dict = mec.execute('d=10; print d')
183 188
184 189 In [10]: for r in result_dict:
185 190 ....: print r
186 191 ....:
187 192 ....:
188 193 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 0, 'stdout': '10\n'}
189 194 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 1, 'stdout': '10\n'}
190 195 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 2, 'stdout': '10\n'}
191 196 {'input': {'translated': 'd=10; print d', 'raw': 'd=10; print d'}, 'number': 5, 'id': 3, 'stdout': '10\n'}
192 197
193 198 Non-blocking execution
194 199 ----------------------
195 200
196 201 In non-blocking mode, :meth:`execute` submits the command to be executed and
197 202 then returns a :class:`PendingResult` object immediately. The
198 203 :class:`PendingResult` object gives you a way of getting a result at a later
199 204 time through its :meth:`get_result` method or :attr:`r` attribute. This allows
200 205 you to quickly submit long running commands without blocking your local
201 206 Python/IPython session:
202 207
203 208 .. sourcecode:: ipython
204 209
205 210 # In blocking mode
206 211 In [6]: mec.execute('import time')
207 212 Out[6]:
208 213 <Results List>
209 214 [0] In [1]: import time
210 215 [1] In [1]: import time
211 216 [2] In [1]: import time
212 217 [3] In [1]: import time
213 218
214 219 # In non-blocking mode
215 220 In [7]: pr = mec.execute('time.sleep(10)',block=False)
216 221
217 222 # Now block for the result
218 223 In [8]: pr.get_result()
219 224 Out[8]:
220 225 <Results List>
221 226 [0] In [2]: time.sleep(10)
222 227 [1] In [2]: time.sleep(10)
223 228 [2] In [2]: time.sleep(10)
224 229 [3] In [2]: time.sleep(10)
225 230
226 231 # Again in non-blocking mode
227 232 In [9]: pr = mec.execute('time.sleep(10)',block=False)
228 233
229 234 # Poll to see if the result is ready
230 235 In [10]: pr.get_result(block=False)
231 236
232 237 # A shorthand for get_result(block=True)
233 238 In [11]: pr.r
234 239 Out[11]:
235 240 <Results List>
236 241 [0] In [3]: time.sleep(10)
237 242 [1] In [3]: time.sleep(10)
238 243 [2] In [3]: time.sleep(10)
239 244 [3] In [3]: time.sleep(10)
240 245
241 246 Often, it is desirable to wait until a set of :class:`PendingResult` objects
242 247 are done. For this, there is a the method :meth:`barrier`. This method takes a
243 248 tuple of :class:`PendingResult` objects and blocks until all of the associated
244 249 results are ready:
245 250
246 251 .. sourcecode:: ipython
247 252
248 253 In [72]: mec.block=False
249 254
250 255 # A trivial list of PendingResults objects
251 256 In [73]: pr_list = [mec.execute('time.sleep(3)') for i in range(10)]
252 257
253 258 # Wait until all of them are done
254 259 In [74]: mec.barrier(pr_list)
255 260
256 261 # Then, their results are ready using get_result or the r attribute
257 262 In [75]: pr_list[0].r
258 263 Out[75]:
259 264 <Results List>
260 265 [0] In [20]: time.sleep(3)
261 266 [1] In [19]: time.sleep(3)
262 267 [2] In [20]: time.sleep(3)
263 268 [3] In [19]: time.sleep(3)
264 269
265 270
266 271 The ``block`` and ``targets`` keyword arguments and attributes
267 272 --------------------------------------------------------------
268 273
269 274 Most methods in the multiengine interface (like :meth:`execute`) accept
270 275 ``block`` and ``targets`` as keyword arguments. As we have seen above, these
271 276 keyword arguments control the blocking mode and which engines the command is
272 277 applied to. The :class:`MultiEngineClient` class also has :attr:`block` and
273 278 :attr:`targets` attributes that control the default behavior when the keyword
274 279 arguments are not provided. Thus the following logic is used for :attr:`block`
275 280 and :attr:`targets`:
276 281
277 282 * If no keyword argument is provided, the instance attributes are used.
278 283 * Keyword argument, if provided override the instance attributes.
279 284
280 285 The following examples demonstrate how to use the instance attributes:
281 286
282 287 .. sourcecode:: ipython
283 288
284 289 In [16]: mec.targets = [0,2]
285 290
286 291 In [17]: mec.block = False
287 292
288 293 In [18]: pr = mec.execute('a=5')
289 294
290 295 In [19]: pr.r
291 296 Out[19]:
292 297 <Results List>
293 298 [0] In [6]: a=5
294 299 [2] In [6]: a=5
295 300
296 301 # Note targets='all' means all engines
297 302 In [20]: mec.targets = 'all'
298 303
299 304 In [21]: mec.block = True
300 305
301 306 In [22]: mec.execute('b=10; print b')
302 307 Out[22]:
303 308 <Results List>
304 309 [0] In [7]: b=10; print b
305 310 [0] Out[7]: 10
306 311
307 312 [1] In [6]: b=10; print b
308 313 [1] Out[6]: 10
309 314
310 315 [2] In [7]: b=10; print b
311 316 [2] Out[7]: 10
312 317
313 318 [3] In [6]: b=10; print b
314 319 [3] Out[6]: 10
315 320
316 321 The :attr:`block` and :attr:`targets` instance attributes also determine the
317 322 behavior of the parallel magic commands.
318 323
319 324
320 325 Parallel magic commands
321 326 -----------------------
322 327
323 328 We provide a few IPython magic commands (``%px``, ``%autopx`` and ``%result``)
324 329 that make it more pleasant to execute Python commands on the engines
325 330 interactively. These are simply shortcuts to :meth:`execute` and
326 331 :meth:`get_result`. The ``%px`` magic executes a single Python command on the
327 332 engines specified by the :attr:`targets` attribute of the
328 333 :class:`MultiEngineClient` instance (by default this is ``'all'``):
329 334
330 335 .. sourcecode:: ipython
331 336
332 337 # Make this MultiEngineClient active for parallel magic commands
333 338 In [23]: mec.activate()
334 339
335 340 In [24]: mec.block=True
336 341
337 342 In [25]: import numpy
338 343
339 344 In [26]: %px import numpy
340 345 Executing command on Controller
341 346 Out[26]:
342 347 <Results List>
343 348 [0] In [8]: import numpy
344 349 [1] In [7]: import numpy
345 350 [2] In [8]: import numpy
346 351 [3] In [7]: import numpy
347 352
348 353
349 354 In [27]: %px a = numpy.random.rand(2,2)
350 355 Executing command on Controller
351 356 Out[27]:
352 357 <Results List>
353 358 [0] In [9]: a = numpy.random.rand(2,2)
354 359 [1] In [8]: a = numpy.random.rand(2,2)
355 360 [2] In [9]: a = numpy.random.rand(2,2)
356 361 [3] In [8]: a = numpy.random.rand(2,2)
357 362
358 363
359 364 In [28]: %px print numpy.linalg.eigvals(a)
360 365 Executing command on Controller
361 366 Out[28]:
362 367 <Results List>
363 368 [0] In [10]: print numpy.linalg.eigvals(a)
364 369 [0] Out[10]: [ 1.28167017 0.14197338]
365 370
366 371 [1] In [9]: print numpy.linalg.eigvals(a)
367 372 [1] Out[9]: [-0.14093616 1.27877273]
368 373
369 374 [2] In [10]: print numpy.linalg.eigvals(a)
370 375 [2] Out[10]: [-0.37023573 1.06779409]
371 376
372 377 [3] In [9]: print numpy.linalg.eigvals(a)
373 378 [3] Out[9]: [ 0.83664764 -0.25602658]
374 379
375 380 The ``%result`` magic gets and prints the stdin/stdout/stderr of the last
376 381 command executed on each engine. It is simply a shortcut to the
377 382 :meth:`get_result` method:
378 383
379 384 .. sourcecode:: ipython
380 385
381 386 In [29]: %result
382 387 Out[29]:
383 388 <Results List>
384 389 [0] In [10]: print numpy.linalg.eigvals(a)
385 390 [0] Out[10]: [ 1.28167017 0.14197338]
386 391
387 392 [1] In [9]: print numpy.linalg.eigvals(a)
388 393 [1] Out[9]: [-0.14093616 1.27877273]
389 394
390 395 [2] In [10]: print numpy.linalg.eigvals(a)
391 396 [2] Out[10]: [-0.37023573 1.06779409]
392 397
393 398 [3] In [9]: print numpy.linalg.eigvals(a)
394 399 [3] Out[9]: [ 0.83664764 -0.25602658]
395 400
396 401 The ``%autopx`` magic switches to a mode where everything you type is executed
397 402 on the engines given by the :attr:`targets` attribute:
398 403
399 404 .. sourcecode:: ipython
400 405
401 406 In [30]: mec.block=False
402 407
403 408 In [31]: %autopx
404 409 Auto Parallel Enabled
405 410 Type %autopx to disable
406 411
407 412 In [32]: max_evals = []
408 413 <IPython.kernel.multiengineclient.PendingResult object at 0x17b8a70>
409 414
410 415 In [33]: for i in range(100):
411 416 ....: a = numpy.random.rand(10,10)
412 417 ....: a = a+a.transpose()
413 418 ....: evals = numpy.linalg.eigvals(a)
414 419 ....: max_evals.append(evals[0].real)
415 420 ....:
416 421 ....:
417 422 <IPython.kernel.multiengineclient.PendingResult object at 0x17af8f0>
418 423
419 424 In [34]: %autopx
420 425 Auto Parallel Disabled
421 426
422 427 In [35]: mec.block=True
423 428
424 429 In [36]: px print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
425 430 Executing command on Controller
426 431 Out[36]:
427 432 <Results List>
428 433 [0] In [13]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
429 434 [0] Out[13]: Average max eigenvalue is: 10.1387247332
430 435
431 436 [1] In [12]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
432 437 [1] Out[12]: Average max eigenvalue is: 10.2076902286
433 438
434 439 [2] In [13]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
435 440 [2] Out[13]: Average max eigenvalue is: 10.1891484655
436 441
437 442 [3] In [12]: print "Average max eigenvalue is: ", sum(max_evals)/len(max_evals)
438 443 [3] Out[12]: Average max eigenvalue is: 10.1158837784
439 444
440 445
441 446 Moving Python objects around
442 447 ============================
443 448
444 449 In addition to executing code on engines, you can transfer Python objects to
445 450 and from your IPython session and the engines. In IPython, these operations
446 451 are called :meth:`push` (sending an object to the engines) and :meth:`pull`
447 452 (getting an object from the engines).
448 453
449 454 Basic push and pull
450 455 -------------------
451 456
452 457 Here are some examples of how you use :meth:`push` and :meth:`pull`:
453 458
454 459 .. sourcecode:: ipython
455 460
456 461 In [38]: mec.push(dict(a=1.03234,b=3453))
457 462 Out[38]: [None, None, None, None]
458 463
459 464 In [39]: mec.pull('a')
460 465 Out[39]: [1.03234, 1.03234, 1.03234, 1.03234]
461 466
462 467 In [40]: mec.pull('b',targets=0)
463 468 Out[40]: [3453]
464 469
465 470 In [41]: mec.pull(('a','b'))
466 471 Out[41]: [[1.03234, 3453], [1.03234, 3453], [1.03234, 3453], [1.03234, 3453]]
467 472
468 473 In [42]: mec.zip_pull(('a','b'))
469 474 Out[42]: [(1.03234, 1.03234, 1.03234, 1.03234), (3453, 3453, 3453, 3453)]
470 475
471 476 In [43]: mec.push(dict(c='speed'))
472 477 Out[43]: [None, None, None, None]
473 478
474 479 In [44]: %px print c
475 480 Executing command on Controller
476 481 Out[44]:
477 482 <Results List>
478 483 [0] In [14]: print c
479 484 [0] Out[14]: speed
480 485
481 486 [1] In [13]: print c
482 487 [1] Out[13]: speed
483 488
484 489 [2] In [14]: print c
485 490 [2] Out[14]: speed
486 491
487 492 [3] In [13]: print c
488 493 [3] Out[13]: speed
489 494
490 495 In non-blocking mode :meth:`push` and :meth:`pull` also return
491 496 :class:`PendingResult` objects:
492 497
493 498 .. sourcecode:: ipython
494 499
495 500 In [47]: mec.block=False
496 501
497 502 In [48]: pr = mec.pull('a')
498 503
499 504 In [49]: pr.r
500 505 Out[49]: [1.03234, 1.03234, 1.03234, 1.03234]
501 506
502 507
503 508 Push and pull for functions
504 509 ---------------------------
505 510
506 511 Functions can also be pushed and pulled using :meth:`push_function` and
507 512 :meth:`pull_function`:
508 513
509 514 .. sourcecode:: ipython
510 515
511 516 In [52]: mec.block=True
512 517
513 518 In [53]: def f(x):
514 519 ....: return 2.0*x**4
515 520 ....:
516 521
517 522 In [54]: mec.push_function(dict(f=f))
518 523 Out[54]: [None, None, None, None]
519 524
520 525 In [55]: mec.execute('y = f(4.0)')
521 526 Out[55]:
522 527 <Results List>
523 528 [0] In [15]: y = f(4.0)
524 529 [1] In [14]: y = f(4.0)
525 530 [2] In [15]: y = f(4.0)
526 531 [3] In [14]: y = f(4.0)
527 532
528 533
529 534 In [56]: px print y
530 535 Executing command on Controller
531 536 Out[56]:
532 537 <Results List>
533 538 [0] In [16]: print y
534 539 [0] Out[16]: 512.0
535 540
536 541 [1] In [15]: print y
537 542 [1] Out[15]: 512.0
538 543
539 544 [2] In [16]: print y
540 545 [2] Out[16]: 512.0
541 546
542 547 [3] In [15]: print y
543 548 [3] Out[15]: 512.0
544 549
545 550
546 551 Dictionary interface
547 552 --------------------
548 553
549 554 As a shorthand to :meth:`push` and :meth:`pull`, the
550 555 :class:`MultiEngineClient` class implements some of the Python dictionary
551 556 interface. This make the remote namespaces of the engines appear as a local
552 557 dictionary. Underneath, this uses :meth:`push` and :meth:`pull`:
553 558
554 559 .. sourcecode:: ipython
555 560
556 561 In [50]: mec.block=True
557 562
558 563 In [51]: mec['a']=['foo','bar']
559 564
560 565 In [52]: mec['a']
561 566 Out[52]: [['foo', 'bar'], ['foo', 'bar'], ['foo', 'bar'], ['foo', 'bar']]
562 567
563 568 Scatter and gather
564 569 ------------------
565 570
566 571 Sometimes it is useful to partition a sequence and push the partitions to
567 572 different engines. In MPI language, this is know as scatter/gather and we
568 573 follow that terminology. However, it is important to remember that in
569 574 IPython's :class:`MultiEngineClient` class, :meth:`scatter` is from the
570 575 interactive IPython session to the engines and :meth:`gather` is from the
571 576 engines back to the interactive IPython session. For scatter/gather operations
572 577 between engines, MPI should be used:
573 578
574 579 .. sourcecode:: ipython
575 580
576 581 In [58]: mec.scatter('a',range(16))
577 582 Out[58]: [None, None, None, None]
578 583
579 584 In [59]: px print a
580 585 Executing command on Controller
581 586 Out[59]:
582 587 <Results List>
583 588 [0] In [17]: print a
584 589 [0] Out[17]: [0, 1, 2, 3]
585 590
586 591 [1] In [16]: print a
587 592 [1] Out[16]: [4, 5, 6, 7]
588 593
589 594 [2] In [17]: print a
590 595 [2] Out[17]: [8, 9, 10, 11]
591 596
592 597 [3] In [16]: print a
593 598 [3] Out[16]: [12, 13, 14, 15]
594 599
595 600
596 601 In [60]: mec.gather('a')
597 602 Out[60]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
598 603
599 604 Other things to look at
600 605 =======================
601 606
602 607 How to do parallel list comprehensions
603 608 --------------------------------------
604 609
605 610 In many cases list comprehensions are nicer than using the map function. While
606 611 we don't have fully parallel list comprehensions, it is simple to get the
607 612 basic effect using :meth:`scatter` and :meth:`gather`:
608 613
609 614 .. sourcecode:: ipython
610 615
611 616 In [66]: mec.scatter('x',range(64))
612 617 Out[66]: [None, None, None, None]
613 618
614 619 In [67]: px y = [i**10 for i in x]
615 620 Executing command on Controller
616 621 Out[67]:
617 622 <Results List>
618 623 [0] In [19]: y = [i**10 for i in x]
619 624 [1] In [18]: y = [i**10 for i in x]
620 625 [2] In [19]: y = [i**10 for i in x]
621 626 [3] In [18]: y = [i**10 for i in x]
622 627
623 628
624 629 In [68]: y = mec.gather('y')
625 630
626 631 In [69]: print y
627 632 [0, 1, 1024, 59049, 1048576, 9765625, 60466176, 282475249, 1073741824,...]
628 633
629 634 Parallel exceptions
630 635 -------------------
631 636
632 637 In the multiengine interface, parallel commands can raise Python exceptions,
633 638 just like serial commands. But, it is a little subtle, because a single
634 639 parallel command can actually raise multiple exceptions (one for each engine
635 640 the command was run on). To express this idea, the MultiEngine interface has a
636 641 :exc:`CompositeError` exception class that will be raised in most cases. The
637 642 :exc:`CompositeError` class is a special type of exception that wraps one or
638 643 more other types of exceptions. Here is how it works:
639 644
640 645 .. sourcecode:: ipython
641 646
642 647 In [76]: mec.block=True
643 648
644 649 In [77]: mec.execute('1/0')
645 650 ---------------------------------------------------------------------------
646 651 CompositeError Traceback (most recent call last)
647 652
648 653 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
649 654
650 655 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in execute(self, lines, targets, block)
651 656 432 targets, block = self._findTargetsAndBlock(targets, block)
652 657 433 result = blockingCallFromThread(self.smultiengine.execute, lines,
653 658 --> 434 targets=targets, block=block)
654 659 435 if block:
655 660 436 result = ResultList(result)
656 661
657 662 /ipython1-client-r3021/ipython1/kernel/twistedutil.pyc in blockingCallFromThread(f, *a, **kw)
658 663 72 result.raiseException()
659 664 73 except Exception, e:
660 665 ---> 74 raise e
661 666 75 return result
662 667 76
663 668
664 669 CompositeError: one or more exceptions from call to method: execute
665 670 [0:execute]: ZeroDivisionError: integer division or modulo by zero
666 671 [1:execute]: ZeroDivisionError: integer division or modulo by zero
667 672 [2:execute]: ZeroDivisionError: integer division or modulo by zero
668 673 [3:execute]: ZeroDivisionError: integer division or modulo by zero
669 674
670 Notice how the error message printed when :exc:`CompositeError` is raised has information about the individual exceptions that were raised on each engine. If you want, you can even raise one of these original exceptions:
675 Notice how the error message printed when :exc:`CompositeError` is raised has
676 information about the individual exceptions that were raised on each engine.
677 If you want, you can even raise one of these original exceptions:
671 678
672 679 .. sourcecode:: ipython
673 680
674 681 In [80]: try:
675 682 ....: mec.execute('1/0')
676 683 ....: except client.CompositeError, e:
677 684 ....: e.raise_exception()
678 685 ....:
679 686 ....:
680 687 ---------------------------------------------------------------------------
681 688 ZeroDivisionError Traceback (most recent call last)
682 689
683 690 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
684 691
685 692 /ipython1-client-r3021/ipython1/kernel/error.pyc in raise_exception(self, excid)
686 693 156 raise IndexError("an exception with index %i does not exist"%excid)
687 694 157 else:
688 695 --> 158 raise et, ev, etb
689 696 159
690 697 160 def collect_exceptions(rlist, method):
691 698
692 699 ZeroDivisionError: integer division or modulo by zero
693 700
694 701 If you are working in IPython, you can simple type ``%debug`` after one of
695 702 these :exc:`CompositeError` exceptions is raised, and inspect the exception
696 703 instance:
697 704
698 705 .. sourcecode:: ipython
699 706
700 707 In [81]: mec.execute('1/0')
701 708 ---------------------------------------------------------------------------
702 709 CompositeError Traceback (most recent call last)
703 710
704 711 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
705 712
706 713 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in execute(self, lines, targets, block)
707 714 432 targets, block = self._findTargetsAndBlock(targets, block)
708 715 433 result = blockingCallFromThread(self.smultiengine.execute, lines,
709 716 --> 434 targets=targets, block=block)
710 717 435 if block:
711 718 436 result = ResultList(result)
712 719
713 720 /ipython1-client-r3021/ipython1/kernel/twistedutil.pyc in blockingCallFromThread(f, *a, **kw)
714 721 72 result.raiseException()
715 722 73 except Exception, e:
716 723 ---> 74 raise e
717 724 75 return result
718 725 76
719 726
720 727 CompositeError: one or more exceptions from call to method: execute
721 728 [0:execute]: ZeroDivisionError: integer division or modulo by zero
722 729 [1:execute]: ZeroDivisionError: integer division or modulo by zero
723 730 [2:execute]: ZeroDivisionError: integer division or modulo by zero
724 731 [3:execute]: ZeroDivisionError: integer division or modulo by zero
725 732
726 733 In [82]: %debug
727 734 >
728 735
729 736 /ipython1-client-r3021/ipython1/kernel/twistedutil.py(74)blockingCallFromThread()
730 737 73 except Exception, e:
731 738 ---> 74 raise e
732 739 75 return result
733 740
734 741 # With the debugger running, e is the exceptions instance. We can tab complete
735 742 # on it and see the extra methods that are available.
736 743 ipdb> e.
737 744 e.__class__ e.__getitem__ e.__new__ e.__setstate__ e.args
738 745 e.__delattr__ e.__getslice__ e.__reduce__ e.__str__ e.elist
739 746 e.__dict__ e.__hash__ e.__reduce_ex__ e.__weakref__ e.message
740 747 e.__doc__ e.__init__ e.__repr__ e._get_engine_str e.print_tracebacks
741 748 e.__getattribute__ e.__module__ e.__setattr__ e._get_traceback e.raise_exception
742 749 ipdb> e.print_tracebacks()
743 750 [0:execute]:
744 751 ---------------------------------------------------------------------------
745 752 ZeroDivisionError Traceback (most recent call last)
746 753
747 754 /ipython1-client-r3021/docs/examples/<string> in <module>()
748 755
749 756 ZeroDivisionError: integer division or modulo by zero
750 757
751 758 [1:execute]:
752 759 ---------------------------------------------------------------------------
753 760 ZeroDivisionError Traceback (most recent call last)
754 761
755 762 /ipython1-client-r3021/docs/examples/<string> in <module>()
756 763
757 764 ZeroDivisionError: integer division or modulo by zero
758 765
759 766 [2:execute]:
760 767 ---------------------------------------------------------------------------
761 768 ZeroDivisionError Traceback (most recent call last)
762 769
763 770 /ipython1-client-r3021/docs/examples/<string> in <module>()
764 771
765 772 ZeroDivisionError: integer division or modulo by zero
766 773
767 774 [3:execute]:
768 775 ---------------------------------------------------------------------------
769 776 ZeroDivisionError Traceback (most recent call last)
770 777
771 778 /ipython1-client-r3021/docs/examples/<string> in <module>()
772 779
773 780 ZeroDivisionError: integer division or modulo by zero
774 781
775 782 .. note::
776 783
777 784 The above example appears to be broken right now because of a change in
778 785 how we are using Twisted.
779 786
780 787 All of this same error handling magic even works in non-blocking mode:
781 788
782 789 .. sourcecode:: ipython
783 790
784 791 In [83]: mec.block=False
785 792
786 793 In [84]: pr = mec.execute('1/0')
787 794
788 795 In [85]: pr.r
789 796 ---------------------------------------------------------------------------
790 797 CompositeError Traceback (most recent call last)
791 798
792 799 /ipython1-client-r3021/docs/examples/<ipython console> in <module>()
793 800
794 801 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in _get_r(self)
795 802 170
796 803 171 def _get_r(self):
797 804 --> 172 return self.get_result(block=True)
798 805 173
799 806 174 r = property(_get_r)
800 807
801 808 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in get_result(self, default, block)
802 809 131 return self.result
803 810 132 try:
804 811 --> 133 result = self.client.get_pending_deferred(self.result_id, block)
805 812 134 except error.ResultNotCompleted:
806 813 135 return default
807 814
808 815 /ipython1-client-r3021/ipython1/kernel/multiengineclient.pyc in get_pending_deferred(self, deferredID, block)
809 816 385
810 817 386 def get_pending_deferred(self, deferredID, block):
811 818 --> 387 return blockingCallFromThread(self.smultiengine.get_pending_deferred, deferredID, block)
812 819 388
813 820 389 def barrier(self, pendingResults):
814 821
815 822 /ipython1-client-r3021/ipython1/kernel/twistedutil.pyc in blockingCallFromThread(f, *a, **kw)
816 823 72 result.raiseException()
817 824 73 except Exception, e:
818 825 ---> 74 raise e
819 826 75 return result
820 827 76
821 828
822 829 CompositeError: one or more exceptions from call to method: execute
823 830 [0:execute]: ZeroDivisionError: integer division or modulo by zero
824 831 [1:execute]: ZeroDivisionError: integer division or modulo by zero
825 832 [2:execute]: ZeroDivisionError: integer division or modulo by zero
826 833 [3:execute]: ZeroDivisionError: integer division or modulo by zero
827 834
828 835
@@ -1,351 +1,387 b''
1 1 .. _parallel_process:
2 2
3 3 ===========================================
4 4 Starting the IPython controller and engines
5 5 ===========================================
6 6
7 7 To use IPython for parallel computing, you need to start one instance of
8 8 the controller and one or more instances of the engine. The controller
9 9 and each engine can run on different machines or on the same machine.
10 10 Because of this, there are many different possibilities.
11 11
12 12 Broadly speaking, there are two ways of going about starting a controller and engines:
13 13
14 14 * In an automated manner using the :command:`ipcluster` command.
15 15 * In a more manual way using the :command:`ipcontroller` and
16 16 :command:`ipengine` commands.
17 17
18 This document describes both of these methods. We recommend that new users start with the :command:`ipcluster` command as it simplifies many common usage cases.
18 This document describes both of these methods. We recommend that new users
19 start with the :command:`ipcluster` command as it simplifies many common usage
20 cases.
19 21
20 22 General considerations
21 23 ======================
22 24
23 Before delving into the details about how you can start a controller and engines using the various methods, we outline some of the general issues that come up when starting the controller and engines. These things come up no matter which method you use to start your IPython cluster.
25 Before delving into the details about how you can start a controller and
26 engines using the various methods, we outline some of the general issues that
27 come up when starting the controller and engines. These things come up no
28 matter which method you use to start your IPython cluster.
24 29
25 Let's say that you want to start the controller on ``host0`` and engines on hosts ``host1``-``hostn``. The following steps are then required:
30 Let's say that you want to start the controller on ``host0`` and engines on
31 hosts ``host1``-``hostn``. The following steps are then required:
26 32
27 33 1. Start the controller on ``host0`` by running :command:`ipcontroller` on
28 34 ``host0``.
29 35 2. Move the FURL file (:file:`ipcontroller-engine.furl`) created by the
30 36 controller from ``host0`` to hosts ``host1``-``hostn``.
31 37 3. Start the engines on hosts ``host1``-``hostn`` by running
32 38 :command:`ipengine`. This command has to be told where the FURL file
33 39 (:file:`ipcontroller-engine.furl`) is located.
34 40
35 41 At this point, the controller and engines will be connected. By default, the
36 42 FURL files created by the controller are put into the
37 43 :file:`~/.ipython/security` directory. If the engines share a filesystem with
38 44 the controller, step 2 can be skipped as the engines will automatically look
39 45 at that location.
40 46
41 47 The final step required required to actually use the running controller from a
42 48 client is to move the FURL files :file:`ipcontroller-mec.furl` and
43 49 :file:`ipcontroller-tc.furl` from ``host0`` to the host where the clients will
44 be run. If these file are put into the :file:`~/.ipython/security` directory of the client's host, they will be found automatically. Otherwise, the full path to them has to be passed to the client's constructor.
50 be run. If these file are put into the :file:`~/.ipython/security` directory
51 of the client's host, they will be found automatically. Otherwise, the full
52 path to them has to be passed to the client's constructor.
45 53
46 54 Using :command:`ipcluster`
47 55 ==========================
48 56
49 The :command:`ipcluster` command provides a simple way of starting a controller and engines in the following situations:
57 The :command:`ipcluster` command provides a simple way of starting a
58 controller and engines in the following situations:
50 59
51 60 1. When the controller and engines are all run on localhost. This is useful
52 61 for testing or running on a multicore computer.
53 62 2. When engines are started using the :command:`mpirun` command that comes
54 63 with most MPI [MPI]_ implementations
55 64 3. When engines are started using the PBS [PBS]_ batch system.
56 65 4. When the controller is started on localhost and the engines are started on
57 66 remote nodes using :command:`ssh`.
58 67
59 68 .. note::
60 69
61 70 It is also possible for advanced users to add support to
62 71 :command:`ipcluster` for starting controllers and engines using other
63 72 methods (like Sun's Grid Engine for example).
64 73
65 74 .. note::
66 75
67 76 Currently :command:`ipcluster` requires that the
68 77 :file:`~/.ipython/security` directory live on a shared filesystem that is
69 78 seen by both the controller and engines. If you don't have a shared file
70 79 system you will need to use :command:`ipcontroller` and
71 80 :command:`ipengine` directly. This constraint can be relaxed if you are
72 81 using the :command:`ssh` method to start the cluster.
73 82
74 83 Underneath the hood, :command:`ipcluster` just uses :command:`ipcontroller`
75 84 and :command:`ipengine` to perform the steps described above.
76 85
77 86 Using :command:`ipcluster` in local mode
78 87 ----------------------------------------
79 88
80 89 To start one controller and 4 engines on localhost, just do::
81 90
82 91 $ ipcluster local -n 4
83 92
84 93 To see other command line options for the local mode, do::
85 94
86 95 $ ipcluster local -h
87 96
88 97 Using :command:`ipcluster` in mpiexec/mpirun mode
89 98 -------------------------------------------------
90 99
91 100 The mpiexec/mpirun mode is useful if you:
92 101
93 102 1. Have MPI installed.
94 103 2. Your systems are configured to use the :command:`mpiexec` or
95 104 :command:`mpirun` commands to start MPI processes.
96 105
97 106 .. note::
98 107
99 108 The preferred command to use is :command:`mpiexec`. However, we also
100 109 support :command:`mpirun` for backwards compatibility. The underlying
101 110 logic used is exactly the same, the only difference being the name of the
102 111 command line program that is called.
103 112
104 113 If these are satisfied, you can start an IPython cluster using::
105 114
106 115 $ ipcluster mpiexec -n 4
107 116
108 117 This does the following:
109 118
110 119 1. Starts the IPython controller on current host.
111 120 2. Uses :command:`mpiexec` to start 4 engines.
112 121
113 On newer MPI implementations (such as OpenMPI), this will work even if you don't make any calls to MPI or call :func:`MPI_Init`. However, older MPI implementations actually require each process to call :func:`MPI_Init` upon starting. The easiest way of having this done is to install the mpi4py [mpi4py]_ package and then call ipcluster with the ``--mpi`` option::
122 On newer MPI implementations (such as OpenMPI), this will work even if you
123 don't make any calls to MPI or call :func:`MPI_Init`. However, older MPI
124 implementations actually require each process to call :func:`MPI_Init` upon
125 starting. The easiest way of having this done is to install the mpi4py
126 [mpi4py]_ package and then call ipcluster with the ``--mpi`` option::
114 127
115 128 $ ipcluster mpiexec -n 4 --mpi=mpi4py
116 129
117 Unfortunately, even this won't work for some MPI implementations. If you are having problems with this, you will likely have to use a custom Python executable that itself calls :func:`MPI_Init` at the appropriate time. Fortunately, mpi4py comes with such a custom Python executable that is easy to install and use. However, this custom Python executable approach will not work with :command:`ipcluster` currently.
130 Unfortunately, even this won't work for some MPI implementations. If you are
131 having problems with this, you will likely have to use a custom Python
132 executable that itself calls :func:`MPI_Init` at the appropriate time.
133 Fortunately, mpi4py comes with such a custom Python executable that is easy to
134 install and use. However, this custom Python executable approach will not work
135 with :command:`ipcluster` currently.
118 136
119 137 Additional command line options for this mode can be found by doing::
120 138
121 139 $ ipcluster mpiexec -h
122 140
123 141 More details on using MPI with IPython can be found :ref:`here <parallelmpi>`.
124 142
125 143
126 144 Using :command:`ipcluster` in PBS mode
127 145 --------------------------------------
128 146
129 The PBS mode uses the Portable Batch System [PBS]_ to start the engines. To use this mode, you first need to create a PBS script template that will be used to start the engines. Here is a sample PBS script template:
147 The PBS mode uses the Portable Batch System [PBS]_ to start the engines. To
148 use this mode, you first need to create a PBS script template that will be
149 used to start the engines. Here is a sample PBS script template:
130 150
131 151 .. sourcecode:: bash
132 152
133 153 #PBS -N ipython
134 154 #PBS -j oe
135 155 #PBS -l walltime=00:10:00
136 156 #PBS -l nodes=${n/4}:ppn=4
137 157 #PBS -q parallel
138 158
139 159 cd $$PBS_O_WORKDIR
140 160 export PATH=$$HOME/usr/local/bin
141 161 export PYTHONPATH=$$HOME/usr/local/lib/python2.4/site-packages
142 162 /usr/local/bin/mpiexec -n ${n} ipengine --logfile=$$PBS_O_WORKDIR/ipengine
143 163
144 164 There are a few important points about this template:
145 165
146 166 1. This template will be rendered at runtime using IPython's :mod:`Itpl`
147 167 template engine.
148 168
149 169 2. Instead of putting in the actual number of engines, use the notation
150 170 ``${n}`` to indicate the number of engines to be started. You can also uses
151 171 expressions like ``${n/4}`` in the template to indicate the number of
152 172 nodes.
153 173
154 174 3. Because ``$`` is a special character used by the template engine, you must
155 175 escape any ``$`` by using ``$$``. This is important when referring to
156 176 environment variables in the template.
157 177
158 178 4. Any options to :command:`ipengine` should be given in the batch script
159 179 template.
160 180
161 181 5. Depending on the configuration of you system, you may have to set
162 182 environment variables in the script template.
163 183
164 Once you have created such a script, save it with a name like :file:`pbs.template`. Now you are ready to start your job::
184 Once you have created such a script, save it with a name like
185 :file:`pbs.template`. Now you are ready to start your job::
165 186
166 187 $ ipcluster pbs -n 128 --pbs-script=pbs.template
167 188
168 189 Additional command line options for this mode can be found by doing::
169 190
170 191 $ ipcluster pbs -h
171 192
172 193 Using :command:`ipcluster` in SSH mode
173 194 --------------------------------------
174 195
175 196 The SSH mode uses :command:`ssh` to execute :command:`ipengine` on remote
176 197 nodes and the :command:`ipcontroller` on localhost.
177 198
178 When using using this mode it highly recommended that you have set up SSH keys and are using ssh-agent [SSH]_ for password-less logins.
199 When using using this mode it highly recommended that you have set up SSH keys
200 and are using ssh-agent [SSH]_ for password-less logins.
179 201
180 To use this mode you need a python file describing the cluster, here is an example of such a "clusterfile":
202 To use this mode you need a python file describing the cluster, here is an
203 example of such a "clusterfile":
181 204
182 205 .. sourcecode:: python
183 206
184 207 send_furl = True
185 208 engines = { 'host1.example.com' : 2,
186 209 'host2.example.com' : 5,
187 210 'host3.example.com' : 1,
188 211 'host4.example.com' : 8 }
189 212
190 Since this is a regular python file usual python syntax applies. Things to note:
213 Since this is a regular python file usual python syntax applies. Things to
214 note:
191 215
192 216 * The `engines` dict, where the keys is the host we want to run engines on and
193 217 the value is the number of engines to run on that host.
194 218 * send_furl can either be `True` or `False`, if `True` it will copy over the
195 219 furl needed for :command:`ipengine` to each host.
196 220
197 221 The ``--clusterfile`` command line option lets you specify the file to use for
198 222 the cluster definition. Once you have your cluster file and you can
199 223 :command:`ssh` into the remote hosts with out an password you are ready to
200 224 start your cluster like so:
201 225
202 226 .. sourcecode:: bash
203 227
204 228 $ ipcluster ssh --clusterfile /path/to/my/clusterfile.py
205 229
206 230
207 Two helper shell scripts are used to start and stop :command:`ipengine` on remote hosts:
231 Two helper shell scripts are used to start and stop :command:`ipengine` on
232 remote hosts:
208 233
209 234 * sshx.sh
210 235 * engine_killer.sh
211 236
212 Defaults for both of these are contained in the source code for :command:`ipcluster`. The default scripts are written to a local file in a tmep directory and then copied to a temp directory on the remote host and executed from there. On most Unix, Linux and OS X systems this is /tmp.
237 Defaults for both of these are contained in the source code for
238 :command:`ipcluster`. The default scripts are written to a local file in a
239 tmep directory and then copied to a temp directory on the remote host and
240 executed from there. On most Unix, Linux and OS X systems this is /tmp.
213 241
214 242 The default sshx.sh is the following:
215 243
216 244 .. sourcecode:: bash
217 245
218 246 #!/bin/sh
219 247 "$@" &> /dev/null &
220 248 echo $!
221 249
222 250 If you want to use a custom sshx.sh script you need to use the ``--sshx``
223 251 option and specify the file to use. Using a custom sshx.sh file could be
224 252 helpful when you need to setup the environment on the remote host before
225 253 executing :command:`ipengine`.
226 254
227 255 For a detailed options list:
228 256
229 257 .. sourcecode:: bash
230 258
231 259 $ ipcluster ssh -h
232 260
233 261 Current limitations of the SSH mode of :command:`ipcluster` are:
234 262
235 263 * Untested on Windows. Would require a working :command:`ssh` on Windows.
236 264 Also, we are using shell scripts to setup and execute commands on remote
237 265 hosts.
238 266 * :command:`ipcontroller` is started on localhost, with no option to start it
239 267 on a remote node.
240 268
241 269 Using the :command:`ipcontroller` and :command:`ipengine` commands
242 270 ==================================================================
243 271
244 It is also possible to use the :command:`ipcontroller` and :command:`ipengine` commands to start your controller and engines. This approach gives you full control over all aspects of the startup process.
272 It is also possible to use the :command:`ipcontroller` and :command:`ipengine`
273 commands to start your controller and engines. This approach gives you full
274 control over all aspects of the startup process.
245 275
246 276 Starting the controller and engine on your local machine
247 277 --------------------------------------------------------
248 278
249 279 To use :command:`ipcontroller` and :command:`ipengine` to start things on your
250 280 local machine, do the following.
251 281
252 282 First start the controller::
253 283
254 284 $ ipcontroller
255 285
256 Next, start however many instances of the engine you want using (repeatedly) the command::
286 Next, start however many instances of the engine you want using (repeatedly)
287 the command::
257 288
258 289 $ ipengine
259 290
260 The engines should start and automatically connect to the controller using the FURL files in :file:`~./ipython/security`. You are now ready to use the controller and engines from IPython.
291 The engines should start and automatically connect to the controller using the
292 FURL files in :file:`~./ipython/security`. You are now ready to use the
293 controller and engines from IPython.
261 294
262 295 .. warning::
263 296
264 297 The order of the above operations is very important. You *must*
265 298 start the controller before the engines, since the engines connect
266 299 to the controller as they get started.
267 300
268 301 .. note::
269 302
270 303 On some platforms (OS X), to put the controller and engine into the
271 304 background you may need to give these commands in the form ``(ipcontroller
272 305 &)`` and ``(ipengine &)`` (with the parentheses) for them to work
273 306 properly.
274 307
275 308 Starting the controller and engines on different hosts
276 309 ------------------------------------------------------
277 310
278 311 When the controller and engines are running on different hosts, things are
279 312 slightly more complicated, but the underlying ideas are the same:
280 313
281 314 1. Start the controller on a host using :command:`ipcontroller`.
282 2. Copy :file:`ipcontroller-engine.furl` from :file:`~./ipython/security` on the controller's host to the host where the engines will run.
315 2. Copy :file:`ipcontroller-engine.furl` from :file:`~./ipython/security` on
316 the controller's host to the host where the engines will run.
283 317 3. Use :command:`ipengine` on the engine's hosts to start the engines.
284 318
285 The only thing you have to be careful of is to tell :command:`ipengine` where the :file:`ipcontroller-engine.furl` file is located. There are two ways you can do this:
319 The only thing you have to be careful of is to tell :command:`ipengine` where
320 the :file:`ipcontroller-engine.furl` file is located. There are two ways you
321 can do this:
286 322
287 323 * Put :file:`ipcontroller-engine.furl` in the :file:`~./ipython/security`
288 324 directory on the engine's host, where it will be found automatically.
289 325 * Call :command:`ipengine` with the ``--furl-file=full_path_to_the_file``
290 326 flag.
291 327
292 328 The ``--furl-file`` flag works like this::
293 329
294 330 $ ipengine --furl-file=/path/to/my/ipcontroller-engine.furl
295 331
296 332 .. note::
297 333
298 334 If the controller's and engine's hosts all have a shared file system
299 335 (:file:`~./ipython/security` is the same on all of them), then things
300 336 will just work!
301 337
302 338 Make FURL files persistent
303 339 ---------------------------
304 340
305 341 At fist glance it may seem that that managing the FURL files is a bit
306 342 annoying. Going back to the house and key analogy, copying the FURL around
307 343 each time you start the controller is like having to make a new key every time
308 344 you want to unlock the door and enter your house. As with your house, you want
309 345 to be able to create the key (or FURL file) once, and then simply use it at
310 346 any point in the future.
311 347
312 348 This is possible, but before you do this, you **must** remove any old FURL
313 349 files in the :file:`~/.ipython/security` directory.
314 350
315 351 .. warning::
316 352
317 353 You **must** remove old FURL files before using persistent FURL files.
318 354
319 355 Then, The only thing you have to do is decide what ports the controller will
320 356 listen on for the engines and clients. This is done as follows::
321 357
322 358 $ ipcontroller -r --client-port=10101 --engine-port=10102
323 359
324 360 These options also work with all of the various modes of
325 361 :command:`ipcluster`::
326 362
327 363 $ ipcluster local -n 2 -r --client-port=10101 --engine-port=10102
328 364
329 365 Then, just copy the furl files over the first time and you are set. You can
330 366 start and stop the controller and engines any many times as you want in the
331 367 future, just make sure to tell the controller to use the *same* ports.
332 368
333 369 .. note::
334 370
335 371 You may ask the question: what ports does the controller listen on if you
336 372 don't tell is to use specific ones? The default is to use high random port
337 373 numbers. We do this for two reasons: i) to increase security through
338 374 obscurity and ii) to multiple controllers on a given host to start and
339 375 automatically use different ports.
340 376
341 377 Log files
342 378 ---------
343 379
344 380 All of the components of IPython have log files associated with them.
345 381 These log files can be extremely useful in debugging problems with
346 382 IPython and can be found in the directory :file:`~/.ipython/log`. Sending
347 383 the log files to us will often help us to debug any problems.
348 384
349 385
350 386 .. [PBS] Portable Batch System. http://www.openpbs.org/
351 387 .. [SSH] SSH-Agent http://en.wikipedia.org/wiki/Ssh-agent
@@ -1,363 +1,364 b''
1 1 .. _parallelsecurity:
2 2
3 3 ===========================
4 4 Security details of IPython
5 5 ===========================
6 6
7 7 IPython's :mod:`IPython.kernel` package exposes the full power of the Python
8 8 interpreter over a TCP/IP network for the purposes of parallel computing. This
9 9 feature brings up the important question of IPython's security model. This
10 10 document gives details about this model and how it is implemented in IPython's
11 11 architecture.
12 12
13 13 Processs and network topology
14 14 =============================
15 15
16 16 To enable parallel computing, IPython has a number of different processes that
17 17 run. These processes are discussed at length in the IPython documentation and
18 18 are summarized here:
19 19
20 20 * The IPython *engine*. This process is a full blown Python
21 21 interpreter in which user code is executed. Multiple
22 22 engines are started to make parallel computing possible.
23 23 * The IPython *controller*. This process manages a set of
24 24 engines, maintaining a queue for each and presenting
25 25 an asynchronous interface to the set of engines.
26 26 * The IPython *client*. This process is typically an
27 27 interactive Python process that is used to coordinate the
28 28 engines to get a parallel computation done.
29 29
30 30 Collectively, these three processes are called the IPython *kernel*.
31 31
32 32 These three processes communicate over TCP/IP connections with a well defined
33 33 topology. The IPython controller is the only process that listens on TCP/IP
34 34 sockets. Upon starting, an engine connects to a controller and registers
35 35 itself with the controller. These engine/controller TCP/IP connections persist
36 36 for the lifetime of each engine.
37 37
38 38 The IPython client also connects to the controller using one or more TCP/IP
39 39 connections. These connections persist for the lifetime of the client only.
40 40
41 41 A given IPython controller and set of engines typically has a relatively short
42 42 lifetime. Typically this lifetime corresponds to the duration of a single
43 43 parallel simulation performed by a single user. Finally, the controller,
44 44 engines and client processes typically execute with the permissions of that
45 45 same user. More specifically, the controller and engines are *not* executed as
46 46 root or with any other superuser permissions.
47 47
48 48 Application logic
49 49 =================
50 50
51 51 When running the IPython kernel to perform a parallel computation, a user
52 52 utilizes the IPython client to send Python commands and data through the
53 53 IPython controller to the IPython engines, where those commands are executed
54 54 and the data processed. The design of IPython ensures that the client is the
55 only access point for the capabilities of the engines. That is, the only way of addressing the engines is through a client.
55 only access point for the capabilities of the engines. That is, the only way
56 of addressing the engines is through a client.
56 57
57 58 A user can utilize the client to instruct the IPython engines to execute
58 59 arbitrary Python commands. These Python commands can include calls to the
59 60 system shell, access the filesystem, etc., as required by the user's
60 61 application code. From this perspective, when a user runs an IPython engine on
61 62 a host, that engine has the same capabilities and permissions as the user
62 63 themselves (as if they were logged onto the engine's host with a terminal).
63 64
64 65 Secure network connections
65 66 ==========================
66 67
67 68 Overview
68 69 --------
69 70
70 71 All TCP/IP connections between the client and controller as well as the
71 72 engines and controller are fully encrypted and authenticated. This section
72 73 describes the details of the encryption and authentication approached used
73 74 within IPython.
74 75
75 76 IPython uses the Foolscap network protocol [Foolscap]_ for all communications
76 77 between processes. Thus, the details of IPython's security model are directly
77 78 related to those of Foolscap. Thus, much of the following discussion is
78 79 actually just a discussion of the security that is built in to Foolscap.
79 80
80 81 Encryption
81 82 ----------
82 83
83 84 For encryption purposes, IPython and Foolscap use the well known Secure Socket
84 85 Layer (SSL) protocol [RFC5246]_. We use the implementation of this protocol
85 86 provided by the OpenSSL project through the pyOpenSSL [pyOpenSSL]_ Python
86 87 bindings to OpenSSL.
87 88
88 89 Authentication
89 90 --------------
90 91
91 92 IPython clients and engines must also authenticate themselves with the
92 93 controller. This is handled in a capabilities based security model
93 94 [Capability]_. In this model, the controller creates a strong cryptographic
94 95 key or token that represents each set of capability that the controller
95 96 offers. Any party who has this key and presents it to the controller has full
96 97 access to the corresponding capabilities of the controller. This model is
97 98 analogous to using a physical key to gain access to physical items
98 99 (capabilities) behind a locked door.
99 100
100 101 For a capabilities based authentication system to prevent unauthorized access,
101 102 two things must be ensured:
102 103
103 104 * The keys must be cryptographically strong. Otherwise attackers could gain
104 105 access by a simple brute force key guessing attack.
105 106 * The actual keys must be distributed only to authorized parties.
106 107
107 108 The keys in Foolscap are called Foolscap URL's or FURLs. The following section
108 109 gives details about how these FURLs are created in Foolscap. The IPython
109 110 controller creates a number of FURLs for different purposes:
110 111
111 112 * One FURL that grants IPython engines access to the controller. Also
112 113 implicit in this access is permission to execute code sent by an
113 114 authenticated IPython client.
114 115 * Two or more FURLs that grant IPython clients access to the controller.
115 116 Implicit in this access is permission to give the controller's engine code
116 117 to execute.
117 118
118 119 Upon starting, the controller creates these different FURLS and writes them
119 files in the user-read-only directory :file:`$HOME/.ipython/security`. Thus, only the
120 user who starts the controller has access to the FURLs.
120 files in the user-read-only directory :file:`$HOME/.ipython/security`. Thus,
121 only the user who starts the controller has access to the FURLs.
121 122
122 123 For an IPython client or engine to authenticate with a controller, it must
123 124 present the appropriate FURL to the controller upon connecting. If the
124 125 FURL matches what the controller expects for a given capability, access is
125 126 granted. If not, access is denied. The exchange of FURLs is done after
126 127 encrypted communications channels have been established to prevent attackers
127 128 from capturing them.
128 129
129 130 .. note::
130 131
131 132 The FURL is similar to an unsigned private key in SSH.
132 133
133 134 Details of the Foolscap handshake
134 135 ---------------------------------
135 136
136 137 In this section we detail the precise security handshake that takes place at
137 138 the beginning of any network connection in IPython. For the purposes of this
138 139 discussion, the SERVER is the IPython controller process and the CLIENT is the
139 140 IPython engine or client process.
140 141
141 142 Upon starting, all IPython processes do the following:
142 143
143 144 1. Create a public key x509 certificate (ISO/IEC 9594).
144 145 2. Create a hash of the contents of the certificate using the SHA-1 algorithm.
145 146 The base-32 encoded version of this hash is saved by the process as its
146 147 process id (actually in Foolscap, this is the Tub id, but here refer to
147 148 it as the process id).
148 149
149 150 Upon starting, the IPython controller also does the following:
150 151
151 152 1. Save the x509 certificate to disk in a secure location. The CLIENT
152 153 certificate is never saved to disk.
153 154 2. Create a FURL for each capability that the controller has. There are
154 155 separate capabilities the controller offers for clients and engines. The
155 156 FURL is created using: a) the process id of the SERVER, b) the IP
156 157 address and port the SERVER is listening on and c) a 160 bit,
157 158 cryptographically secure string that represents the capability (the
158 159 "capability id").
159 160 3. The FURLs are saved to disk in a secure location on the SERVER's host.
160 161
161 162 For a CLIENT to be able to connect to the SERVER and access a capability of
162 163 that SERVER, the CLIENT must have knowledge of the FURL for that SERVER's
163 164 capability. This typically requires that the file containing the FURL be
164 165 moved from the SERVER's host to the CLIENT's host. This is done by the end
165 166 user who started the SERVER and wishes to have a CLIENT connect to the SERVER.
166 167
167 168 When a CLIENT connects to the SERVER, the following handshake protocol takes
168 169 place:
169 170
170 171 1. The CLIENT tells the SERVER what process (or Tub) id it expects the SERVER
171 172 to have.
172 173 2. If the SERVER has that process id, it notifies the CLIENT that it will now
173 174 enter encrypted mode. If the SERVER has a different id, the SERVER aborts.
174 175 3. Both CLIENT and SERVER initiate the SSL handshake protocol.
175 176 4. Both CLIENT and SERVER request the certificate of their peer and verify
176 177 that certificate. If this succeeds, all further communications are
177 178 encrypted.
178 179 5. Both CLIENT and SERVER send a hello block containing connection parameters
179 180 and their process id.
180 181 6. The CLIENT and SERVER check that their peer's stated process id matches the
181 182 hash of the x509 certificate the peer presented. If not, the connection is
182 183 aborted.
183 184 7. The CLIENT verifies that the SERVER's stated id matches the id of the
184 185 SERVER the CLIENT is intending to connect to. If not, the connection is
185 186 aborted.
186 187 8. The CLIENT and SERVER elect a master who decides on the final connection
187 188 parameters.
188 189
189 190 The public/private key pair associated with each process's x509 certificate
190 191 are completely hidden from this handshake protocol. There are however, used
191 192 internally by OpenSSL as part of the SSL handshake protocol. Each process
192 193 keeps their own private key hidden and sends its peer only the public key
193 194 (embedded in the certificate).
194 195
195 196 Finally, when the CLIENT requests access to a particular SERVER capability,
196 197 the following happens:
197 198
198 199 1. The CLIENT asks the SERVER for access to a capability by presenting that
199 200 capabilities id.
200 201 2. If the SERVER has a capability with that id, access is granted. If not,
201 202 access is not granted.
202 203 3. Once access has been gained, the CLIENT can use the capability.
203 204
204 205 Specific security vulnerabilities
205 206 =================================
206 207
207 208 There are a number of potential security vulnerabilities present in IPython's
208 209 architecture. In this section we discuss those vulnerabilities and detail how
209 210 the security architecture described above prevents them from being exploited.
210 211
211 212 Unauthorized clients
212 213 --------------------
213 214
214 215 The IPython client can instruct the IPython engines to execute arbitrary
215 216 Python code with the permissions of the user who started the engines. If an
216 217 attacker were able to connect their own hostile IPython client to the IPython
217 218 controller, they could instruct the engines to execute code.
218 219
219 220 This attack is prevented by the capabilities based client authentication
220 221 performed after the encrypted channel has been established. The relevant
221 222 authentication information is encoded into the FURL that clients must
222 223 present to gain access to the IPython controller. By limiting the distribution
223 224 of those FURLs, a user can grant access to only authorized persons.
224 225
225 226 It is highly unlikely that a client FURL could be guessed by an attacker
226 227 in a brute force guessing attack. A given instance of the IPython controller
227 228 only runs for a relatively short amount of time (on the order of hours). Thus
228 229 an attacker would have only a limited amount of time to test a search space of
229 230 size 2**320. Furthermore, even if a controller were to run for a longer amount
230 231 of time, this search space is quite large (larger for instance than that of
231 232 typical username/password pair).
232 233
233 234 Unauthorized engines
234 235 --------------------
235 236
236 237 If an attacker were able to connect a hostile engine to a user's controller,
237 238 the user might unknowingly send sensitive code or data to the hostile engine.
238 239 This attacker's engine would then have full access to that code and data.
239 240
240 241 This type of attack is prevented in the same way as the unauthorized client
241 242 attack, through the usage of the capabilities based authentication scheme.
242 243
243 244 Unauthorized controllers
244 245 ------------------------
245 246
246 247 It is also possible that an attacker could try to convince a user's IPython
247 248 client or engine to connect to a hostile IPython controller. That controller
248 249 would then have full access to the code and data sent between the IPython
249 250 client and the IPython engines.
250 251
251 252 Again, this attack is prevented through the FURLs, which ensure that a
252 253 client or engine connects to the correct controller. It is also important to
253 254 note that the FURLs also encode the IP address and port that the
254 255 controller is listening on, so there is little chance of mistakenly connecting
255 256 to a controller running on a different IP address and port.
256 257
257 258 When starting an engine or client, a user must specify which FURL to use
258 259 for that connection. Thus, in order to introduce a hostile controller, the
259 260 attacker must convince the user to use the FURLs associated with the
260 261 hostile controller. As long as a user is diligent in only using FURLs from
261 262 trusted sources, this attack is not possible.
262 263
263 264 Other security measures
264 265 =======================
265 266
266 267 A number of other measures are taken to further limit the security risks
267 268 involved in running the IPython kernel.
268 269
269 270 First, by default, the IPython controller listens on random port numbers.
270 271 While this can be overridden by the user, in the default configuration, an
271 272 attacker would have to do a port scan to even find a controller to attack.
272 273 When coupled with the relatively short running time of a typical controller
273 274 (on the order of hours), an attacker would have to work extremely hard and
274 275 extremely *fast* to even find a running controller to attack.
275 276
276 277 Second, much of the time, especially when run on supercomputers or clusters,
277 278 the controller is running behind a firewall. Thus, for engines or client to
278 279 connect to the controller:
279 280
280 281 * The different processes have to all be behind the firewall.
281 282
282 283 or:
283 284
284 285 * The user has to use SSH port forwarding to tunnel the
285 286 connections through the firewall.
286 287
287 288 In either case, an attacker is presented with addition barriers that prevent
288 289 attacking or even probing the system.
289 290
290 291 Summary
291 292 =======
292 293
293 294 IPython's architecture has been carefully designed with security in mind. The
294 295 capabilities based authentication model, in conjunction with the encrypted
295 296 TCP/IP channels, address the core potential vulnerabilities in the system,
296 297 while still enabling user's to use the system in open networks.
297 298
298 299 Other questions
299 300 ===============
300 301
301 302 About keys
302 303 ----------
303 304
304 305 Can you clarify the roles of the certificate and its keys versus the FURL,
305 306 which is also called a key?
306 307
307 308 The certificate created by IPython processes is a standard public key x509
308 309 certificate, that is used by the SSL handshake protocol to setup encrypted
309 310 channel between the controller and the IPython engine or client. This public
310 311 and private key associated with this certificate are used only by the SSL
311 312 handshake protocol in setting up this encrypted channel.
312 313
313 314 The FURL serves a completely different and independent purpose from the
314 315 key pair associated with the certificate. When we refer to a FURL as a
315 316 key, we are using the word "key" in the capabilities based security model
316 317 sense. This has nothing to do with "key" in the public/private key sense used
317 318 in the SSL protocol.
318 319
319 320 With that said the FURL is used as an cryptographic key, to grant
320 321 IPython engines and clients access to particular capabilities that the
321 322 controller offers.
322 323
323 324 Self signed certificates
324 325 ------------------------
325 326
326 327 Is the controller creating a self-signed certificate? Is this created for per
327 328 instance/session, one-time-setup or each-time the controller is started?
328 329
329 330 The Foolscap network protocol, which handles the SSL protocol details, creates
330 331 a self-signed x509 certificate using OpenSSL for each IPython process. The
331 332 lifetime of the certificate is handled differently for the IPython controller
332 333 and the engines/client.
333 334
334 335 For the IPython engines and client, the certificate is only held in memory for
335 336 the lifetime of its process. It is never written to disk.
336 337
337 338 For the controller, the certificate can be created anew each time the
338 339 controller starts or it can be created once and reused each time the
339 340 controller starts. If at any point, the certificate is deleted, a new one is
340 341 created the next time the controller starts.
341 342
342 343 SSL private key
343 344 ---------------
344 345
345 346 How the private key (associated with the certificate) is distributed?
346 347
347 348 In the usual implementation of the SSL protocol, the private key is never
348 349 distributed. We follow this standard always.
349 350
350 351 SSL versus Foolscap authentication
351 352 ----------------------------------
352 353
353 354 Many SSL connections only perform one sided authentication (the server to the
354 355 client). How is the client authentication in IPython's system related to SSL
355 356 authentication?
356 357
357 358 We perform a two way SSL handshake in which both parties request and verify
358 359 the certificate of their peer. This mutual authentication is handled by the
359 360 SSL handshake and is separate and independent from the additional
360 361 authentication steps that the CLIENT and SERVER perform after an encrypted
361 362 channel is established.
362 363
363 364 .. [RFC5246] <http://tools.ietf.org/html/rfc5246>
@@ -1,99 +1,120 b''
1 1 .. _paralleltask:
2 2
3 3 ==========================
4 4 The IPython task interface
5 5 ==========================
6 6
7 The task interface to the controller presents the engines as a fault tolerant, dynamic load-balanced system or workers. Unlike the multiengine interface, in the task interface, the user have no direct access to individual engines. In some ways, this interface is simpler, but in other ways it is more powerful.
8
9 Best of all the user can use both of these interfaces running at the same time to take advantage or both of their strengths. When the user can break up the user's work into segments that do not depend on previous execution, the task interface is ideal. But it also has more power and flexibility, allowing the user to guide the distribution of jobs, without having to assign tasks to engines explicitly.
7 The task interface to the controller presents the engines as a fault tolerant,
8 dynamic load-balanced system or workers. Unlike the multiengine interface, in
9 the task interface, the user have no direct access to individual engines. In
10 some ways, this interface is simpler, but in other ways it is more powerful.
11
12 Best of all the user can use both of these interfaces running at the same time
13 to take advantage or both of their strengths. When the user can break up the
14 user's work into segments that do not depend on previous execution, the task
15 interface is ideal. But it also has more power and flexibility, allowing the
16 user to guide the distribution of jobs, without having to assign tasks to
17 engines explicitly.
10 18
11 19 Starting the IPython controller and engines
12 20 ===========================================
13 21
14 22 To follow along with this tutorial, you will need to start the IPython
15 23 controller and four IPython engines. The simplest way of doing this is to use
16 24 the :command:`ipcluster` command::
17 25
18 26 $ ipcluster local -n 4
19 27
20 28 For more detailed information about starting the controller and engines, see
21 29 our :ref:`introduction <ip1par>` to using IPython for parallel computing.
22 30
23 31 Creating a ``TaskClient`` instance
24 32 =========================================
25 33
26 34 The first step is to import the IPython :mod:`IPython.kernel.client` module
27 35 and then create a :class:`TaskClient` instance:
28 36
29 37 .. sourcecode:: ipython
30 38
31 39 In [1]: from IPython.kernel import client
32 40
33 41 In [2]: tc = client.TaskClient()
34 42
35 43 This form assumes that the :file:`ipcontroller-tc.furl` is in the
36 44 :file:`~./ipython/security` directory on the client's host. If not, the
37 45 location of the FURL file must be given as an argument to the
38 46 constructor:
39 47
40 48 .. sourcecode:: ipython
41 49
42 50 In [2]: mec = client.TaskClient('/path/to/my/ipcontroller-tc.furl')
43 51
44 52 Quick and easy parallelism
45 53 ==========================
46 54
47 In many cases, you simply want to apply a Python function to a sequence of objects, but *in parallel*. Like the multiengine interface, the task interface provides two simple ways of accomplishing this: a parallel version of :func:`map` and ``@parallel`` function decorator. However, the verions in the task interface have one important difference: they are dynamically load balanced. Thus, if the execution time per item varies significantly, you should use the versions in the task interface.
55 In many cases, you simply want to apply a Python function to a sequence of
56 objects, but *in parallel*. Like the multiengine interface, the task interface
57 provides two simple ways of accomplishing this: a parallel version of
58 :func:`map` and ``@parallel`` function decorator. However, the verions in the
59 task interface have one important difference: they are dynamically load
60 balanced. Thus, if the execution time per item varies significantly, you
61 should use the versions in the task interface.
48 62
49 63 Parallel map
50 64 ------------
51 65
52 The parallel :meth:`map` in the task interface is similar to that in the multiengine interface:
66 The parallel :meth:`map` in the task interface is similar to that in the
67 multiengine interface:
53 68
54 69 .. sourcecode:: ipython
55 70
56 71 In [63]: serial_result = map(lambda x:x**10, range(32))
57 72
58 73 In [64]: parallel_result = tc.map(lambda x:x**10, range(32))
59 74
60 75 In [65]: serial_result==parallel_result
61 76 Out[65]: True
62 77
63 78 Parallel function decorator
64 79 ---------------------------
65 80
66 Parallel functions are just like normal function, but they can be called on sequences and *in parallel*. The multiengine interface provides a decorator that turns any Python function into a parallel function:
81 Parallel functions are just like normal function, but they can be called on
82 sequences and *in parallel*. The multiengine interface provides a decorator
83 that turns any Python function into a parallel function:
67 84
68 85 .. sourcecode:: ipython
69 86
70 87 In [10]: @tc.parallel()
71 88 ....: def f(x):
72 89 ....: return 10.0*x**4
73 90 ....:
74 91
75 92 In [11]: f(range(32)) # this is done in parallel
76 93 Out[11]:
77 94 [0.0,10.0,160.0,...]
78 95
79 96 More details
80 97 ============
81 98
82 The :class:`TaskClient` has many more powerful features that allow quite a bit of flexibility in how tasks are defined and run. The next places to look are in the following classes:
99 The :class:`TaskClient` has many more powerful features that allow quite a bit
100 of flexibility in how tasks are defined and run. The next places to look are
101 in the following classes:
83 102
84 103 * :class:`IPython.kernel.client.TaskClient`
85 104 * :class:`IPython.kernel.client.StringTask`
86 105 * :class:`IPython.kernel.client.MapTask`
87 106
88 107 The following is an overview of how to use these classes together:
89 108
90 109 1. Create a :class:`TaskClient`.
91 110 2. Create one or more instances of :class:`StringTask` or :class:`MapTask`
92 111 to define your tasks.
93 112 3. Submit your tasks to using the :meth:`run` method of your
94 113 :class:`TaskClient` instance.
95 114 4. Use :meth:`TaskClient.get_task_result` to get the results of the
96 115 tasks.
97 116
98 We are in the process of developing more detailed information about the task interface. For now, the docstrings of the :class:`TaskClient`, :class:`StringTask` and :class:`MapTask` classes should be consulted.
117 We are in the process of developing more detailed information about the task
118 interface. For now, the docstrings of the :class:`TaskClient`,
119 :class:`StringTask` and :class:`MapTask` classes should be consulted.
99 120
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now