##// END OF EJS Templates
Simplifying code in several places.
Thomas Kluyver -
Show More
@@ -1,592 +1,587 b''
1 """ History related magics and functionality """
1 """ History related magics and functionality """
2 #-----------------------------------------------------------------------------
2 #-----------------------------------------------------------------------------
3 # Copyright (C) 2010 The IPython Development Team.
3 # Copyright (C) 2010 The IPython Development Team.
4 #
4 #
5 # Distributed under the terms of the BSD License.
5 # Distributed under the terms of the BSD License.
6 #
6 #
7 # The full license is in the file COPYING.txt, distributed with this software.
7 # The full license is in the file COPYING.txt, distributed with this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Imports
11 # Imports
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 from __future__ import print_function
13 from __future__ import print_function
14
14
15 # Stdlib imports
15 # Stdlib imports
16 import atexit
16 import atexit
17 import fnmatch
17 import fnmatch
18 import json
18 import json
19 import os
19 import os
20 import sys
20 import sys
21 import threading
21 import threading
22 import time
22 import time
23
23
24 # Our own packages
24 # Our own packages
25 import IPython.utils.io
25 import IPython.utils.io
26
26
27 from IPython.testing import decorators as testdec
27 from IPython.testing import decorators as testdec
28 from IPython.utils.pickleshare import PickleShareDB
28 from IPython.utils.pickleshare import PickleShareDB
29 from IPython.utils.io import ask_yes_no
29 from IPython.utils.io import ask_yes_no
30 from IPython.utils.warn import warn
30 from IPython.utils.warn import warn
31
31
32 #-----------------------------------------------------------------------------
32 #-----------------------------------------------------------------------------
33 # Classes and functions
33 # Classes and functions
34 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
35
35
36 class HistoryManager(object):
36 class HistoryManager(object):
37 """A class to organize all history-related functionality in one place.
37 """A class to organize all history-related functionality in one place.
38 """
38 """
39 # Public interface
39 # Public interface
40
40
41 # An instance of the IPython shell we are attached to
41 # An instance of the IPython shell we are attached to
42 shell = None
42 shell = None
43 # A list to hold processed history
43 # A list to hold processed history
44 input_hist_parsed = None
44 input_hist_parsed = None
45 # A list to hold raw history (as typed by user)
45 # A list to hold raw history (as typed by user)
46 input_hist_raw = None
46 input_hist_raw = None
47 # A list of directories visited during session
47 # A list of directories visited during session
48 dir_hist = None
48 dir_hist = None
49 # A dict of output history, keyed with ints from the shell's execution count
49 # A dict of output history, keyed with ints from the shell's execution count
50 output_hist = None
50 output_hist = None
51 # String with path to the history file
51 # String with path to the history file
52 hist_file = None
52 hist_file = None
53 # PickleShareDB instance holding the raw data for the shadow history
53 # PickleShareDB instance holding the raw data for the shadow history
54 shadow_db = None
54 shadow_db = None
55 # ShadowHist instance with the actual shadow history
55 # ShadowHist instance with the actual shadow history
56 shadow_hist = None
56 shadow_hist = None
57
57
58 # Private interface
58 # Private interface
59 # Variables used to store the three last inputs from the user. On each new
59 # Variables used to store the three last inputs from the user. On each new
60 # history update, we populate the user's namespace with these, shifted as
60 # history update, we populate the user's namespace with these, shifted as
61 # necessary.
61 # necessary.
62 _i00, _i, _ii, _iii = '','','',''
62 _i00, _i, _ii, _iii = '','','',''
63
63
64 # A set with all forms of the exit command, so that we don't store them in
64 # A set with all forms of the exit command, so that we don't store them in
65 # the history (it's annoying to rewind the first entry and land on an exit
65 # the history (it's annoying to rewind the first entry and land on an exit
66 # call).
66 # call).
67 _exit_commands = None
67 _exit_commands = None
68
68
69 def __init__(self, shell, load_history=False):
69 def __init__(self, shell, load_history=False):
70 """Create a new history manager associated with a shell instance.
70 """Create a new history manager associated with a shell instance.
71
71
72 If load_history is true, it will load the history from file and set the
72 If load_history is true, it will load the history from file and set the
73 session offset so that the next line typed can be retrieved as #1.
73 session offset so that the next line typed can be retrieved as #1.
74 """
74 """
75 # We need a pointer back to the shell for various tasks.
75 # We need a pointer back to the shell for various tasks.
76 self.shell = shell
76 self.shell = shell
77
77
78 # List of input with multi-line handling.
78 # List of input with multi-line handling.
79 self.input_hist_parsed = []
79 self.input_hist_parsed = []
80 # This one will hold the 'raw' input history, without any
80 # This one will hold the 'raw' input history, without any
81 # pre-processing. This will allow users to retrieve the input just as
81 # pre-processing. This will allow users to retrieve the input just as
82 # it was exactly typed in by the user, with %hist -r.
82 # it was exactly typed in by the user, with %hist -r.
83 self.input_hist_raw = []
83 self.input_hist_raw = []
84
84
85 # Offset so the first line of the current session is #1
85 # Offset so the first line of the current session is #1
86 self.session_offset = -1
86 self.session_offset = -1
87
87
88 # list of visited directories
88 # list of visited directories
89 try:
89 try:
90 self.dir_hist = [os.getcwd()]
90 self.dir_hist = [os.getcwd()]
91 except OSError:
91 except OSError:
92 self.dir_hist = []
92 self.dir_hist = []
93
93
94 # dict of output history
94 # dict of output history
95 self.output_hist = {}
95 self.output_hist = {}
96
96
97 # Now the history file
97 # Now the history file
98 if shell.profile:
98 if shell.profile:
99 histfname = 'history-%s' % shell.profile
99 histfname = 'history-%s' % shell.profile
100 else:
100 else:
101 histfname = 'history'
101 histfname = 'history'
102 self.hist_file = os.path.join(shell.ipython_dir, histfname + '.json')
102 self.hist_file = os.path.join(shell.ipython_dir, histfname + '.json')
103
103
104 # Objects related to shadow history management
104 # Objects related to shadow history management
105 self._init_shadow_hist()
105 self._init_shadow_hist()
106
106
107 self._i00, self._i, self._ii, self._iii = '','','',''
107 self._i00, self._i, self._ii, self._iii = '','','',''
108
108
109 self._exit_commands = set(['Quit', 'quit', 'Exit', 'exit', '%Quit',
109 self._exit_commands = set(['Quit', 'quit', 'Exit', 'exit', '%Quit',
110 '%quit', '%Exit', '%exit'])
110 '%quit', '%Exit', '%exit'])
111
111
112 # Object is fully initialized, we can now call methods on it.
112 # Object is fully initialized, we can now call methods on it.
113
113
114 if load_history:
114 if load_history:
115 self.reload_history()
115 self.reload_history()
116 self.session_offset = len(self.input_hist_raw) -1
116 self.session_offset = len(self.input_hist_raw) -1
117
117
118 # Create and start the autosaver.
118 # Create and start the autosaver.
119 self.autosave_flag = threading.Event()
119 self.autosave_flag = threading.Event()
120 self.autosave_timer = HistorySaveThread(self.autosave_flag, 60)
120 self.autosave_timer = HistorySaveThread(self.autosave_flag, 60)
121 self.autosave_timer.start()
121 self.autosave_timer.start()
122 # Register the autosave handler to be triggered as a post execute
122 # Register the autosave handler to be triggered as a post execute
123 # callback.
123 # callback.
124 self.shell.register_post_execute(self.autosave_if_due)
124 self.shell.register_post_execute(self.autosave_if_due)
125
125
126
126
127 def _init_shadow_hist(self):
127 def _init_shadow_hist(self):
128 try:
128 try:
129 self.shadow_db = PickleShareDB(os.path.join(
129 self.shadow_db = PickleShareDB(os.path.join(
130 self.shell.ipython_dir, 'db'))
130 self.shell.ipython_dir, 'db'))
131 except UnicodeDecodeError:
131 except UnicodeDecodeError:
132 print("Your ipython_dir can't be decoded to unicode!")
132 print("Your ipython_dir can't be decoded to unicode!")
133 print("Please set HOME environment variable to something that")
133 print("Please set HOME environment variable to something that")
134 print(r"only has ASCII characters, e.g. c:\home")
134 print(r"only has ASCII characters, e.g. c:\home")
135 print("Now it is", self.ipython_dir)
135 print("Now it is", self.ipython_dir)
136 sys.exit()
136 sys.exit()
137 self.shadow_hist = ShadowHist(self.shadow_db, self.shell)
137 self.shadow_hist = ShadowHist(self.shadow_db, self.shell)
138
138
139 def populate_readline_history(self):
139 def populate_readline_history(self):
140 """Populate the readline history from the raw history.
140 """Populate the readline history from the raw history.
141
141
142 We only store one copy of the raw history, which is persisted to a json
142 We only store one copy of the raw history, which is persisted to a json
143 file on disk. The readline history is repopulated from the contents of
143 file on disk. The readline history is repopulated from the contents of
144 this file."""
144 this file."""
145
145
146 try:
146 try:
147 self.shell.readline.clear_history()
147 self.shell.readline.clear_history()
148 except AttributeError:
148 except AttributeError:
149 pass
149 pass
150 else:
150 else:
151 for h in self.input_hist_raw:
151 for h in self.input_hist_raw:
152 if not h.isspace():
152 if not h.isspace():
153 for line in h.splitlines():
153 for line in h.splitlines():
154 self.shell.readline.add_history(line)
154 self.shell.readline.add_history(line)
155
155
156 def save_history(self):
156 def save_history(self):
157 """Save input history to a file (via readline library)."""
157 """Save input history to a file (via readline library)."""
158 hist = dict(raw=self.input_hist_raw, #[-self.shell.history_length:],
158 hist = dict(raw=self.input_hist_raw, #[-self.shell.history_length:],
159 parsed=self.input_hist_parsed) #[-self.shell.history_length:])
159 parsed=self.input_hist_parsed) #[-self.shell.history_length:])
160 with open(self.hist_file,'wt') as hfile:
160 with open(self.hist_file,'wt') as hfile:
161 json.dump(hist, hfile,
161 json.dump(hist, hfile,
162 sort_keys=True, indent=4)
162 sort_keys=True, indent=4)
163
163
164 def autosave_if_due(self):
164 def autosave_if_due(self):
165 """Check if the autosave event is set; if so, save history. We do it
165 """Check if the autosave event is set; if so, save history. We do it
166 this way so that the save takes place in the main thread."""
166 this way so that the save takes place in the main thread."""
167 if self.autosave_flag.is_set():
167 if self.autosave_flag.is_set():
168 self.save_history()
168 self.save_history()
169 self.autosave_flag.clear()
169 self.autosave_flag.clear()
170
170
171 def reload_history(self):
171 def reload_history(self):
172 """Reload the input history from disk file."""
172 """Reload the input history from disk file."""
173
173
174 with open(self.hist_file,'rt') as hfile:
174 with open(self.hist_file,'rt') as hfile:
175 try:
175 try:
176 hist = json.load(hfile)
176 hist = json.load(hfile)
177 except ValueError: # Ignore it if JSON is corrupt.
177 except ValueError: # Ignore it if JSON is corrupt.
178 return
178 return
179 self.input_hist_parsed = hist['parsed']
179 self.input_hist_parsed = hist['parsed']
180 self.input_hist_raw = hist['raw']
180 self.input_hist_raw = hist['raw']
181 if self.shell.has_readline:
181 if self.shell.has_readline:
182 self.populate_readline_history()
182 self.populate_readline_history()
183
183
184 def get_history(self, index=None, raw=False, output=True):
184 def get_history(self, index=None, raw=False, output=True):
185 """Get the history list.
185 """Get the history list.
186
186
187 Get the input and output history.
187 Get the input and output history.
188
188
189 Parameters
189 Parameters
190 ----------
190 ----------
191 index : n or (n1, n2) or None
191 index : n or (n1, n2) or None
192 If n, then the last n entries. If a tuple, then all in
192 If n, then the last n entries. If a tuple, then all in
193 range(n1, n2). If None, then all entries. Raises IndexError if
193 range(n1, n2). If None, then all entries. Raises IndexError if
194 the format of index is incorrect.
194 the format of index is incorrect.
195 raw : bool
195 raw : bool
196 If True, return the raw input.
196 If True, return the raw input.
197 output : bool
197 output : bool
198 If True, then return the output as well.
198 If True, then return the output as well.
199
199
200 Returns
200 Returns
201 -------
201 -------
202 If output is True, then return a dict of tuples, keyed by the prompt
202 If output is True, then return a dict of tuples, keyed by the prompt
203 numbers and with values of (input, output). If output is False, then
203 numbers and with values of (input, output). If output is False, then
204 a dict, keyed by the prompt number with the values of input.
204 a dict, keyed by the prompt number with the values of input.
205 """
205 """
206 if raw:
206 if raw:
207 input_hist = self.input_hist_raw
207 input_hist = self.input_hist_raw
208 else:
208 else:
209 input_hist = self.input_hist_parsed
209 input_hist = self.input_hist_parsed
210 if output:
210 if output:
211 output_hist = self.output_hist
211 output_hist = self.output_hist
212
212
213 n = len(input_hist)
213 n = len(input_hist)
214 offset = self.session_offset
214 offset = self.session_offset
215 if index is None:
215 if index is None:
216 start=offset+1; stop=n
216 start=offset+1; stop=n
217 elif isinstance(index, int):
217 elif isinstance(index, int):
218 start=n-index; stop=n
218 start=n-index; stop=n
219 elif len(index) == 2:
219 elif len(index) == 2:
220 start = index[0] + offset
220 start = index[0] + offset
221 stop = index[1] + offset
221 stop = index[1] + offset
222 else:
222 else:
223 raise IndexError('Not a valid index for the input history: %r'
223 raise IndexError('Not a valid index for the input history: %r'
224 % index)
224 % index)
225 hist = {}
225 hist = {}
226 for i in range(start, stop):
226 for i in range(start, stop):
227 if output:
227 if output:
228 hist[i-offset] = (input_hist[i], output_hist.get(i-offset))
228 hist[i-offset] = (input_hist[i], output_hist.get(i-offset))
229 else:
229 else:
230 hist[i-offset] = input_hist[i]
230 hist[i-offset] = input_hist[i]
231 return hist
231 return hist
232
232
233 def store_inputs(self, source, source_raw=None):
233 def store_inputs(self, source, source_raw=None):
234 """Store source and raw input in history and create input cache
234 """Store source and raw input in history and create input cache
235 variables _i*.
235 variables _i*.
236
236
237 Parameters
237 Parameters
238 ----------
238 ----------
239 source : str
239 source : str
240 Python input.
240 Python input.
241
241
242 source_raw : str, optional
242 source_raw : str, optional
243 If given, this is the raw input without any IPython transformations
243 If given, this is the raw input without any IPython transformations
244 applied to it. If not given, ``source`` is used.
244 applied to it. If not given, ``source`` is used.
245 """
245 """
246 if source_raw is None:
246 if source_raw is None:
247 source_raw = source
247 source_raw = source
248
248
249 # do not store exit/quit commands
249 # do not store exit/quit commands
250 if source_raw.strip() in self._exit_commands:
250 if source_raw.strip() in self._exit_commands:
251 return
251 return
252
252
253 self.input_hist_parsed.append(source.rstrip())
253 self.input_hist_parsed.append(source.rstrip())
254 self.input_hist_raw.append(source_raw.rstrip())
254 self.input_hist_raw.append(source_raw.rstrip())
255 self.shadow_hist.add(source)
255 self.shadow_hist.add(source)
256
256
257 # update the auto _i variables
257 # update the auto _i variables
258 self._iii = self._ii
258 self._iii = self._ii
259 self._ii = self._i
259 self._ii = self._i
260 self._i = self._i00
260 self._i = self._i00
261 self._i00 = source_raw
261 self._i00 = source_raw
262
262
263 # hackish access to user namespace to create _i1,_i2... dynamically
263 # hackish access to user namespace to create _i1,_i2... dynamically
264 new_i = '_i%s' % self.shell.execution_count
264 new_i = '_i%s' % self.shell.execution_count
265 to_main = {'_i': self._i,
265 to_main = {'_i': self._i,
266 '_ii': self._ii,
266 '_ii': self._ii,
267 '_iii': self._iii,
267 '_iii': self._iii,
268 new_i : self._i00 }
268 new_i : self._i00 }
269 self.shell.user_ns.update(to_main)
269 self.shell.user_ns.update(to_main)
270
270
271 def sync_inputs(self):
271 def sync_inputs(self):
272 """Ensure raw and translated histories have same length."""
272 """Ensure raw and translated histories have same length."""
273 if len(self.input_hist_parsed) != len (self.input_hist_raw):
273 if len(self.input_hist_parsed) != len (self.input_hist_raw):
274 self.input_hist_raw[:] = self.input_hist_parsed
274 self.input_hist_raw[:] = self.input_hist_parsed
275
275
276 def reset(self):
276 def reset(self):
277 """Clear all histories managed by this object."""
277 """Clear all histories managed by this object."""
278 self.input_hist_parsed[:] = []
278 self.input_hist_parsed[:] = []
279 self.input_hist_raw[:] = []
279 self.input_hist_raw[:] = []
280 self.output_hist.clear()
280 self.output_hist.clear()
281 # The directory history can't be completely empty
281 # The directory history can't be completely empty
282 self.dir_hist[:] = [os.getcwd()]
282 self.dir_hist[:] = [os.getcwd()]
283
283
284 class HistorySaveThread(threading.Thread):
284 class HistorySaveThread(threading.Thread):
285 """This thread makes IPython save history periodically.
285 """This thread makes IPython save history periodically.
286
286
287 Without this class, IPython would only save the history on a clean exit.
287 Without this class, IPython would only save the history on a clean exit.
288 This saves the history periodically (the current default is once per
288 This saves the history periodically (the current default is once per
289 minute), so that it is not lost in the event of a crash.
289 minute), so that it is not lost in the event of a crash.
290
290
291 The implementation sets an event to indicate that history should be saved.
291 The implementation sets an event to indicate that history should be saved.
292 The actual save is carried out after executing a user command, to avoid
292 The actual save is carried out after executing a user command, to avoid
293 thread issues.
293 thread issues.
294 """
294 """
295 daemon = True
295 daemon = True
296
296
297 def __init__(self, autosave_flag, time_interval=60):
297 def __init__(self, autosave_flag, time_interval=60):
298 threading.Thread.__init__(self)
298 threading.Thread.__init__(self)
299 self.time_interval = time_interval
299 self.time_interval = time_interval
300 self.autosave_flag = autosave_flag
300 self.autosave_flag = autosave_flag
301 self.exit_now = threading.Event()
301 self.exit_now = threading.Event()
302 # Ensure the thread is stopped tidily when exiting normally
302 # Ensure the thread is stopped tidily when exiting normally
303 atexit.register(self.stop)
303 atexit.register(self.stop)
304
304
305 def run(self):
305 def run(self):
306 while True:
306 while True:
307 self.exit_now.wait(self.time_interval)
307 self.exit_now.wait(self.time_interval)
308 if self.exit_now.is_set():
308 if self.exit_now.is_set():
309 break
309 break
310 self.autosave_flag.set()
310 self.autosave_flag.set()
311
311
312 def stop(self):
312 def stop(self):
313 """Safely and quickly stop the autosave timer thread."""
313 """Safely and quickly stop the autosave timer thread."""
314 self.exit_now.set()
314 self.exit_now.set()
315 self.join()
315 self.join()
316
316
317 @testdec.skip_doctest
317 @testdec.skip_doctest
318 def magic_history(self, parameter_s = ''):
318 def magic_history(self, parameter_s = ''):
319 """Print input history (_i<n> variables), with most recent last.
319 """Print input history (_i<n> variables), with most recent last.
320
320
321 %history -> print at most 40 inputs (some may be multi-line)\\
321 %history -> print at most 40 inputs (some may be multi-line)\\
322 %history n -> print at most n inputs\\
322 %history n -> print at most n inputs\\
323 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
323 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
324
324
325 By default, input history is printed without line numbers so it can be
325 By default, input history is printed without line numbers so it can be
326 directly pasted into an editor.
326 directly pasted into an editor.
327
327
328 With -n, each input's number <n> is shown, and is accessible as the
328 With -n, each input's number <n> is shown, and is accessible as the
329 automatically generated variable _i<n> as well as In[<n>]. Multi-line
329 automatically generated variable _i<n> as well as In[<n>]. Multi-line
330 statements are printed starting at a new line for easy copy/paste.
330 statements are printed starting at a new line for easy copy/paste.
331
331
332 Options:
332 Options:
333
333
334 -n: print line numbers for each input.
334 -n: print line numbers for each input.
335 This feature is only available if numbered prompts are in use.
335 This feature is only available if numbered prompts are in use.
336
336
337 -o: also print outputs for each input.
337 -o: also print outputs for each input.
338
338
339 -p: print classic '>>>' python prompts before each input. This is useful
339 -p: print classic '>>>' python prompts before each input. This is useful
340 for making documentation, and in conjunction with -o, for producing
340 for making documentation, and in conjunction with -o, for producing
341 doctest-ready output.
341 doctest-ready output.
342
342
343 -r: (default) print the 'raw' history, i.e. the actual commands you typed.
343 -r: (default) print the 'raw' history, i.e. the actual commands you typed.
344
344
345 -t: print the 'translated' history, as IPython understands it. IPython
345 -t: print the 'translated' history, as IPython understands it. IPython
346 filters your input and converts it all into valid Python source before
346 filters your input and converts it all into valid Python source before
347 executing it (things like magics or aliases are turned into function
347 executing it (things like magics or aliases are turned into function
348 calls, for example). With this option, you'll see the native history
348 calls, for example). With this option, you'll see the native history
349 instead of the user-entered version: '%cd /' will be seen as
349 instead of the user-entered version: '%cd /' will be seen as
350 'get_ipython().magic("%cd /")' instead of '%cd /'.
350 'get_ipython().magic("%cd /")' instead of '%cd /'.
351
351
352 -g: treat the arg as a pattern to grep for in (full) history.
352 -g: treat the arg as a pattern to grep for in (full) history.
353 This includes the "shadow history" (almost all commands ever written).
353 This includes the "shadow history" (almost all commands ever written).
354 Use '%hist -g' to show full shadow history (may be very long).
354 Use '%hist -g' to show full shadow history (may be very long).
355 In shadow history, every index nuwber starts with 0.
355 In shadow history, every index nuwber starts with 0.
356
356
357 -f FILENAME: instead of printing the output to the screen, redirect it to
357 -f FILENAME: instead of printing the output to the screen, redirect it to
358 the given file. The file is always overwritten, though IPython asks for
358 the given file. The file is always overwritten, though IPython asks for
359 confirmation first if it already exists.
359 confirmation first if it already exists.
360
360
361 Examples
361 Examples
362 --------
362 --------
363 ::
363 ::
364
364
365 In [6]: %hist -n 4 6
365 In [6]: %hist -n 4 6
366 4:a = 12
366 4:a = 12
367 5:print a**2
367 5:print a**2
368
368
369 """
369 """
370
370
371 if not self.shell.displayhook.do_full_cache:
371 if not self.shell.displayhook.do_full_cache:
372 print('This feature is only available if numbered prompts are in use.')
372 print('This feature is only available if numbered prompts are in use.')
373 return
373 return
374 opts,args = self.parse_options(parameter_s,'gnoptsrf:',mode='list')
374 opts,args = self.parse_options(parameter_s,'gnoptsrf:',mode='list')
375
375
376 # For brevity
376 # For brevity
377 history_manager = self.shell.history_manager
377 history_manager = self.shell.history_manager
378
378
379 # Check if output to specific file was requested.
379 # Check if output to specific file was requested.
380 try:
380 try:
381 outfname = opts['f']
381 outfname = opts['f']
382 except KeyError:
382 except KeyError:
383 outfile = IPython.utils.io.Term.cout # default
383 outfile = IPython.utils.io.Term.cout # default
384 # We don't want to close stdout at the end!
384 # We don't want to close stdout at the end!
385 close_at_end = False
385 close_at_end = False
386 else:
386 else:
387 if os.path.exists(outfname):
387 if os.path.exists(outfname):
388 if not ask_yes_no("File %r exists. Overwrite?" % outfname):
388 if not ask_yes_no("File %r exists. Overwrite?" % outfname):
389 print('Aborting.')
389 print('Aborting.')
390 return
390 return
391
391
392 outfile = open(outfname,'w')
392 outfile = open(outfname,'w')
393 close_at_end = True
393 close_at_end = True
394
394
395 print_nums = 'n' in opts
395 print_nums = 'n' in opts
396 print_outputs = 'o' in opts
396 print_outputs = 'o' in opts
397 pyprompts = 'p' in opts
397 pyprompts = 'p' in opts
398 # Raw history is the default
398 # Raw history is the default
399 raw = not('t' in opts)
399 raw = not('t' in opts)
400
400
401 default_length = 40
401 default_length = 40
402 pattern = None
402 pattern = None
403 if 'g' in opts:
403 if 'g' in opts:
404 index = None
404 index = None
405 parts = parameter_s.split(None, 1)
405 parts = parameter_s.split(None, 1)
406 if len(parts) == 1:
406 if len(parts) == 1:
407 parts += '*'
407 parts += '*'
408 head, pattern = parts
408 head, pattern = parts
409 pattern = "*" + pattern + "*"
409 pattern = "*" + pattern + "*"
410 elif len(args) == 0:
410 elif len(args) == 0:
411 index = None
411 index = None
412 elif len(args) == 1:
412 elif len(args) == 1:
413 index = int(args[0])
413 index = int(args[0])
414 elif len(args) == 2:
414 elif len(args) == 2:
415 index = map(int, args)
415 index = map(int, args)
416 else:
416 else:
417 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
417 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
418 print(self.magic_hist.__doc__, file=IPython.utils.io.Term.cout)
418 print(self.magic_hist.__doc__, file=IPython.utils.io.Term.cout)
419 return
419 return
420
420
421 hist = history_manager.get_history(index, raw, print_outputs)
421 hist = history_manager.get_history(index, raw, print_outputs)
422
422
423 width = len(str(max(hist.iterkeys())))
423 width = len(str(max(hist.iterkeys())))
424 line_sep = ['','\n']
424 line_sep = ['','\n']
425
425
426 found = False
426 found = False
427 if pattern is not None:
427 if pattern is not None:
428 sh = history_manager.shadow_hist.all()
428 sh = history_manager.shadow_hist.all()
429 for idx, s in sh:
429 for idx, s in sh:
430 if fnmatch.fnmatch(s, pattern):
430 if fnmatch.fnmatch(s, pattern):
431 print("0%d: %s" %(idx, s.expandtabs(4)), file=outfile)
431 print("0%d: %s" %(idx, s.expandtabs(4)), file=outfile)
432 found = True
432 found = True
433
433
434 if found:
434 if found:
435 print("===", file=outfile)
435 print("===", file=outfile)
436 print("shadow history ends, fetch by %rep <number> (must start with 0)",
436 print("shadow history ends, fetch by %rep <number> (must start with 0)",
437 file=outfile)
437 file=outfile)
438 print("=== start of normal history ===", file=outfile)
438 print("=== start of normal history ===", file=outfile)
439
439
440 for in_num, inline in sorted(hist.iteritems()):
440 for in_num, inline in sorted(hist.iteritems()):
441 # Print user history with tabs expanded to 4 spaces. The GUI clients
441 # Print user history with tabs expanded to 4 spaces. The GUI clients
442 # use hard tabs for easier usability in auto-indented code, but we want
442 # use hard tabs for easier usability in auto-indented code, but we want
443 # to produce PEP-8 compliant history for safe pasting into an editor.
443 # to produce PEP-8 compliant history for safe pasting into an editor.
444 if print_outputs:
444 if print_outputs:
445 inline, output = inline
445 inline, output = inline
446 inline = inline.expandtabs(4).rstrip()
446 inline = inline.expandtabs(4).rstrip()
447
447
448 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
448 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
449 continue
449 continue
450
450
451 multiline = "\n" in inline
451 multiline = "\n" in inline
452 if print_nums:
452 if print_nums:
453 print('%s:%s' % (str(in_num).ljust(width), line_sep[multiline]),
453 print('%s:%s' % (str(in_num).ljust(width), line_sep[multiline]),
454 file=outfile, end='')
454 file=outfile, end='')
455 if pyprompts:
455 if pyprompts:
456 inline = ">>> " + inline
456 print(">>> ", end="", file=outfile)
457 if multiline:
457 if multiline:
458 lines = inline.splitlines()
458 inline = "\n... ".join(inline.splitlines()) + "\n..."
459 print('\n... '.join(lines), file=outfile)
459 print(inline, file=outfile)
460 print('... ', file=outfile)
461 else:
462 print(inline, file=outfile)
463 else:
464 print(inline, file=outfile)
465 if print_outputs and output:
460 if print_outputs and output:
466 print(repr(output), file=outfile)
461 print(repr(output), file=outfile)
467
462
468 if close_at_end:
463 if close_at_end:
469 outfile.close()
464 outfile.close()
470
465
471 # %hist is an alternative name
466 # %hist is an alternative name
472 magic_hist = magic_history
467 magic_hist = magic_history
473
468
474
469
475 def rep_f(self, arg):
470 def rep_f(self, arg):
476 r""" Repeat a command, or get command to input line for editing
471 r""" Repeat a command, or get command to input line for editing
477
472
478 - %rep (no arguments):
473 - %rep (no arguments):
479
474
480 Place a string version of last computation result (stored in the special '_'
475 Place a string version of last computation result (stored in the special '_'
481 variable) to the next input prompt. Allows you to create elaborate command
476 variable) to the next input prompt. Allows you to create elaborate command
482 lines without using copy-paste::
477 lines without using copy-paste::
483
478
484 $ l = ["hei", "vaan"]
479 $ l = ["hei", "vaan"]
485 $ "".join(l)
480 $ "".join(l)
486 ==> heivaan
481 ==> heivaan
487 $ %rep
482 $ %rep
488 $ heivaan_ <== cursor blinking
483 $ heivaan_ <== cursor blinking
489
484
490 %rep 45
485 %rep 45
491
486
492 Place history line 45 to next input prompt. Use %hist to find out the
487 Place history line 45 to next input prompt. Use %hist to find out the
493 number.
488 number.
494
489
495 %rep 1-4 6-7 3
490 %rep 1-4 6-7 3
496
491
497 Repeat the specified lines immediately. Input slice syntax is the same as
492 Repeat the specified lines immediately. Input slice syntax is the same as
498 in %macro and %save.
493 in %macro and %save.
499
494
500 %rep foo
495 %rep foo
501
496
502 Place the most recent line that has the substring "foo" to next input.
497 Place the most recent line that has the substring "foo" to next input.
503 (e.g. 'svn ci -m foobar').
498 (e.g. 'svn ci -m foobar').
504 """
499 """
505
500
506 opts,args = self.parse_options(arg,'',mode='list')
501 opts,args = self.parse_options(arg,'',mode='list')
507 if not args:
502 if not args:
508 self.set_next_input(str(self.shell.user_ns["_"]))
503 self.set_next_input(str(self.shell.user_ns["_"]))
509 return
504 return
510
505
511 if len(args) == 1 and not '-' in args[0]:
506 if len(args) == 1 and not '-' in args[0]:
512 arg = args[0]
507 arg = args[0]
513 if len(arg) > 1 and arg.startswith('0'):
508 if len(arg) > 1 and arg.startswith('0'):
514 # get from shadow hist
509 # get from shadow hist
515 num = int(arg[1:])
510 num = int(arg[1:])
516 line = self.shell.shadowhist.get(num)
511 line = self.shell.shadowhist.get(num)
517 self.set_next_input(str(line))
512 self.set_next_input(str(line))
518 return
513 return
519 try:
514 try:
520 num = int(args[0])
515 num = int(args[0])
521 self.set_next_input(str(self.shell.input_hist_raw[num]).rstrip())
516 self.set_next_input(str(self.shell.input_hist_raw[num]).rstrip())
522 return
517 return
523 except ValueError:
518 except ValueError:
524 pass
519 pass
525
520
526 for h in reversed(self.shell.input_hist_raw):
521 for h in reversed(self.shell.input_hist_raw):
527 if 'rep' in h:
522 if 'rep' in h:
528 continue
523 continue
529 if fnmatch.fnmatch(h,'*' + arg + '*'):
524 if fnmatch.fnmatch(h,'*' + arg + '*'):
530 self.set_next_input(str(h).rstrip())
525 self.set_next_input(str(h).rstrip())
531 return
526 return
532
527
533 try:
528 try:
534 lines = self.extract_input_slices(args, True)
529 lines = self.extract_input_slices(args, True)
535 print("lines", lines)
530 print("lines", lines)
536 self.run_cell(lines)
531 self.run_cell(lines)
537 except ValueError:
532 except ValueError:
538 print("Not found in recent history:", args)
533 print("Not found in recent history:", args)
539
534
540
535
541 _sentinel = object()
536 _sentinel = object()
542
537
543 class ShadowHist(object):
538 class ShadowHist(object):
544 def __init__(self, db, shell):
539 def __init__(self, db, shell):
545 # cmd => idx mapping
540 # cmd => idx mapping
546 self.curidx = 0
541 self.curidx = 0
547 self.db = db
542 self.db = db
548 self.disabled = False
543 self.disabled = False
549 self.shell = shell
544 self.shell = shell
550
545
551 def inc_idx(self):
546 def inc_idx(self):
552 idx = self.db.get('shadowhist_idx', 1)
547 idx = self.db.get('shadowhist_idx', 1)
553 self.db['shadowhist_idx'] = idx + 1
548 self.db['shadowhist_idx'] = idx + 1
554 return idx
549 return idx
555
550
556 def add(self, ent):
551 def add(self, ent):
557 if self.disabled:
552 if self.disabled:
558 return
553 return
559 try:
554 try:
560 old = self.db.hget('shadowhist', ent, _sentinel)
555 old = self.db.hget('shadowhist', ent, _sentinel)
561 if old is not _sentinel:
556 if old is not _sentinel:
562 return
557 return
563 newidx = self.inc_idx()
558 newidx = self.inc_idx()
564 #print("new", newidx) # dbg
559 #print("new", newidx) # dbg
565 self.db.hset('shadowhist',ent, newidx)
560 self.db.hset('shadowhist',ent, newidx)
566 except:
561 except:
567 self.shell.showtraceback()
562 self.shell.showtraceback()
568 print("WARNING: disabling shadow history")
563 print("WARNING: disabling shadow history")
569 self.disabled = True
564 self.disabled = True
570
565
571 def all(self):
566 def all(self):
572 d = self.db.hdict('shadowhist')
567 d = self.db.hdict('shadowhist')
573 items = [(i,s) for (s,i) in d.iteritems()]
568 items = [(i,s) for (s,i) in d.iteritems()]
574 items.sort()
569 items.sort()
575 return items
570 return items
576
571
577 def get(self, idx):
572 def get(self, idx):
578 all = self.all()
573 all = self.all()
579
574
580 for k, v in all:
575 for k, v in all:
581 if k == idx:
576 if k == idx:
582 return v
577 return v
583
578
584
579
585 def init_ipython(ip):
580 def init_ipython(ip):
586 ip.define_magic("rep",rep_f)
581 ip.define_magic("rep",rep_f)
587 ip.define_magic("hist",magic_hist)
582 ip.define_magic("hist",magic_hist)
588 ip.define_magic("history",magic_history)
583 ip.define_magic("history",magic_history)
589
584
590 # XXX - ipy_completers are in quarantine, need to be updated to new apis
585 # XXX - ipy_completers are in quarantine, need to be updated to new apis
591 #import ipy_completers
586 #import ipy_completers
592 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
587 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
@@ -1,3506 +1,3502 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3 """
3 """
4
4
5 #-----------------------------------------------------------------------------
5 #-----------------------------------------------------------------------------
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
7 # Copyright (C) 2001-2007 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2008-2009 The IPython Development Team
8 # Copyright (C) 2008-2009 The IPython Development Team
9
9
10 # Distributed under the terms of the BSD License. The full license is in
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
11 # the file COPYING, distributed as part of this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 import __builtin__
18 import __builtin__
19 import __future__
19 import __future__
20 import bdb
20 import bdb
21 import inspect
21 import inspect
22 import os
22 import os
23 import sys
23 import sys
24 import shutil
24 import shutil
25 import re
25 import re
26 import time
26 import time
27 import textwrap
27 import textwrap
28 import types
28 import types
29 from cStringIO import StringIO
29 from cStringIO import StringIO
30 from getopt import getopt,GetoptError
30 from getopt import getopt,GetoptError
31 from pprint import pformat
31 from pprint import pformat
32
32
33 # cProfile was added in Python2.5
33 # cProfile was added in Python2.5
34 try:
34 try:
35 import cProfile as profile
35 import cProfile as profile
36 import pstats
36 import pstats
37 except ImportError:
37 except ImportError:
38 # profile isn't bundled by default in Debian for license reasons
38 # profile isn't bundled by default in Debian for license reasons
39 try:
39 try:
40 import profile,pstats
40 import profile,pstats
41 except ImportError:
41 except ImportError:
42 profile = pstats = None
42 profile = pstats = None
43
43
44 import IPython
44 import IPython
45 from IPython.core import debugger, oinspect
45 from IPython.core import debugger, oinspect
46 from IPython.core.error import TryNext
46 from IPython.core.error import TryNext
47 from IPython.core.error import UsageError
47 from IPython.core.error import UsageError
48 from IPython.core.fakemodule import FakeModule
48 from IPython.core.fakemodule import FakeModule
49 from IPython.core.macro import Macro
49 from IPython.core.macro import Macro
50 from IPython.core import page
50 from IPython.core import page
51 from IPython.core.prefilter import ESC_MAGIC
51 from IPython.core.prefilter import ESC_MAGIC
52 from IPython.lib.pylabtools import mpl_runner
52 from IPython.lib.pylabtools import mpl_runner
53 from IPython.external.Itpl import itpl, printpl
53 from IPython.external.Itpl import itpl, printpl
54 from IPython.testing import decorators as testdec
54 from IPython.testing import decorators as testdec
55 from IPython.utils.io import file_read, nlprint
55 from IPython.utils.io import file_read, nlprint
56 import IPython.utils.io
56 import IPython.utils.io
57 from IPython.utils.path import get_py_filename
57 from IPython.utils.path import get_py_filename
58 from IPython.utils.process import arg_split, abbrev_cwd
58 from IPython.utils.process import arg_split, abbrev_cwd
59 from IPython.utils.terminal import set_term_title
59 from IPython.utils.terminal import set_term_title
60 from IPython.utils.text import LSString, SList, StringTypes, format_screen
60 from IPython.utils.text import LSString, SList, format_screen
61 from IPython.utils.timing import clock, clock2
61 from IPython.utils.timing import clock, clock2
62 from IPython.utils.warn import warn, error
62 from IPython.utils.warn import warn, error
63 from IPython.utils.ipstruct import Struct
63 from IPython.utils.ipstruct import Struct
64 import IPython.utils.generics
64 import IPython.utils.generics
65
65
66 #-----------------------------------------------------------------------------
66 #-----------------------------------------------------------------------------
67 # Utility functions
67 # Utility functions
68 #-----------------------------------------------------------------------------
68 #-----------------------------------------------------------------------------
69
69
70 def on_off(tag):
70 def on_off(tag):
71 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
71 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
72 return ['OFF','ON'][tag]
72 return ['OFF','ON'][tag]
73
73
74 class Bunch: pass
74 class Bunch: pass
75
75
76 def compress_dhist(dh):
76 def compress_dhist(dh):
77 head, tail = dh[:-10], dh[-10:]
77 head, tail = dh[:-10], dh[-10:]
78
78
79 newhead = []
79 newhead = []
80 done = set()
80 done = set()
81 for h in head:
81 for h in head:
82 if h in done:
82 if h in done:
83 continue
83 continue
84 newhead.append(h)
84 newhead.append(h)
85 done.add(h)
85 done.add(h)
86
86
87 return newhead + tail
87 return newhead + tail
88
88
89
89
90 #***************************************************************************
90 #***************************************************************************
91 # Main class implementing Magic functionality
91 # Main class implementing Magic functionality
92
92
93 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
93 # XXX - for some odd reason, if Magic is made a new-style class, we get errors
94 # on construction of the main InteractiveShell object. Something odd is going
94 # on construction of the main InteractiveShell object. Something odd is going
95 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
95 # on with super() calls, Configurable and the MRO... For now leave it as-is, but
96 # eventually this needs to be clarified.
96 # eventually this needs to be clarified.
97 # BG: This is because InteractiveShell inherits from this, but is itself a
97 # BG: This is because InteractiveShell inherits from this, but is itself a
98 # Configurable. This messes up the MRO in some way. The fix is that we need to
98 # Configurable. This messes up the MRO in some way. The fix is that we need to
99 # make Magic a configurable that InteractiveShell does not subclass.
99 # make Magic a configurable that InteractiveShell does not subclass.
100
100
101 class Magic:
101 class Magic:
102 """Magic functions for InteractiveShell.
102 """Magic functions for InteractiveShell.
103
103
104 Shell functions which can be reached as %function_name. All magic
104 Shell functions which can be reached as %function_name. All magic
105 functions should accept a string, which they can parse for their own
105 functions should accept a string, which they can parse for their own
106 needs. This can make some functions easier to type, eg `%cd ../`
106 needs. This can make some functions easier to type, eg `%cd ../`
107 vs. `%cd("../")`
107 vs. `%cd("../")`
108
108
109 ALL definitions MUST begin with the prefix magic_. The user won't need it
109 ALL definitions MUST begin with the prefix magic_. The user won't need it
110 at the command line, but it is is needed in the definition. """
110 at the command line, but it is is needed in the definition. """
111
111
112 # class globals
112 # class globals
113 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
113 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
114 'Automagic is ON, % prefix NOT needed for magic functions.']
114 'Automagic is ON, % prefix NOT needed for magic functions.']
115
115
116 #......................................................................
116 #......................................................................
117 # some utility functions
117 # some utility functions
118
118
119 def __init__(self,shell):
119 def __init__(self,shell):
120
120
121 self.options_table = {}
121 self.options_table = {}
122 if profile is None:
122 if profile is None:
123 self.magic_prun = self.profile_missing_notice
123 self.magic_prun = self.profile_missing_notice
124 self.shell = shell
124 self.shell = shell
125
125
126 # namespace for holding state we may need
126 # namespace for holding state we may need
127 self._magic_state = Bunch()
127 self._magic_state = Bunch()
128
128
129 def profile_missing_notice(self, *args, **kwargs):
129 def profile_missing_notice(self, *args, **kwargs):
130 error("""\
130 error("""\
131 The profile module could not be found. It has been removed from the standard
131 The profile module could not be found. It has been removed from the standard
132 python packages because of its non-free license. To use profiling, install the
132 python packages because of its non-free license. To use profiling, install the
133 python-profiler package from non-free.""")
133 python-profiler package from non-free.""")
134
134
135 def default_option(self,fn,optstr):
135 def default_option(self,fn,optstr):
136 """Make an entry in the options_table for fn, with value optstr"""
136 """Make an entry in the options_table for fn, with value optstr"""
137
137
138 if fn not in self.lsmagic():
138 if fn not in self.lsmagic():
139 error("%s is not a magic function" % fn)
139 error("%s is not a magic function" % fn)
140 self.options_table[fn] = optstr
140 self.options_table[fn] = optstr
141
141
142 def lsmagic(self):
142 def lsmagic(self):
143 """Return a list of currently available magic functions.
143 """Return a list of currently available magic functions.
144
144
145 Gives a list of the bare names after mangling (['ls','cd', ...], not
145 Gives a list of the bare names after mangling (['ls','cd', ...], not
146 ['magic_ls','magic_cd',...]"""
146 ['magic_ls','magic_cd',...]"""
147
147
148 # FIXME. This needs a cleanup, in the way the magics list is built.
148 # FIXME. This needs a cleanup, in the way the magics list is built.
149
149
150 # magics in class definition
150 # magics in class definition
151 class_magic = lambda fn: fn.startswith('magic_') and \
151 class_magic = lambda fn: fn.startswith('magic_') and \
152 callable(Magic.__dict__[fn])
152 callable(Magic.__dict__[fn])
153 # in instance namespace (run-time user additions)
153 # in instance namespace (run-time user additions)
154 inst_magic = lambda fn: fn.startswith('magic_') and \
154 inst_magic = lambda fn: fn.startswith('magic_') and \
155 callable(self.__dict__[fn])
155 callable(self.__dict__[fn])
156 # and bound magics by user (so they can access self):
156 # and bound magics by user (so they can access self):
157 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
157 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
158 callable(self.__class__.__dict__[fn])
158 callable(self.__class__.__dict__[fn])
159 magics = filter(class_magic,Magic.__dict__.keys()) + \
159 magics = filter(class_magic,Magic.__dict__.keys()) + \
160 filter(inst_magic,self.__dict__.keys()) + \
160 filter(inst_magic,self.__dict__.keys()) + \
161 filter(inst_bound_magic,self.__class__.__dict__.keys())
161 filter(inst_bound_magic,self.__class__.__dict__.keys())
162 out = []
162 out = []
163 for fn in set(magics):
163 for fn in set(magics):
164 out.append(fn.replace('magic_','',1))
164 out.append(fn.replace('magic_','',1))
165 out.sort()
165 out.sort()
166 return out
166 return out
167
167
168 def extract_input_slices(self,slices,raw=False):
168 def extract_input_slices(self,slices,raw=False):
169 """Return as a string a set of input history slices.
169 """Return as a string a set of input history slices.
170
170
171 Inputs:
171 Inputs:
172
172
173 - slices: the set of slices is given as a list of strings (like
173 - slices: the set of slices is given as a list of strings (like
174 ['1','4:8','9'], since this function is for use by magic functions
174 ['1','4:8','9'], since this function is for use by magic functions
175 which get their arguments as strings.
175 which get their arguments as strings.
176
176
177 Optional inputs:
177 Optional inputs:
178
178
179 - raw(False): by default, the processed input is used. If this is
179 - raw(False): by default, the processed input is used. If this is
180 true, the raw input history is used instead.
180 true, the raw input history is used instead.
181
181
182 Note that slices can be called with two notations:
182 Note that slices can be called with two notations:
183
183
184 N:M -> standard python form, means including items N...(M-1).
184 N:M -> standard python form, means including items N...(M-1).
185
185
186 N-M -> include items N..M (closed endpoint)."""
186 N-M -> include items N..M (closed endpoint)."""
187 history_manager = self.shell.history_manager
187 history_manager = self.shell.history_manager
188
188
189 cmds = []
189 cmds = []
190 for chunk in slices:
190 for chunk in slices:
191 if ':' in chunk:
191 if ':' in chunk:
192 ini,fin = map(int,chunk.split(':'))
192 ini,fin = map(int,chunk.split(':'))
193 elif '-' in chunk:
193 elif '-' in chunk:
194 ini,fin = map(int,chunk.split('-'))
194 ini,fin = map(int,chunk.split('-'))
195 fin += 1
195 fin += 1
196 else:
196 else:
197 ini = int(chunk)
197 ini = int(chunk)
198 fin = ini+1
198 fin = ini+1
199 hist = history_manager.get_history((ini,fin), raw=raw, output=False)
199 hist = history_manager.get_history((ini,fin), raw=raw, output=False)
200 cmds.append('\n'.join(hist[i] for i in sorted(hist.iterkeys())))
200 cmds.append('\n'.join(hist[i] for i in sorted(hist.iterkeys())))
201 return cmds
201 return cmds
202
202
203 def arg_err(self,func):
203 def arg_err(self,func):
204 """Print docstring if incorrect arguments were passed"""
204 """Print docstring if incorrect arguments were passed"""
205 print 'Error in arguments:'
205 print 'Error in arguments:'
206 print oinspect.getdoc(func)
206 print oinspect.getdoc(func)
207
207
208 def format_latex(self,strng):
208 def format_latex(self,strng):
209 """Format a string for latex inclusion."""
209 """Format a string for latex inclusion."""
210
210
211 # Characters that need to be escaped for latex:
211 # Characters that need to be escaped for latex:
212 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
212 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
213 # Magic command names as headers:
213 # Magic command names as headers:
214 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
214 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
215 re.MULTILINE)
215 re.MULTILINE)
216 # Magic commands
216 # Magic commands
217 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
217 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
218 re.MULTILINE)
218 re.MULTILINE)
219 # Paragraph continue
219 # Paragraph continue
220 par_re = re.compile(r'\\$',re.MULTILINE)
220 par_re = re.compile(r'\\$',re.MULTILINE)
221
221
222 # The "\n" symbol
222 # The "\n" symbol
223 newline_re = re.compile(r'\\n')
223 newline_re = re.compile(r'\\n')
224
224
225 # Now build the string for output:
225 # Now build the string for output:
226 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
226 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
227 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
227 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
228 strng)
228 strng)
229 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
229 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
230 strng = par_re.sub(r'\\\\',strng)
230 strng = par_re.sub(r'\\\\',strng)
231 strng = escape_re.sub(r'\\\1',strng)
231 strng = escape_re.sub(r'\\\1',strng)
232 strng = newline_re.sub(r'\\textbackslash{}n',strng)
232 strng = newline_re.sub(r'\\textbackslash{}n',strng)
233 return strng
233 return strng
234
234
235 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
235 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
236 """Parse options passed to an argument string.
236 """Parse options passed to an argument string.
237
237
238 The interface is similar to that of getopt(), but it returns back a
238 The interface is similar to that of getopt(), but it returns back a
239 Struct with the options as keys and the stripped argument string still
239 Struct with the options as keys and the stripped argument string still
240 as a string.
240 as a string.
241
241
242 arg_str is quoted as a true sys.argv vector by using shlex.split.
242 arg_str is quoted as a true sys.argv vector by using shlex.split.
243 This allows us to easily expand variables, glob files, quote
243 This allows us to easily expand variables, glob files, quote
244 arguments, etc.
244 arguments, etc.
245
245
246 Options:
246 Options:
247 -mode: default 'string'. If given as 'list', the argument string is
247 -mode: default 'string'. If given as 'list', the argument string is
248 returned as a list (split on whitespace) instead of a string.
248 returned as a list (split on whitespace) instead of a string.
249
249
250 -list_all: put all option values in lists. Normally only options
250 -list_all: put all option values in lists. Normally only options
251 appearing more than once are put in a list.
251 appearing more than once are put in a list.
252
252
253 -posix (True): whether to split the input line in POSIX mode or not,
253 -posix (True): whether to split the input line in POSIX mode or not,
254 as per the conventions outlined in the shlex module from the
254 as per the conventions outlined in the shlex module from the
255 standard library."""
255 standard library."""
256
256
257 # inject default options at the beginning of the input line
257 # inject default options at the beginning of the input line
258 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
258 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
259 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
259 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
260
260
261 mode = kw.get('mode','string')
261 mode = kw.get('mode','string')
262 if mode not in ['string','list']:
262 if mode not in ['string','list']:
263 raise ValueError,'incorrect mode given: %s' % mode
263 raise ValueError,'incorrect mode given: %s' % mode
264 # Get options
264 # Get options
265 list_all = kw.get('list_all',0)
265 list_all = kw.get('list_all',0)
266 posix = kw.get('posix', os.name == 'posix')
266 posix = kw.get('posix', os.name == 'posix')
267
267
268 # Check if we have more than one argument to warrant extra processing:
268 # Check if we have more than one argument to warrant extra processing:
269 odict = {} # Dictionary with options
269 odict = {} # Dictionary with options
270 args = arg_str.split()
270 args = arg_str.split()
271 if len(args) >= 1:
271 if len(args) >= 1:
272 # If the list of inputs only has 0 or 1 thing in it, there's no
272 # If the list of inputs only has 0 or 1 thing in it, there's no
273 # need to look for options
273 # need to look for options
274 argv = arg_split(arg_str,posix)
274 argv = arg_split(arg_str,posix)
275 # Do regular option processing
275 # Do regular option processing
276 try:
276 try:
277 opts,args = getopt(argv,opt_str,*long_opts)
277 opts,args = getopt(argv,opt_str,*long_opts)
278 except GetoptError,e:
278 except GetoptError,e:
279 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
279 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
280 " ".join(long_opts)))
280 " ".join(long_opts)))
281 for o,a in opts:
281 for o,a in opts:
282 if o.startswith('--'):
282 if o.startswith('--'):
283 o = o[2:]
283 o = o[2:]
284 else:
284 else:
285 o = o[1:]
285 o = o[1:]
286 try:
286 try:
287 odict[o].append(a)
287 odict[o].append(a)
288 except AttributeError:
288 except AttributeError:
289 odict[o] = [odict[o],a]
289 odict[o] = [odict[o],a]
290 except KeyError:
290 except KeyError:
291 if list_all:
291 if list_all:
292 odict[o] = [a]
292 odict[o] = [a]
293 else:
293 else:
294 odict[o] = a
294 odict[o] = a
295
295
296 # Prepare opts,args for return
296 # Prepare opts,args for return
297 opts = Struct(odict)
297 opts = Struct(odict)
298 if mode == 'string':
298 if mode == 'string':
299 args = ' '.join(args)
299 args = ' '.join(args)
300
300
301 return opts,args
301 return opts,args
302
302
303 #......................................................................
303 #......................................................................
304 # And now the actual magic functions
304 # And now the actual magic functions
305
305
306 # Functions for IPython shell work (vars,funcs, config, etc)
306 # Functions for IPython shell work (vars,funcs, config, etc)
307 def magic_lsmagic(self, parameter_s = ''):
307 def magic_lsmagic(self, parameter_s = ''):
308 """List currently available magic functions."""
308 """List currently available magic functions."""
309 mesc = ESC_MAGIC
309 mesc = ESC_MAGIC
310 print 'Available magic functions:\n'+mesc+\
310 print 'Available magic functions:\n'+mesc+\
311 (' '+mesc).join(self.lsmagic())
311 (' '+mesc).join(self.lsmagic())
312 print '\n' + Magic.auto_status[self.shell.automagic]
312 print '\n' + Magic.auto_status[self.shell.automagic]
313 return None
313 return None
314
314
315 def magic_magic(self, parameter_s = ''):
315 def magic_magic(self, parameter_s = ''):
316 """Print information about the magic function system.
316 """Print information about the magic function system.
317
317
318 Supported formats: -latex, -brief, -rest
318 Supported formats: -latex, -brief, -rest
319 """
319 """
320
320
321 mode = ''
321 mode = ''
322 try:
322 try:
323 if parameter_s.split()[0] == '-latex':
323 if parameter_s.split()[0] == '-latex':
324 mode = 'latex'
324 mode = 'latex'
325 if parameter_s.split()[0] == '-brief':
325 if parameter_s.split()[0] == '-brief':
326 mode = 'brief'
326 mode = 'brief'
327 if parameter_s.split()[0] == '-rest':
327 if parameter_s.split()[0] == '-rest':
328 mode = 'rest'
328 mode = 'rest'
329 rest_docs = []
329 rest_docs = []
330 except:
330 except:
331 pass
331 pass
332
332
333 magic_docs = []
333 magic_docs = []
334 for fname in self.lsmagic():
334 for fname in self.lsmagic():
335 mname = 'magic_' + fname
335 mname = 'magic_' + fname
336 for space in (Magic,self,self.__class__):
336 for space in (Magic,self,self.__class__):
337 try:
337 try:
338 fn = space.__dict__[mname]
338 fn = space.__dict__[mname]
339 except KeyError:
339 except KeyError:
340 pass
340 pass
341 else:
341 else:
342 break
342 break
343 if mode == 'brief':
343 if mode == 'brief':
344 # only first line
344 # only first line
345 if fn.__doc__:
345 if fn.__doc__:
346 fndoc = fn.__doc__.split('\n',1)[0]
346 fndoc = fn.__doc__.split('\n',1)[0]
347 else:
347 else:
348 fndoc = 'No documentation'
348 fndoc = 'No documentation'
349 else:
349 else:
350 if fn.__doc__:
350 if fn.__doc__:
351 fndoc = fn.__doc__.rstrip()
351 fndoc = fn.__doc__.rstrip()
352 else:
352 else:
353 fndoc = 'No documentation'
353 fndoc = 'No documentation'
354
354
355
355
356 if mode == 'rest':
356 if mode == 'rest':
357 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
357 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(ESC_MAGIC,
358 fname,fndoc))
358 fname,fndoc))
359
359
360 else:
360 else:
361 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
361 magic_docs.append('%s%s:\n\t%s\n' %(ESC_MAGIC,
362 fname,fndoc))
362 fname,fndoc))
363
363
364 magic_docs = ''.join(magic_docs)
364 magic_docs = ''.join(magic_docs)
365
365
366 if mode == 'rest':
366 if mode == 'rest':
367 return "".join(rest_docs)
367 return "".join(rest_docs)
368
368
369 if mode == 'latex':
369 if mode == 'latex':
370 print self.format_latex(magic_docs)
370 print self.format_latex(magic_docs)
371 return
371 return
372 else:
372 else:
373 magic_docs = format_screen(magic_docs)
373 magic_docs = format_screen(magic_docs)
374 if mode == 'brief':
374 if mode == 'brief':
375 return magic_docs
375 return magic_docs
376
376
377 outmsg = """
377 outmsg = """
378 IPython's 'magic' functions
378 IPython's 'magic' functions
379 ===========================
379 ===========================
380
380
381 The magic function system provides a series of functions which allow you to
381 The magic function system provides a series of functions which allow you to
382 control the behavior of IPython itself, plus a lot of system-type
382 control the behavior of IPython itself, plus a lot of system-type
383 features. All these functions are prefixed with a % character, but parameters
383 features. All these functions are prefixed with a % character, but parameters
384 are given without parentheses or quotes.
384 are given without parentheses or quotes.
385
385
386 NOTE: If you have 'automagic' enabled (via the command line option or with the
386 NOTE: If you have 'automagic' enabled (via the command line option or with the
387 %automagic function), you don't need to type in the % explicitly. By default,
387 %automagic function), you don't need to type in the % explicitly. By default,
388 IPython ships with automagic on, so you should only rarely need the % escape.
388 IPython ships with automagic on, so you should only rarely need the % escape.
389
389
390 Example: typing '%cd mydir' (without the quotes) changes you working directory
390 Example: typing '%cd mydir' (without the quotes) changes you working directory
391 to 'mydir', if it exists.
391 to 'mydir', if it exists.
392
392
393 You can define your own magic functions to extend the system. See the supplied
393 You can define your own magic functions to extend the system. See the supplied
394 ipythonrc and example-magic.py files for details (in your ipython
394 ipythonrc and example-magic.py files for details (in your ipython
395 configuration directory, typically $HOME/.config/ipython on Linux or $HOME/.ipython elsewhere).
395 configuration directory, typically $HOME/.config/ipython on Linux or $HOME/.ipython elsewhere).
396
396
397 You can also define your own aliased names for magic functions. In your
397 You can also define your own aliased names for magic functions. In your
398 ipythonrc file, placing a line like:
398 ipythonrc file, placing a line like:
399
399
400 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
400 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
401
401
402 will define %pf as a new name for %profile.
402 will define %pf as a new name for %profile.
403
403
404 You can also call magics in code using the magic() function, which IPython
404 You can also call magics in code using the magic() function, which IPython
405 automatically adds to the builtin namespace. Type 'magic?' for details.
405 automatically adds to the builtin namespace. Type 'magic?' for details.
406
406
407 For a list of the available magic functions, use %lsmagic. For a description
407 For a list of the available magic functions, use %lsmagic. For a description
408 of any of them, type %magic_name?, e.g. '%cd?'.
408 of any of them, type %magic_name?, e.g. '%cd?'.
409
409
410 Currently the magic system has the following functions:\n"""
410 Currently the magic system has the following functions:\n"""
411
411
412 mesc = ESC_MAGIC
412 mesc = ESC_MAGIC
413 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
413 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
414 "\n\n%s%s\n\n%s" % (outmsg,
414 "\n\n%s%s\n\n%s" % (outmsg,
415 magic_docs,mesc,mesc,
415 magic_docs,mesc,mesc,
416 (' '+mesc).join(self.lsmagic()),
416 (' '+mesc).join(self.lsmagic()),
417 Magic.auto_status[self.shell.automagic] ) )
417 Magic.auto_status[self.shell.automagic] ) )
418 page.page(outmsg)
418 page.page(outmsg)
419
419
420 def magic_automagic(self, parameter_s = ''):
420 def magic_automagic(self, parameter_s = ''):
421 """Make magic functions callable without having to type the initial %.
421 """Make magic functions callable without having to type the initial %.
422
422
423 Without argumentsl toggles on/off (when off, you must call it as
423 Without argumentsl toggles on/off (when off, you must call it as
424 %automagic, of course). With arguments it sets the value, and you can
424 %automagic, of course). With arguments it sets the value, and you can
425 use any of (case insensitive):
425 use any of (case insensitive):
426
426
427 - on,1,True: to activate
427 - on,1,True: to activate
428
428
429 - off,0,False: to deactivate.
429 - off,0,False: to deactivate.
430
430
431 Note that magic functions have lowest priority, so if there's a
431 Note that magic functions have lowest priority, so if there's a
432 variable whose name collides with that of a magic fn, automagic won't
432 variable whose name collides with that of a magic fn, automagic won't
433 work for that function (you get the variable instead). However, if you
433 work for that function (you get the variable instead). However, if you
434 delete the variable (del var), the previously shadowed magic function
434 delete the variable (del var), the previously shadowed magic function
435 becomes visible to automagic again."""
435 becomes visible to automagic again."""
436
436
437 arg = parameter_s.lower()
437 arg = parameter_s.lower()
438 if parameter_s in ('on','1','true'):
438 if parameter_s in ('on','1','true'):
439 self.shell.automagic = True
439 self.shell.automagic = True
440 elif parameter_s in ('off','0','false'):
440 elif parameter_s in ('off','0','false'):
441 self.shell.automagic = False
441 self.shell.automagic = False
442 else:
442 else:
443 self.shell.automagic = not self.shell.automagic
443 self.shell.automagic = not self.shell.automagic
444 print '\n' + Magic.auto_status[self.shell.automagic]
444 print '\n' + Magic.auto_status[self.shell.automagic]
445
445
446 @testdec.skip_doctest
446 @testdec.skip_doctest
447 def magic_autocall(self, parameter_s = ''):
447 def magic_autocall(self, parameter_s = ''):
448 """Make functions callable without having to type parentheses.
448 """Make functions callable without having to type parentheses.
449
449
450 Usage:
450 Usage:
451
451
452 %autocall [mode]
452 %autocall [mode]
453
453
454 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
454 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
455 value is toggled on and off (remembering the previous state).
455 value is toggled on and off (remembering the previous state).
456
456
457 In more detail, these values mean:
457 In more detail, these values mean:
458
458
459 0 -> fully disabled
459 0 -> fully disabled
460
460
461 1 -> active, but do not apply if there are no arguments on the line.
461 1 -> active, but do not apply if there are no arguments on the line.
462
462
463 In this mode, you get:
463 In this mode, you get:
464
464
465 In [1]: callable
465 In [1]: callable
466 Out[1]: <built-in function callable>
466 Out[1]: <built-in function callable>
467
467
468 In [2]: callable 'hello'
468 In [2]: callable 'hello'
469 ------> callable('hello')
469 ------> callable('hello')
470 Out[2]: False
470 Out[2]: False
471
471
472 2 -> Active always. Even if no arguments are present, the callable
472 2 -> Active always. Even if no arguments are present, the callable
473 object is called:
473 object is called:
474
474
475 In [2]: float
475 In [2]: float
476 ------> float()
476 ------> float()
477 Out[2]: 0.0
477 Out[2]: 0.0
478
478
479 Note that even with autocall off, you can still use '/' at the start of
479 Note that even with autocall off, you can still use '/' at the start of
480 a line to treat the first argument on the command line as a function
480 a line to treat the first argument on the command line as a function
481 and add parentheses to it:
481 and add parentheses to it:
482
482
483 In [8]: /str 43
483 In [8]: /str 43
484 ------> str(43)
484 ------> str(43)
485 Out[8]: '43'
485 Out[8]: '43'
486
486
487 # all-random (note for auto-testing)
487 # all-random (note for auto-testing)
488 """
488 """
489
489
490 if parameter_s:
490 if parameter_s:
491 arg = int(parameter_s)
491 arg = int(parameter_s)
492 else:
492 else:
493 arg = 'toggle'
493 arg = 'toggle'
494
494
495 if not arg in (0,1,2,'toggle'):
495 if not arg in (0,1,2,'toggle'):
496 error('Valid modes: (0->Off, 1->Smart, 2->Full')
496 error('Valid modes: (0->Off, 1->Smart, 2->Full')
497 return
497 return
498
498
499 if arg in (0,1,2):
499 if arg in (0,1,2):
500 self.shell.autocall = arg
500 self.shell.autocall = arg
501 else: # toggle
501 else: # toggle
502 if self.shell.autocall:
502 if self.shell.autocall:
503 self._magic_state.autocall_save = self.shell.autocall
503 self._magic_state.autocall_save = self.shell.autocall
504 self.shell.autocall = 0
504 self.shell.autocall = 0
505 else:
505 else:
506 try:
506 try:
507 self.shell.autocall = self._magic_state.autocall_save
507 self.shell.autocall = self._magic_state.autocall_save
508 except AttributeError:
508 except AttributeError:
509 self.shell.autocall = self._magic_state.autocall_save = 1
509 self.shell.autocall = self._magic_state.autocall_save = 1
510
510
511 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
511 print "Automatic calling is:",['OFF','Smart','Full'][self.shell.autocall]
512
512
513
513
514 def magic_page(self, parameter_s=''):
514 def magic_page(self, parameter_s=''):
515 """Pretty print the object and display it through a pager.
515 """Pretty print the object and display it through a pager.
516
516
517 %page [options] OBJECT
517 %page [options] OBJECT
518
518
519 If no object is given, use _ (last output).
519 If no object is given, use _ (last output).
520
520
521 Options:
521 Options:
522
522
523 -r: page str(object), don't pretty-print it."""
523 -r: page str(object), don't pretty-print it."""
524
524
525 # After a function contributed by Olivier Aubert, slightly modified.
525 # After a function contributed by Olivier Aubert, slightly modified.
526
526
527 # Process options/args
527 # Process options/args
528 opts,args = self.parse_options(parameter_s,'r')
528 opts,args = self.parse_options(parameter_s,'r')
529 raw = 'r' in opts
529 raw = 'r' in opts
530
530
531 oname = args and args or '_'
531 oname = args and args or '_'
532 info = self._ofind(oname)
532 info = self._ofind(oname)
533 if info['found']:
533 if info['found']:
534 txt = (raw and str or pformat)( info['obj'] )
534 txt = (raw and str or pformat)( info['obj'] )
535 page.page(txt)
535 page.page(txt)
536 else:
536 else:
537 print 'Object `%s` not found' % oname
537 print 'Object `%s` not found' % oname
538
538
539 def magic_profile(self, parameter_s=''):
539 def magic_profile(self, parameter_s=''):
540 """Print your currently active IPython profile."""
540 """Print your currently active IPython profile."""
541 if self.shell.profile:
541 if self.shell.profile:
542 printpl('Current IPython profile: $self.shell.profile.')
542 printpl('Current IPython profile: $self.shell.profile.')
543 else:
543 else:
544 print 'No profile active.'
544 print 'No profile active.'
545
545
546 def magic_pinfo(self, parameter_s='', namespaces=None):
546 def magic_pinfo(self, parameter_s='', namespaces=None):
547 """Provide detailed information about an object.
547 """Provide detailed information about an object.
548
548
549 '%pinfo object' is just a synonym for object? or ?object."""
549 '%pinfo object' is just a synonym for object? or ?object."""
550
550
551 #print 'pinfo par: <%s>' % parameter_s # dbg
551 #print 'pinfo par: <%s>' % parameter_s # dbg
552
552
553
553
554 # detail_level: 0 -> obj? , 1 -> obj??
554 # detail_level: 0 -> obj? , 1 -> obj??
555 detail_level = 0
555 detail_level = 0
556 # We need to detect if we got called as 'pinfo pinfo foo', which can
556 # We need to detect if we got called as 'pinfo pinfo foo', which can
557 # happen if the user types 'pinfo foo?' at the cmd line.
557 # happen if the user types 'pinfo foo?' at the cmd line.
558 pinfo,qmark1,oname,qmark2 = \
558 pinfo,qmark1,oname,qmark2 = \
559 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
559 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
560 if pinfo or qmark1 or qmark2:
560 if pinfo or qmark1 or qmark2:
561 detail_level = 1
561 detail_level = 1
562 if "*" in oname:
562 if "*" in oname:
563 self.magic_psearch(oname)
563 self.magic_psearch(oname)
564 else:
564 else:
565 self.shell._inspect('pinfo', oname, detail_level=detail_level,
565 self.shell._inspect('pinfo', oname, detail_level=detail_level,
566 namespaces=namespaces)
566 namespaces=namespaces)
567
567
568 def magic_pinfo2(self, parameter_s='', namespaces=None):
568 def magic_pinfo2(self, parameter_s='', namespaces=None):
569 """Provide extra detailed information about an object.
569 """Provide extra detailed information about an object.
570
570
571 '%pinfo2 object' is just a synonym for object?? or ??object."""
571 '%pinfo2 object' is just a synonym for object?? or ??object."""
572 self.shell._inspect('pinfo', parameter_s, detail_level=1,
572 self.shell._inspect('pinfo', parameter_s, detail_level=1,
573 namespaces=namespaces)
573 namespaces=namespaces)
574
574
575 @testdec.skip_doctest
575 @testdec.skip_doctest
576 def magic_pdef(self, parameter_s='', namespaces=None):
576 def magic_pdef(self, parameter_s='', namespaces=None):
577 """Print the definition header for any callable object.
577 """Print the definition header for any callable object.
578
578
579 If the object is a class, print the constructor information.
579 If the object is a class, print the constructor information.
580
580
581 Examples
581 Examples
582 --------
582 --------
583 ::
583 ::
584
584
585 In [3]: %pdef urllib.urlopen
585 In [3]: %pdef urllib.urlopen
586 urllib.urlopen(url, data=None, proxies=None)
586 urllib.urlopen(url, data=None, proxies=None)
587 """
587 """
588 self._inspect('pdef',parameter_s, namespaces)
588 self._inspect('pdef',parameter_s, namespaces)
589
589
590 def magic_pdoc(self, parameter_s='', namespaces=None):
590 def magic_pdoc(self, parameter_s='', namespaces=None):
591 """Print the docstring for an object.
591 """Print the docstring for an object.
592
592
593 If the given object is a class, it will print both the class and the
593 If the given object is a class, it will print both the class and the
594 constructor docstrings."""
594 constructor docstrings."""
595 self._inspect('pdoc',parameter_s, namespaces)
595 self._inspect('pdoc',parameter_s, namespaces)
596
596
597 def magic_psource(self, parameter_s='', namespaces=None):
597 def magic_psource(self, parameter_s='', namespaces=None):
598 """Print (or run through pager) the source code for an object."""
598 """Print (or run through pager) the source code for an object."""
599 self._inspect('psource',parameter_s, namespaces)
599 self._inspect('psource',parameter_s, namespaces)
600
600
601 def magic_pfile(self, parameter_s=''):
601 def magic_pfile(self, parameter_s=''):
602 """Print (or run through pager) the file where an object is defined.
602 """Print (or run through pager) the file where an object is defined.
603
603
604 The file opens at the line where the object definition begins. IPython
604 The file opens at the line where the object definition begins. IPython
605 will honor the environment variable PAGER if set, and otherwise will
605 will honor the environment variable PAGER if set, and otherwise will
606 do its best to print the file in a convenient form.
606 do its best to print the file in a convenient form.
607
607
608 If the given argument is not an object currently defined, IPython will
608 If the given argument is not an object currently defined, IPython will
609 try to interpret it as a filename (automatically adding a .py extension
609 try to interpret it as a filename (automatically adding a .py extension
610 if needed). You can thus use %pfile as a syntax highlighting code
610 if needed). You can thus use %pfile as a syntax highlighting code
611 viewer."""
611 viewer."""
612
612
613 # first interpret argument as an object name
613 # first interpret argument as an object name
614 out = self._inspect('pfile',parameter_s)
614 out = self._inspect('pfile',parameter_s)
615 # if not, try the input as a filename
615 # if not, try the input as a filename
616 if out == 'not found':
616 if out == 'not found':
617 try:
617 try:
618 filename = get_py_filename(parameter_s)
618 filename = get_py_filename(parameter_s)
619 except IOError,msg:
619 except IOError,msg:
620 print msg
620 print msg
621 return
621 return
622 page.page(self.shell.inspector.format(file(filename).read()))
622 page.page(self.shell.inspector.format(file(filename).read()))
623
623
624 def magic_psearch(self, parameter_s=''):
624 def magic_psearch(self, parameter_s=''):
625 """Search for object in namespaces by wildcard.
625 """Search for object in namespaces by wildcard.
626
626
627 %psearch [options] PATTERN [OBJECT TYPE]
627 %psearch [options] PATTERN [OBJECT TYPE]
628
628
629 Note: ? can be used as a synonym for %psearch, at the beginning or at
629 Note: ? can be used as a synonym for %psearch, at the beginning or at
630 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
630 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
631 rest of the command line must be unchanged (options come first), so
631 rest of the command line must be unchanged (options come first), so
632 for example the following forms are equivalent
632 for example the following forms are equivalent
633
633
634 %psearch -i a* function
634 %psearch -i a* function
635 -i a* function?
635 -i a* function?
636 ?-i a* function
636 ?-i a* function
637
637
638 Arguments:
638 Arguments:
639
639
640 PATTERN
640 PATTERN
641
641
642 where PATTERN is a string containing * as a wildcard similar to its
642 where PATTERN is a string containing * as a wildcard similar to its
643 use in a shell. The pattern is matched in all namespaces on the
643 use in a shell. The pattern is matched in all namespaces on the
644 search path. By default objects starting with a single _ are not
644 search path. By default objects starting with a single _ are not
645 matched, many IPython generated objects have a single
645 matched, many IPython generated objects have a single
646 underscore. The default is case insensitive matching. Matching is
646 underscore. The default is case insensitive matching. Matching is
647 also done on the attributes of objects and not only on the objects
647 also done on the attributes of objects and not only on the objects
648 in a module.
648 in a module.
649
649
650 [OBJECT TYPE]
650 [OBJECT TYPE]
651
651
652 Is the name of a python type from the types module. The name is
652 Is the name of a python type from the types module. The name is
653 given in lowercase without the ending type, ex. StringType is
653 given in lowercase without the ending type, ex. StringType is
654 written string. By adding a type here only objects matching the
654 written string. By adding a type here only objects matching the
655 given type are matched. Using all here makes the pattern match all
655 given type are matched. Using all here makes the pattern match all
656 types (this is the default).
656 types (this is the default).
657
657
658 Options:
658 Options:
659
659
660 -a: makes the pattern match even objects whose names start with a
660 -a: makes the pattern match even objects whose names start with a
661 single underscore. These names are normally ommitted from the
661 single underscore. These names are normally ommitted from the
662 search.
662 search.
663
663
664 -i/-c: make the pattern case insensitive/sensitive. If neither of
664 -i/-c: make the pattern case insensitive/sensitive. If neither of
665 these options is given, the default is read from your ipythonrc
665 these options is given, the default is read from your ipythonrc
666 file. The option name which sets this value is
666 file. The option name which sets this value is
667 'wildcards_case_sensitive'. If this option is not specified in your
667 'wildcards_case_sensitive'. If this option is not specified in your
668 ipythonrc file, IPython's internal default is to do a case sensitive
668 ipythonrc file, IPython's internal default is to do a case sensitive
669 search.
669 search.
670
670
671 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
671 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
672 specifiy can be searched in any of the following namespaces:
672 specifiy can be searched in any of the following namespaces:
673 'builtin', 'user', 'user_global','internal', 'alias', where
673 'builtin', 'user', 'user_global','internal', 'alias', where
674 'builtin' and 'user' are the search defaults. Note that you should
674 'builtin' and 'user' are the search defaults. Note that you should
675 not use quotes when specifying namespaces.
675 not use quotes when specifying namespaces.
676
676
677 'Builtin' contains the python module builtin, 'user' contains all
677 'Builtin' contains the python module builtin, 'user' contains all
678 user data, 'alias' only contain the shell aliases and no python
678 user data, 'alias' only contain the shell aliases and no python
679 objects, 'internal' contains objects used by IPython. The
679 objects, 'internal' contains objects used by IPython. The
680 'user_global' namespace is only used by embedded IPython instances,
680 'user_global' namespace is only used by embedded IPython instances,
681 and it contains module-level globals. You can add namespaces to the
681 and it contains module-level globals. You can add namespaces to the
682 search with -s or exclude them with -e (these options can be given
682 search with -s or exclude them with -e (these options can be given
683 more than once).
683 more than once).
684
684
685 Examples:
685 Examples:
686
686
687 %psearch a* -> objects beginning with an a
687 %psearch a* -> objects beginning with an a
688 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
688 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
689 %psearch a* function -> all functions beginning with an a
689 %psearch a* function -> all functions beginning with an a
690 %psearch re.e* -> objects beginning with an e in module re
690 %psearch re.e* -> objects beginning with an e in module re
691 %psearch r*.e* -> objects that start with e in modules starting in r
691 %psearch r*.e* -> objects that start with e in modules starting in r
692 %psearch r*.* string -> all strings in modules beginning with r
692 %psearch r*.* string -> all strings in modules beginning with r
693
693
694 Case sensitve search:
694 Case sensitve search:
695
695
696 %psearch -c a* list all object beginning with lower case a
696 %psearch -c a* list all object beginning with lower case a
697
697
698 Show objects beginning with a single _:
698 Show objects beginning with a single _:
699
699
700 %psearch -a _* list objects beginning with a single underscore"""
700 %psearch -a _* list objects beginning with a single underscore"""
701 try:
701 try:
702 parameter_s = parameter_s.encode('ascii')
702 parameter_s = parameter_s.encode('ascii')
703 except UnicodeEncodeError:
703 except UnicodeEncodeError:
704 print 'Python identifiers can only contain ascii characters.'
704 print 'Python identifiers can only contain ascii characters.'
705 return
705 return
706
706
707 # default namespaces to be searched
707 # default namespaces to be searched
708 def_search = ['user','builtin']
708 def_search = ['user','builtin']
709
709
710 # Process options/args
710 # Process options/args
711 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
711 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
712 opt = opts.get
712 opt = opts.get
713 shell = self.shell
713 shell = self.shell
714 psearch = shell.inspector.psearch
714 psearch = shell.inspector.psearch
715
715
716 # select case options
716 # select case options
717 if opts.has_key('i'):
717 if opts.has_key('i'):
718 ignore_case = True
718 ignore_case = True
719 elif opts.has_key('c'):
719 elif opts.has_key('c'):
720 ignore_case = False
720 ignore_case = False
721 else:
721 else:
722 ignore_case = not shell.wildcards_case_sensitive
722 ignore_case = not shell.wildcards_case_sensitive
723
723
724 # Build list of namespaces to search from user options
724 # Build list of namespaces to search from user options
725 def_search.extend(opt('s',[]))
725 def_search.extend(opt('s',[]))
726 ns_exclude = ns_exclude=opt('e',[])
726 ns_exclude = ns_exclude=opt('e',[])
727 ns_search = [nm for nm in def_search if nm not in ns_exclude]
727 ns_search = [nm for nm in def_search if nm not in ns_exclude]
728
728
729 # Call the actual search
729 # Call the actual search
730 try:
730 try:
731 psearch(args,shell.ns_table,ns_search,
731 psearch(args,shell.ns_table,ns_search,
732 show_all=opt('a'),ignore_case=ignore_case)
732 show_all=opt('a'),ignore_case=ignore_case)
733 except:
733 except:
734 shell.showtraceback()
734 shell.showtraceback()
735
735
736 @testdec.skip_doctest
736 @testdec.skip_doctest
737 def magic_who_ls(self, parameter_s=''):
737 def magic_who_ls(self, parameter_s=''):
738 """Return a sorted list of all interactive variables.
738 """Return a sorted list of all interactive variables.
739
739
740 If arguments are given, only variables of types matching these
740 If arguments are given, only variables of types matching these
741 arguments are returned.
741 arguments are returned.
742
742
743 Examples
743 Examples
744 --------
744 --------
745
745
746 Define two variables and list them with who_ls::
746 Define two variables and list them with who_ls::
747
747
748 In [1]: alpha = 123
748 In [1]: alpha = 123
749
749
750 In [2]: beta = 'test'
750 In [2]: beta = 'test'
751
751
752 In [3]: %who_ls
752 In [3]: %who_ls
753 Out[3]: ['alpha', 'beta']
753 Out[3]: ['alpha', 'beta']
754
754
755 In [4]: %who_ls int
755 In [4]: %who_ls int
756 Out[4]: ['alpha']
756 Out[4]: ['alpha']
757
757
758 In [5]: %who_ls str
758 In [5]: %who_ls str
759 Out[5]: ['beta']
759 Out[5]: ['beta']
760 """
760 """
761
761
762 user_ns = self.shell.user_ns
762 user_ns = self.shell.user_ns
763 internal_ns = self.shell.internal_ns
763 internal_ns = self.shell.internal_ns
764 user_ns_hidden = self.shell.user_ns_hidden
764 user_ns_hidden = self.shell.user_ns_hidden
765 out = [ i for i in user_ns
765 out = [ i for i in user_ns
766 if not i.startswith('_') \
766 if not i.startswith('_') \
767 and not (i in internal_ns or i in user_ns_hidden) ]
767 and not (i in internal_ns or i in user_ns_hidden) ]
768
768
769 typelist = parameter_s.split()
769 typelist = parameter_s.split()
770 if typelist:
770 if typelist:
771 typeset = set(typelist)
771 typeset = set(typelist)
772 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
772 out = [i for i in out if type(user_ns[i]).__name__ in typeset]
773
773
774 out.sort()
774 out.sort()
775 return out
775 return out
776
776
777 @testdec.skip_doctest
777 @testdec.skip_doctest
778 def magic_who(self, parameter_s=''):
778 def magic_who(self, parameter_s=''):
779 """Print all interactive variables, with some minimal formatting.
779 """Print all interactive variables, with some minimal formatting.
780
780
781 If any arguments are given, only variables whose type matches one of
781 If any arguments are given, only variables whose type matches one of
782 these are printed. For example:
782 these are printed. For example:
783
783
784 %who function str
784 %who function str
785
785
786 will only list functions and strings, excluding all other types of
786 will only list functions and strings, excluding all other types of
787 variables. To find the proper type names, simply use type(var) at a
787 variables. To find the proper type names, simply use type(var) at a
788 command line to see how python prints type names. For example:
788 command line to see how python prints type names. For example:
789
789
790 In [1]: type('hello')\\
790 In [1]: type('hello')\\
791 Out[1]: <type 'str'>
791 Out[1]: <type 'str'>
792
792
793 indicates that the type name for strings is 'str'.
793 indicates that the type name for strings is 'str'.
794
794
795 %who always excludes executed names loaded through your configuration
795 %who always excludes executed names loaded through your configuration
796 file and things which are internal to IPython.
796 file and things which are internal to IPython.
797
797
798 This is deliberate, as typically you may load many modules and the
798 This is deliberate, as typically you may load many modules and the
799 purpose of %who is to show you only what you've manually defined.
799 purpose of %who is to show you only what you've manually defined.
800
800
801 Examples
801 Examples
802 --------
802 --------
803
803
804 Define two variables and list them with who::
804 Define two variables and list them with who::
805
805
806 In [1]: alpha = 123
806 In [1]: alpha = 123
807
807
808 In [2]: beta = 'test'
808 In [2]: beta = 'test'
809
809
810 In [3]: %who
810 In [3]: %who
811 alpha beta
811 alpha beta
812
812
813 In [4]: %who int
813 In [4]: %who int
814 alpha
814 alpha
815
815
816 In [5]: %who str
816 In [5]: %who str
817 beta
817 beta
818 """
818 """
819
819
820 varlist = self.magic_who_ls(parameter_s)
820 varlist = self.magic_who_ls(parameter_s)
821 if not varlist:
821 if not varlist:
822 if parameter_s:
822 if parameter_s:
823 print 'No variables match your requested type.'
823 print 'No variables match your requested type.'
824 else:
824 else:
825 print 'Interactive namespace is empty.'
825 print 'Interactive namespace is empty.'
826 return
826 return
827
827
828 # if we have variables, move on...
828 # if we have variables, move on...
829 count = 0
829 count = 0
830 for i in varlist:
830 for i in varlist:
831 print i+'\t',
831 print i+'\t',
832 count += 1
832 count += 1
833 if count > 8:
833 if count > 8:
834 count = 0
834 count = 0
835 print
835 print
836 print
836 print
837
837
838 @testdec.skip_doctest
838 @testdec.skip_doctest
839 def magic_whos(self, parameter_s=''):
839 def magic_whos(self, parameter_s=''):
840 """Like %who, but gives some extra information about each variable.
840 """Like %who, but gives some extra information about each variable.
841
841
842 The same type filtering of %who can be applied here.
842 The same type filtering of %who can be applied here.
843
843
844 For all variables, the type is printed. Additionally it prints:
844 For all variables, the type is printed. Additionally it prints:
845
845
846 - For {},[],(): their length.
846 - For {},[],(): their length.
847
847
848 - For numpy and Numeric arrays, a summary with shape, number of
848 - For numpy and Numeric arrays, a summary with shape, number of
849 elements, typecode and size in memory.
849 elements, typecode and size in memory.
850
850
851 - Everything else: a string representation, snipping their middle if
851 - Everything else: a string representation, snipping their middle if
852 too long.
852 too long.
853
853
854 Examples
854 Examples
855 --------
855 --------
856
856
857 Define two variables and list them with whos::
857 Define two variables and list them with whos::
858
858
859 In [1]: alpha = 123
859 In [1]: alpha = 123
860
860
861 In [2]: beta = 'test'
861 In [2]: beta = 'test'
862
862
863 In [3]: %whos
863 In [3]: %whos
864 Variable Type Data/Info
864 Variable Type Data/Info
865 --------------------------------
865 --------------------------------
866 alpha int 123
866 alpha int 123
867 beta str test
867 beta str test
868 """
868 """
869
869
870 varnames = self.magic_who_ls(parameter_s)
870 varnames = self.magic_who_ls(parameter_s)
871 if not varnames:
871 if not varnames:
872 if parameter_s:
872 if parameter_s:
873 print 'No variables match your requested type.'
873 print 'No variables match your requested type.'
874 else:
874 else:
875 print 'Interactive namespace is empty.'
875 print 'Interactive namespace is empty.'
876 return
876 return
877
877
878 # if we have variables, move on...
878 # if we have variables, move on...
879
879
880 # for these types, show len() instead of data:
880 # for these types, show len() instead of data:
881 seq_types = [types.DictType,types.ListType,types.TupleType]
881 seq_types = [types.DictType,types.ListType,types.TupleType]
882
882
883 # for numpy/Numeric arrays, display summary info
883 # for numpy/Numeric arrays, display summary info
884 try:
884 try:
885 import numpy
885 import numpy
886 except ImportError:
886 except ImportError:
887 ndarray_type = None
887 ndarray_type = None
888 else:
888 else:
889 ndarray_type = numpy.ndarray.__name__
889 ndarray_type = numpy.ndarray.__name__
890 try:
890 try:
891 import Numeric
891 import Numeric
892 except ImportError:
892 except ImportError:
893 array_type = None
893 array_type = None
894 else:
894 else:
895 array_type = Numeric.ArrayType.__name__
895 array_type = Numeric.ArrayType.__name__
896
896
897 # Find all variable names and types so we can figure out column sizes
897 # Find all variable names and types so we can figure out column sizes
898 def get_vars(i):
898 def get_vars(i):
899 return self.shell.user_ns[i]
899 return self.shell.user_ns[i]
900
900
901 # some types are well known and can be shorter
901 # some types are well known and can be shorter
902 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
902 abbrevs = {'IPython.core.macro.Macro' : 'Macro'}
903 def type_name(v):
903 def type_name(v):
904 tn = type(v).__name__
904 tn = type(v).__name__
905 return abbrevs.get(tn,tn)
905 return abbrevs.get(tn,tn)
906
906
907 varlist = map(get_vars,varnames)
907 varlist = map(get_vars,varnames)
908
908
909 typelist = []
909 typelist = []
910 for vv in varlist:
910 for vv in varlist:
911 tt = type_name(vv)
911 tt = type_name(vv)
912
912
913 if tt=='instance':
913 if tt=='instance':
914 typelist.append( abbrevs.get(str(vv.__class__),
914 typelist.append( abbrevs.get(str(vv.__class__),
915 str(vv.__class__)))
915 str(vv.__class__)))
916 else:
916 else:
917 typelist.append(tt)
917 typelist.append(tt)
918
918
919 # column labels and # of spaces as separator
919 # column labels and # of spaces as separator
920 varlabel = 'Variable'
920 varlabel = 'Variable'
921 typelabel = 'Type'
921 typelabel = 'Type'
922 datalabel = 'Data/Info'
922 datalabel = 'Data/Info'
923 colsep = 3
923 colsep = 3
924 # variable format strings
924 # variable format strings
925 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
925 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
926 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
926 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
927 aformat = "%s: %s elems, type `%s`, %s bytes"
927 aformat = "%s: %s elems, type `%s`, %s bytes"
928 # find the size of the columns to format the output nicely
928 # find the size of the columns to format the output nicely
929 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
929 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
930 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
930 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
931 # table header
931 # table header
932 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
932 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
933 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
933 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
934 # and the table itself
934 # and the table itself
935 kb = 1024
935 kb = 1024
936 Mb = 1048576 # kb**2
936 Mb = 1048576 # kb**2
937 for vname,var,vtype in zip(varnames,varlist,typelist):
937 for vname,var,vtype in zip(varnames,varlist,typelist):
938 print itpl(vformat),
938 print itpl(vformat),
939 if vtype in seq_types:
939 if vtype in seq_types:
940 print len(var)
940 print len(var)
941 elif vtype in [array_type,ndarray_type]:
941 elif vtype in [array_type,ndarray_type]:
942 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
942 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
943 if vtype==ndarray_type:
943 if vtype==ndarray_type:
944 # numpy
944 # numpy
945 vsize = var.size
945 vsize = var.size
946 vbytes = vsize*var.itemsize
946 vbytes = vsize*var.itemsize
947 vdtype = var.dtype
947 vdtype = var.dtype
948 else:
948 else:
949 # Numeric
949 # Numeric
950 vsize = Numeric.size(var)
950 vsize = Numeric.size(var)
951 vbytes = vsize*var.itemsize()
951 vbytes = vsize*var.itemsize()
952 vdtype = var.typecode()
952 vdtype = var.typecode()
953
953
954 if vbytes < 100000:
954 if vbytes < 100000:
955 print aformat % (vshape,vsize,vdtype,vbytes)
955 print aformat % (vshape,vsize,vdtype,vbytes)
956 else:
956 else:
957 print aformat % (vshape,vsize,vdtype,vbytes),
957 print aformat % (vshape,vsize,vdtype,vbytes),
958 if vbytes < Mb:
958 if vbytes < Mb:
959 print '(%s kb)' % (vbytes/kb,)
959 print '(%s kb)' % (vbytes/kb,)
960 else:
960 else:
961 print '(%s Mb)' % (vbytes/Mb,)
961 print '(%s Mb)' % (vbytes/Mb,)
962 else:
962 else:
963 try:
963 try:
964 vstr = str(var)
964 vstr = str(var)
965 except UnicodeEncodeError:
965 except UnicodeEncodeError:
966 vstr = unicode(var).encode(sys.getdefaultencoding(),
966 vstr = unicode(var).encode(sys.getdefaultencoding(),
967 'backslashreplace')
967 'backslashreplace')
968 vstr = vstr.replace('\n','\\n')
968 vstr = vstr.replace('\n','\\n')
969 if len(vstr) < 50:
969 if len(vstr) < 50:
970 print vstr
970 print vstr
971 else:
971 else:
972 printpl(vfmt_short)
972 printpl(vfmt_short)
973
973
974 def magic_reset(self, parameter_s=''):
974 def magic_reset(self, parameter_s=''):
975 """Resets the namespace by removing all names defined by the user.
975 """Resets the namespace by removing all names defined by the user.
976
976
977 Input/Output history are left around in case you need them.
977 Input/Output history are left around in case you need them.
978
978
979 Parameters
979 Parameters
980 ----------
980 ----------
981 -y : force reset without asking for confirmation.
981 -y : force reset without asking for confirmation.
982
982
983 Examples
983 Examples
984 --------
984 --------
985 In [6]: a = 1
985 In [6]: a = 1
986
986
987 In [7]: a
987 In [7]: a
988 Out[7]: 1
988 Out[7]: 1
989
989
990 In [8]: 'a' in _ip.user_ns
990 In [8]: 'a' in _ip.user_ns
991 Out[8]: True
991 Out[8]: True
992
992
993 In [9]: %reset -f
993 In [9]: %reset -f
994
994
995 In [10]: 'a' in _ip.user_ns
995 In [10]: 'a' in _ip.user_ns
996 Out[10]: False
996 Out[10]: False
997 """
997 """
998
998
999 if parameter_s == '-f':
999 if parameter_s == '-f':
1000 ans = True
1000 ans = True
1001 else:
1001 else:
1002 ans = self.shell.ask_yes_no(
1002 ans = self.shell.ask_yes_no(
1003 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1003 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1004 if not ans:
1004 if not ans:
1005 print 'Nothing done.'
1005 print 'Nothing done.'
1006 return
1006 return
1007 user_ns = self.shell.user_ns
1007 user_ns = self.shell.user_ns
1008 for i in self.magic_who_ls():
1008 for i in self.magic_who_ls():
1009 del(user_ns[i])
1009 del(user_ns[i])
1010
1010
1011 # Also flush the private list of module references kept for script
1011 # Also flush the private list of module references kept for script
1012 # execution protection
1012 # execution protection
1013 self.shell.clear_main_mod_cache()
1013 self.shell.clear_main_mod_cache()
1014
1014
1015 def magic_reset_selective(self, parameter_s=''):
1015 def magic_reset_selective(self, parameter_s=''):
1016 """Resets the namespace by removing names defined by the user.
1016 """Resets the namespace by removing names defined by the user.
1017
1017
1018 Input/Output history are left around in case you need them.
1018 Input/Output history are left around in case you need them.
1019
1019
1020 %reset_selective [-f] regex
1020 %reset_selective [-f] regex
1021
1021
1022 No action is taken if regex is not included
1022 No action is taken if regex is not included
1023
1023
1024 Options
1024 Options
1025 -f : force reset without asking for confirmation.
1025 -f : force reset without asking for confirmation.
1026
1026
1027 Examples
1027 Examples
1028 --------
1028 --------
1029
1029
1030 We first fully reset the namespace so your output looks identical to
1030 We first fully reset the namespace so your output looks identical to
1031 this example for pedagogical reasons; in practice you do not need a
1031 this example for pedagogical reasons; in practice you do not need a
1032 full reset.
1032 full reset.
1033
1033
1034 In [1]: %reset -f
1034 In [1]: %reset -f
1035
1035
1036 Now, with a clean namespace we can make a few variables and use
1036 Now, with a clean namespace we can make a few variables and use
1037 %reset_selective to only delete names that match our regexp:
1037 %reset_selective to only delete names that match our regexp:
1038
1038
1039 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1039 In [2]: a=1; b=2; c=3; b1m=4; b2m=5; b3m=6; b4m=7; b2s=8
1040
1040
1041 In [3]: who_ls
1041 In [3]: who_ls
1042 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1042 Out[3]: ['a', 'b', 'b1m', 'b2m', 'b2s', 'b3m', 'b4m', 'c']
1043
1043
1044 In [4]: %reset_selective -f b[2-3]m
1044 In [4]: %reset_selective -f b[2-3]m
1045
1045
1046 In [5]: who_ls
1046 In [5]: who_ls
1047 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1047 Out[5]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1048
1048
1049 In [6]: %reset_selective -f d
1049 In [6]: %reset_selective -f d
1050
1050
1051 In [7]: who_ls
1051 In [7]: who_ls
1052 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1052 Out[7]: ['a', 'b', 'b1m', 'b2s', 'b4m', 'c']
1053
1053
1054 In [8]: %reset_selective -f c
1054 In [8]: %reset_selective -f c
1055
1055
1056 In [9]: who_ls
1056 In [9]: who_ls
1057 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1057 Out[9]: ['a', 'b', 'b1m', 'b2s', 'b4m']
1058
1058
1059 In [10]: %reset_selective -f b
1059 In [10]: %reset_selective -f b
1060
1060
1061 In [11]: who_ls
1061 In [11]: who_ls
1062 Out[11]: ['a']
1062 Out[11]: ['a']
1063 """
1063 """
1064
1064
1065 opts, regex = self.parse_options(parameter_s,'f')
1065 opts, regex = self.parse_options(parameter_s,'f')
1066
1066
1067 if opts.has_key('f'):
1067 if opts.has_key('f'):
1068 ans = True
1068 ans = True
1069 else:
1069 else:
1070 ans = self.shell.ask_yes_no(
1070 ans = self.shell.ask_yes_no(
1071 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1071 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1072 if not ans:
1072 if not ans:
1073 print 'Nothing done.'
1073 print 'Nothing done.'
1074 return
1074 return
1075 user_ns = self.shell.user_ns
1075 user_ns = self.shell.user_ns
1076 if not regex:
1076 if not regex:
1077 print 'No regex pattern specified. Nothing done.'
1077 print 'No regex pattern specified. Nothing done.'
1078 return
1078 return
1079 else:
1079 else:
1080 try:
1080 try:
1081 m = re.compile(regex)
1081 m = re.compile(regex)
1082 except TypeError:
1082 except TypeError:
1083 raise TypeError('regex must be a string or compiled pattern')
1083 raise TypeError('regex must be a string or compiled pattern')
1084 for i in self.magic_who_ls():
1084 for i in self.magic_who_ls():
1085 if m.search(i):
1085 if m.search(i):
1086 del(user_ns[i])
1086 del(user_ns[i])
1087
1087
1088 def magic_logstart(self,parameter_s=''):
1088 def magic_logstart(self,parameter_s=''):
1089 """Start logging anywhere in a session.
1089 """Start logging anywhere in a session.
1090
1090
1091 %logstart [-o|-r|-t] [log_name [log_mode]]
1091 %logstart [-o|-r|-t] [log_name [log_mode]]
1092
1092
1093 If no name is given, it defaults to a file named 'ipython_log.py' in your
1093 If no name is given, it defaults to a file named 'ipython_log.py' in your
1094 current directory, in 'rotate' mode (see below).
1094 current directory, in 'rotate' mode (see below).
1095
1095
1096 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1096 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1097 history up to that point and then continues logging.
1097 history up to that point and then continues logging.
1098
1098
1099 %logstart takes a second optional parameter: logging mode. This can be one
1099 %logstart takes a second optional parameter: logging mode. This can be one
1100 of (note that the modes are given unquoted):\\
1100 of (note that the modes are given unquoted):\\
1101 append: well, that says it.\\
1101 append: well, that says it.\\
1102 backup: rename (if exists) to name~ and start name.\\
1102 backup: rename (if exists) to name~ and start name.\\
1103 global: single logfile in your home dir, appended to.\\
1103 global: single logfile in your home dir, appended to.\\
1104 over : overwrite existing log.\\
1104 over : overwrite existing log.\\
1105 rotate: create rotating logs name.1~, name.2~, etc.
1105 rotate: create rotating logs name.1~, name.2~, etc.
1106
1106
1107 Options:
1107 Options:
1108
1108
1109 -o: log also IPython's output. In this mode, all commands which
1109 -o: log also IPython's output. In this mode, all commands which
1110 generate an Out[NN] prompt are recorded to the logfile, right after
1110 generate an Out[NN] prompt are recorded to the logfile, right after
1111 their corresponding input line. The output lines are always
1111 their corresponding input line. The output lines are always
1112 prepended with a '#[Out]# ' marker, so that the log remains valid
1112 prepended with a '#[Out]# ' marker, so that the log remains valid
1113 Python code.
1113 Python code.
1114
1114
1115 Since this marker is always the same, filtering only the output from
1115 Since this marker is always the same, filtering only the output from
1116 a log is very easy, using for example a simple awk call:
1116 a log is very easy, using for example a simple awk call:
1117
1117
1118 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1118 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1119
1119
1120 -r: log 'raw' input. Normally, IPython's logs contain the processed
1120 -r: log 'raw' input. Normally, IPython's logs contain the processed
1121 input, so that user lines are logged in their final form, converted
1121 input, so that user lines are logged in their final form, converted
1122 into valid Python. For example, %Exit is logged as
1122 into valid Python. For example, %Exit is logged as
1123 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1123 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1124 exactly as typed, with no transformations applied.
1124 exactly as typed, with no transformations applied.
1125
1125
1126 -t: put timestamps before each input line logged (these are put in
1126 -t: put timestamps before each input line logged (these are put in
1127 comments)."""
1127 comments)."""
1128
1128
1129 opts,par = self.parse_options(parameter_s,'ort')
1129 opts,par = self.parse_options(parameter_s,'ort')
1130 log_output = 'o' in opts
1130 log_output = 'o' in opts
1131 log_raw_input = 'r' in opts
1131 log_raw_input = 'r' in opts
1132 timestamp = 't' in opts
1132 timestamp = 't' in opts
1133
1133
1134 logger = self.shell.logger
1134 logger = self.shell.logger
1135
1135
1136 # if no args are given, the defaults set in the logger constructor by
1136 # if no args are given, the defaults set in the logger constructor by
1137 # ipytohn remain valid
1137 # ipytohn remain valid
1138 if par:
1138 if par:
1139 try:
1139 try:
1140 logfname,logmode = par.split()
1140 logfname,logmode = par.split()
1141 except:
1141 except:
1142 logfname = par
1142 logfname = par
1143 logmode = 'backup'
1143 logmode = 'backup'
1144 else:
1144 else:
1145 logfname = logger.logfname
1145 logfname = logger.logfname
1146 logmode = logger.logmode
1146 logmode = logger.logmode
1147 # put logfname into rc struct as if it had been called on the command
1147 # put logfname into rc struct as if it had been called on the command
1148 # line, so it ends up saved in the log header Save it in case we need
1148 # line, so it ends up saved in the log header Save it in case we need
1149 # to restore it...
1149 # to restore it...
1150 old_logfile = self.shell.logfile
1150 old_logfile = self.shell.logfile
1151 if logfname:
1151 if logfname:
1152 logfname = os.path.expanduser(logfname)
1152 logfname = os.path.expanduser(logfname)
1153 self.shell.logfile = logfname
1153 self.shell.logfile = logfname
1154
1154
1155 loghead = '# IPython log file\n\n'
1155 loghead = '# IPython log file\n\n'
1156 try:
1156 try:
1157 started = logger.logstart(logfname,loghead,logmode,
1157 started = logger.logstart(logfname,loghead,logmode,
1158 log_output,timestamp,log_raw_input)
1158 log_output,timestamp,log_raw_input)
1159 except:
1159 except:
1160 self.shell.logfile = old_logfile
1160 self.shell.logfile = old_logfile
1161 warn("Couldn't start log: %s" % sys.exc_info()[1])
1161 warn("Couldn't start log: %s" % sys.exc_info()[1])
1162 else:
1162 else:
1163 # log input history up to this point, optionally interleaving
1163 # log input history up to this point, optionally interleaving
1164 # output if requested
1164 # output if requested
1165
1165
1166 if timestamp:
1166 if timestamp:
1167 # disable timestamping for the previous history, since we've
1167 # disable timestamping for the previous history, since we've
1168 # lost those already (no time machine here).
1168 # lost those already (no time machine here).
1169 logger.timestamp = False
1169 logger.timestamp = False
1170
1170
1171 if log_raw_input:
1171 if log_raw_input:
1172 input_hist = self.shell.history_manager.input_hist_raw
1172 input_hist = self.shell.history_manager.input_hist_raw
1173 else:
1173 else:
1174 input_hist = self.shell.history_manager.input_hist_parsed
1174 input_hist = self.shell.history_manager.input_hist_parsed
1175
1175
1176 if log_output:
1176 if log_output:
1177 log_write = logger.log_write
1177 log_write = logger.log_write
1178 output_hist = self.shell.history_manager.output_hist
1178 output_hist = self.shell.history_manager.output_hist
1179 for n in range(1,len(input_hist)-1):
1179 for n in range(1,len(input_hist)-1):
1180 log_write(input_hist[n].rstrip())
1180 log_write(input_hist[n].rstrip())
1181 if n in output_hist:
1181 if n in output_hist:
1182 log_write(repr(output_hist[n]),'output')
1182 log_write(repr(output_hist[n]),'output')
1183 else:
1183 else:
1184 logger.log_write(''.join(input_hist[1:]))
1184 logger.log_write(''.join(input_hist[1:]))
1185 if timestamp:
1185 if timestamp:
1186 # re-enable timestamping
1186 # re-enable timestamping
1187 logger.timestamp = True
1187 logger.timestamp = True
1188
1188
1189 print ('Activating auto-logging. '
1189 print ('Activating auto-logging. '
1190 'Current session state plus future input saved.')
1190 'Current session state plus future input saved.')
1191 logger.logstate()
1191 logger.logstate()
1192
1192
1193 def magic_logstop(self,parameter_s=''):
1193 def magic_logstop(self,parameter_s=''):
1194 """Fully stop logging and close log file.
1194 """Fully stop logging and close log file.
1195
1195
1196 In order to start logging again, a new %logstart call needs to be made,
1196 In order to start logging again, a new %logstart call needs to be made,
1197 possibly (though not necessarily) with a new filename, mode and other
1197 possibly (though not necessarily) with a new filename, mode and other
1198 options."""
1198 options."""
1199 self.logger.logstop()
1199 self.logger.logstop()
1200
1200
1201 def magic_logoff(self,parameter_s=''):
1201 def magic_logoff(self,parameter_s=''):
1202 """Temporarily stop logging.
1202 """Temporarily stop logging.
1203
1203
1204 You must have previously started logging."""
1204 You must have previously started logging."""
1205 self.shell.logger.switch_log(0)
1205 self.shell.logger.switch_log(0)
1206
1206
1207 def magic_logon(self,parameter_s=''):
1207 def magic_logon(self,parameter_s=''):
1208 """Restart logging.
1208 """Restart logging.
1209
1209
1210 This function is for restarting logging which you've temporarily
1210 This function is for restarting logging which you've temporarily
1211 stopped with %logoff. For starting logging for the first time, you
1211 stopped with %logoff. For starting logging for the first time, you
1212 must use the %logstart function, which allows you to specify an
1212 must use the %logstart function, which allows you to specify an
1213 optional log filename."""
1213 optional log filename."""
1214
1214
1215 self.shell.logger.switch_log(1)
1215 self.shell.logger.switch_log(1)
1216
1216
1217 def magic_logstate(self,parameter_s=''):
1217 def magic_logstate(self,parameter_s=''):
1218 """Print the status of the logging system."""
1218 """Print the status of the logging system."""
1219
1219
1220 self.shell.logger.logstate()
1220 self.shell.logger.logstate()
1221
1221
1222 def magic_pdb(self, parameter_s=''):
1222 def magic_pdb(self, parameter_s=''):
1223 """Control the automatic calling of the pdb interactive debugger.
1223 """Control the automatic calling of the pdb interactive debugger.
1224
1224
1225 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1225 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1226 argument it works as a toggle.
1226 argument it works as a toggle.
1227
1227
1228 When an exception is triggered, IPython can optionally call the
1228 When an exception is triggered, IPython can optionally call the
1229 interactive pdb debugger after the traceback printout. %pdb toggles
1229 interactive pdb debugger after the traceback printout. %pdb toggles
1230 this feature on and off.
1230 this feature on and off.
1231
1231
1232 The initial state of this feature is set in your ipythonrc
1232 The initial state of this feature is set in your ipythonrc
1233 configuration file (the variable is called 'pdb').
1233 configuration file (the variable is called 'pdb').
1234
1234
1235 If you want to just activate the debugger AFTER an exception has fired,
1235 If you want to just activate the debugger AFTER an exception has fired,
1236 without having to type '%pdb on' and rerunning your code, you can use
1236 without having to type '%pdb on' and rerunning your code, you can use
1237 the %debug magic."""
1237 the %debug magic."""
1238
1238
1239 par = parameter_s.strip().lower()
1239 par = parameter_s.strip().lower()
1240
1240
1241 if par:
1241 if par:
1242 try:
1242 try:
1243 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1243 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1244 except KeyError:
1244 except KeyError:
1245 print ('Incorrect argument. Use on/1, off/0, '
1245 print ('Incorrect argument. Use on/1, off/0, '
1246 'or nothing for a toggle.')
1246 'or nothing for a toggle.')
1247 return
1247 return
1248 else:
1248 else:
1249 # toggle
1249 # toggle
1250 new_pdb = not self.shell.call_pdb
1250 new_pdb = not self.shell.call_pdb
1251
1251
1252 # set on the shell
1252 # set on the shell
1253 self.shell.call_pdb = new_pdb
1253 self.shell.call_pdb = new_pdb
1254 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1254 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1255
1255
1256 def magic_debug(self, parameter_s=''):
1256 def magic_debug(self, parameter_s=''):
1257 """Activate the interactive debugger in post-mortem mode.
1257 """Activate the interactive debugger in post-mortem mode.
1258
1258
1259 If an exception has just occurred, this lets you inspect its stack
1259 If an exception has just occurred, this lets you inspect its stack
1260 frames interactively. Note that this will always work only on the last
1260 frames interactively. Note that this will always work only on the last
1261 traceback that occurred, so you must call this quickly after an
1261 traceback that occurred, so you must call this quickly after an
1262 exception that you wish to inspect has fired, because if another one
1262 exception that you wish to inspect has fired, because if another one
1263 occurs, it clobbers the previous one.
1263 occurs, it clobbers the previous one.
1264
1264
1265 If you want IPython to automatically do this on every exception, see
1265 If you want IPython to automatically do this on every exception, see
1266 the %pdb magic for more details.
1266 the %pdb magic for more details.
1267 """
1267 """
1268 self.shell.debugger(force=True)
1268 self.shell.debugger(force=True)
1269
1269
1270 @testdec.skip_doctest
1270 @testdec.skip_doctest
1271 def magic_prun(self, parameter_s ='',user_mode=1,
1271 def magic_prun(self, parameter_s ='',user_mode=1,
1272 opts=None,arg_lst=None,prog_ns=None):
1272 opts=None,arg_lst=None,prog_ns=None):
1273
1273
1274 """Run a statement through the python code profiler.
1274 """Run a statement through the python code profiler.
1275
1275
1276 Usage:
1276 Usage:
1277 %prun [options] statement
1277 %prun [options] statement
1278
1278
1279 The given statement (which doesn't require quote marks) is run via the
1279 The given statement (which doesn't require quote marks) is run via the
1280 python profiler in a manner similar to the profile.run() function.
1280 python profiler in a manner similar to the profile.run() function.
1281 Namespaces are internally managed to work correctly; profile.run
1281 Namespaces are internally managed to work correctly; profile.run
1282 cannot be used in IPython because it makes certain assumptions about
1282 cannot be used in IPython because it makes certain assumptions about
1283 namespaces which do not hold under IPython.
1283 namespaces which do not hold under IPython.
1284
1284
1285 Options:
1285 Options:
1286
1286
1287 -l <limit>: you can place restrictions on what or how much of the
1287 -l <limit>: you can place restrictions on what or how much of the
1288 profile gets printed. The limit value can be:
1288 profile gets printed. The limit value can be:
1289
1289
1290 * A string: only information for function names containing this string
1290 * A string: only information for function names containing this string
1291 is printed.
1291 is printed.
1292
1292
1293 * An integer: only these many lines are printed.
1293 * An integer: only these many lines are printed.
1294
1294
1295 * A float (between 0 and 1): this fraction of the report is printed
1295 * A float (between 0 and 1): this fraction of the report is printed
1296 (for example, use a limit of 0.4 to see the topmost 40% only).
1296 (for example, use a limit of 0.4 to see the topmost 40% only).
1297
1297
1298 You can combine several limits with repeated use of the option. For
1298 You can combine several limits with repeated use of the option. For
1299 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1299 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1300 information about class constructors.
1300 information about class constructors.
1301
1301
1302 -r: return the pstats.Stats object generated by the profiling. This
1302 -r: return the pstats.Stats object generated by the profiling. This
1303 object has all the information about the profile in it, and you can
1303 object has all the information about the profile in it, and you can
1304 later use it for further analysis or in other functions.
1304 later use it for further analysis or in other functions.
1305
1305
1306 -s <key>: sort profile by given key. You can provide more than one key
1306 -s <key>: sort profile by given key. You can provide more than one key
1307 by using the option several times: '-s key1 -s key2 -s key3...'. The
1307 by using the option several times: '-s key1 -s key2 -s key3...'. The
1308 default sorting key is 'time'.
1308 default sorting key is 'time'.
1309
1309
1310 The following is copied verbatim from the profile documentation
1310 The following is copied verbatim from the profile documentation
1311 referenced below:
1311 referenced below:
1312
1312
1313 When more than one key is provided, additional keys are used as
1313 When more than one key is provided, additional keys are used as
1314 secondary criteria when the there is equality in all keys selected
1314 secondary criteria when the there is equality in all keys selected
1315 before them.
1315 before them.
1316
1316
1317 Abbreviations can be used for any key names, as long as the
1317 Abbreviations can be used for any key names, as long as the
1318 abbreviation is unambiguous. The following are the keys currently
1318 abbreviation is unambiguous. The following are the keys currently
1319 defined:
1319 defined:
1320
1320
1321 Valid Arg Meaning
1321 Valid Arg Meaning
1322 "calls" call count
1322 "calls" call count
1323 "cumulative" cumulative time
1323 "cumulative" cumulative time
1324 "file" file name
1324 "file" file name
1325 "module" file name
1325 "module" file name
1326 "pcalls" primitive call count
1326 "pcalls" primitive call count
1327 "line" line number
1327 "line" line number
1328 "name" function name
1328 "name" function name
1329 "nfl" name/file/line
1329 "nfl" name/file/line
1330 "stdname" standard name
1330 "stdname" standard name
1331 "time" internal time
1331 "time" internal time
1332
1332
1333 Note that all sorts on statistics are in descending order (placing
1333 Note that all sorts on statistics are in descending order (placing
1334 most time consuming items first), where as name, file, and line number
1334 most time consuming items first), where as name, file, and line number
1335 searches are in ascending order (i.e., alphabetical). The subtle
1335 searches are in ascending order (i.e., alphabetical). The subtle
1336 distinction between "nfl" and "stdname" is that the standard name is a
1336 distinction between "nfl" and "stdname" is that the standard name is a
1337 sort of the name as printed, which means that the embedded line
1337 sort of the name as printed, which means that the embedded line
1338 numbers get compared in an odd way. For example, lines 3, 20, and 40
1338 numbers get compared in an odd way. For example, lines 3, 20, and 40
1339 would (if the file names were the same) appear in the string order
1339 would (if the file names were the same) appear in the string order
1340 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1340 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1341 line numbers. In fact, sort_stats("nfl") is the same as
1341 line numbers. In fact, sort_stats("nfl") is the same as
1342 sort_stats("name", "file", "line").
1342 sort_stats("name", "file", "line").
1343
1343
1344 -T <filename>: save profile results as shown on screen to a text
1344 -T <filename>: save profile results as shown on screen to a text
1345 file. The profile is still shown on screen.
1345 file. The profile is still shown on screen.
1346
1346
1347 -D <filename>: save (via dump_stats) profile statistics to given
1347 -D <filename>: save (via dump_stats) profile statistics to given
1348 filename. This data is in a format understod by the pstats module, and
1348 filename. This data is in a format understod by the pstats module, and
1349 is generated by a call to the dump_stats() method of profile
1349 is generated by a call to the dump_stats() method of profile
1350 objects. The profile is still shown on screen.
1350 objects. The profile is still shown on screen.
1351
1351
1352 If you want to run complete programs under the profiler's control, use
1352 If you want to run complete programs under the profiler's control, use
1353 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1353 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1354 contains profiler specific options as described here.
1354 contains profiler specific options as described here.
1355
1355
1356 You can read the complete documentation for the profile module with::
1356 You can read the complete documentation for the profile module with::
1357
1357
1358 In [1]: import profile; profile.help()
1358 In [1]: import profile; profile.help()
1359 """
1359 """
1360
1360
1361 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1361 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1362 # protect user quote marks
1362 # protect user quote marks
1363 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1363 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1364
1364
1365 if user_mode: # regular user call
1365 if user_mode: # regular user call
1366 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1366 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1367 list_all=1)
1367 list_all=1)
1368 namespace = self.shell.user_ns
1368 namespace = self.shell.user_ns
1369 else: # called to run a program by %run -p
1369 else: # called to run a program by %run -p
1370 try:
1370 try:
1371 filename = get_py_filename(arg_lst[0])
1371 filename = get_py_filename(arg_lst[0])
1372 except IOError,msg:
1372 except IOError,msg:
1373 error(msg)
1373 error(msg)
1374 return
1374 return
1375
1375
1376 arg_str = 'execfile(filename,prog_ns)'
1376 arg_str = 'execfile(filename,prog_ns)'
1377 namespace = locals()
1377 namespace = locals()
1378
1378
1379 opts.merge(opts_def)
1379 opts.merge(opts_def)
1380
1380
1381 prof = profile.Profile()
1381 prof = profile.Profile()
1382 try:
1382 try:
1383 prof = prof.runctx(arg_str,namespace,namespace)
1383 prof = prof.runctx(arg_str,namespace,namespace)
1384 sys_exit = ''
1384 sys_exit = ''
1385 except SystemExit:
1385 except SystemExit:
1386 sys_exit = """*** SystemExit exception caught in code being profiled."""
1386 sys_exit = """*** SystemExit exception caught in code being profiled."""
1387
1387
1388 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1388 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1389
1389
1390 lims = opts.l
1390 lims = opts.l
1391 if lims:
1391 if lims:
1392 lims = [] # rebuild lims with ints/floats/strings
1392 lims = [] # rebuild lims with ints/floats/strings
1393 for lim in opts.l:
1393 for lim in opts.l:
1394 try:
1394 try:
1395 lims.append(int(lim))
1395 lims.append(int(lim))
1396 except ValueError:
1396 except ValueError:
1397 try:
1397 try:
1398 lims.append(float(lim))
1398 lims.append(float(lim))
1399 except ValueError:
1399 except ValueError:
1400 lims.append(lim)
1400 lims.append(lim)
1401
1401
1402 # Trap output.
1402 # Trap output.
1403 stdout_trap = StringIO()
1403 stdout_trap = StringIO()
1404
1404
1405 if hasattr(stats,'stream'):
1405 if hasattr(stats,'stream'):
1406 # In newer versions of python, the stats object has a 'stream'
1406 # In newer versions of python, the stats object has a 'stream'
1407 # attribute to write into.
1407 # attribute to write into.
1408 stats.stream = stdout_trap
1408 stats.stream = stdout_trap
1409 stats.print_stats(*lims)
1409 stats.print_stats(*lims)
1410 else:
1410 else:
1411 # For older versions, we manually redirect stdout during printing
1411 # For older versions, we manually redirect stdout during printing
1412 sys_stdout = sys.stdout
1412 sys_stdout = sys.stdout
1413 try:
1413 try:
1414 sys.stdout = stdout_trap
1414 sys.stdout = stdout_trap
1415 stats.print_stats(*lims)
1415 stats.print_stats(*lims)
1416 finally:
1416 finally:
1417 sys.stdout = sys_stdout
1417 sys.stdout = sys_stdout
1418
1418
1419 output = stdout_trap.getvalue()
1419 output = stdout_trap.getvalue()
1420 output = output.rstrip()
1420 output = output.rstrip()
1421
1421
1422 page.page(output)
1422 page.page(output)
1423 print sys_exit,
1423 print sys_exit,
1424
1424
1425 dump_file = opts.D[0]
1425 dump_file = opts.D[0]
1426 text_file = opts.T[0]
1426 text_file = opts.T[0]
1427 if dump_file:
1427 if dump_file:
1428 prof.dump_stats(dump_file)
1428 prof.dump_stats(dump_file)
1429 print '\n*** Profile stats marshalled to file',\
1429 print '\n*** Profile stats marshalled to file',\
1430 `dump_file`+'.',sys_exit
1430 `dump_file`+'.',sys_exit
1431 if text_file:
1431 if text_file:
1432 pfile = file(text_file,'w')
1432 pfile = file(text_file,'w')
1433 pfile.write(output)
1433 pfile.write(output)
1434 pfile.close()
1434 pfile.close()
1435 print '\n*** Profile printout saved to text file',\
1435 print '\n*** Profile printout saved to text file',\
1436 `text_file`+'.',sys_exit
1436 `text_file`+'.',sys_exit
1437
1437
1438 if opts.has_key('r'):
1438 if opts.has_key('r'):
1439 return stats
1439 return stats
1440 else:
1440 else:
1441 return None
1441 return None
1442
1442
1443 @testdec.skip_doctest
1443 @testdec.skip_doctest
1444 def magic_run(self, parameter_s ='',runner=None,
1444 def magic_run(self, parameter_s ='',runner=None,
1445 file_finder=get_py_filename):
1445 file_finder=get_py_filename):
1446 """Run the named file inside IPython as a program.
1446 """Run the named file inside IPython as a program.
1447
1447
1448 Usage:\\
1448 Usage:\\
1449 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1449 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1450
1450
1451 Parameters after the filename are passed as command-line arguments to
1451 Parameters after the filename are passed as command-line arguments to
1452 the program (put in sys.argv). Then, control returns to IPython's
1452 the program (put in sys.argv). Then, control returns to IPython's
1453 prompt.
1453 prompt.
1454
1454
1455 This is similar to running at a system prompt:\\
1455 This is similar to running at a system prompt:\\
1456 $ python file args\\
1456 $ python file args\\
1457 but with the advantage of giving you IPython's tracebacks, and of
1457 but with the advantage of giving you IPython's tracebacks, and of
1458 loading all variables into your interactive namespace for further use
1458 loading all variables into your interactive namespace for further use
1459 (unless -p is used, see below).
1459 (unless -p is used, see below).
1460
1460
1461 The file is executed in a namespace initially consisting only of
1461 The file is executed in a namespace initially consisting only of
1462 __name__=='__main__' and sys.argv constructed as indicated. It thus
1462 __name__=='__main__' and sys.argv constructed as indicated. It thus
1463 sees its environment as if it were being run as a stand-alone program
1463 sees its environment as if it were being run as a stand-alone program
1464 (except for sharing global objects such as previously imported
1464 (except for sharing global objects such as previously imported
1465 modules). But after execution, the IPython interactive namespace gets
1465 modules). But after execution, the IPython interactive namespace gets
1466 updated with all variables defined in the program (except for __name__
1466 updated with all variables defined in the program (except for __name__
1467 and sys.argv). This allows for very convenient loading of code for
1467 and sys.argv). This allows for very convenient loading of code for
1468 interactive work, while giving each program a 'clean sheet' to run in.
1468 interactive work, while giving each program a 'clean sheet' to run in.
1469
1469
1470 Options:
1470 Options:
1471
1471
1472 -n: __name__ is NOT set to '__main__', but to the running file's name
1472 -n: __name__ is NOT set to '__main__', but to the running file's name
1473 without extension (as python does under import). This allows running
1473 without extension (as python does under import). This allows running
1474 scripts and reloading the definitions in them without calling code
1474 scripts and reloading the definitions in them without calling code
1475 protected by an ' if __name__ == "__main__" ' clause.
1475 protected by an ' if __name__ == "__main__" ' clause.
1476
1476
1477 -i: run the file in IPython's namespace instead of an empty one. This
1477 -i: run the file in IPython's namespace instead of an empty one. This
1478 is useful if you are experimenting with code written in a text editor
1478 is useful if you are experimenting with code written in a text editor
1479 which depends on variables defined interactively.
1479 which depends on variables defined interactively.
1480
1480
1481 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1481 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1482 being run. This is particularly useful if IPython is being used to
1482 being run. This is particularly useful if IPython is being used to
1483 run unittests, which always exit with a sys.exit() call. In such
1483 run unittests, which always exit with a sys.exit() call. In such
1484 cases you are interested in the output of the test results, not in
1484 cases you are interested in the output of the test results, not in
1485 seeing a traceback of the unittest module.
1485 seeing a traceback of the unittest module.
1486
1486
1487 -t: print timing information at the end of the run. IPython will give
1487 -t: print timing information at the end of the run. IPython will give
1488 you an estimated CPU time consumption for your script, which under
1488 you an estimated CPU time consumption for your script, which under
1489 Unix uses the resource module to avoid the wraparound problems of
1489 Unix uses the resource module to avoid the wraparound problems of
1490 time.clock(). Under Unix, an estimate of time spent on system tasks
1490 time.clock(). Under Unix, an estimate of time spent on system tasks
1491 is also given (for Windows platforms this is reported as 0.0).
1491 is also given (for Windows platforms this is reported as 0.0).
1492
1492
1493 If -t is given, an additional -N<N> option can be given, where <N>
1493 If -t is given, an additional -N<N> option can be given, where <N>
1494 must be an integer indicating how many times you want the script to
1494 must be an integer indicating how many times you want the script to
1495 run. The final timing report will include total and per run results.
1495 run. The final timing report will include total and per run results.
1496
1496
1497 For example (testing the script uniq_stable.py):
1497 For example (testing the script uniq_stable.py):
1498
1498
1499 In [1]: run -t uniq_stable
1499 In [1]: run -t uniq_stable
1500
1500
1501 IPython CPU timings (estimated):\\
1501 IPython CPU timings (estimated):\\
1502 User : 0.19597 s.\\
1502 User : 0.19597 s.\\
1503 System: 0.0 s.\\
1503 System: 0.0 s.\\
1504
1504
1505 In [2]: run -t -N5 uniq_stable
1505 In [2]: run -t -N5 uniq_stable
1506
1506
1507 IPython CPU timings (estimated):\\
1507 IPython CPU timings (estimated):\\
1508 Total runs performed: 5\\
1508 Total runs performed: 5\\
1509 Times : Total Per run\\
1509 Times : Total Per run\\
1510 User : 0.910862 s, 0.1821724 s.\\
1510 User : 0.910862 s, 0.1821724 s.\\
1511 System: 0.0 s, 0.0 s.
1511 System: 0.0 s, 0.0 s.
1512
1512
1513 -d: run your program under the control of pdb, the Python debugger.
1513 -d: run your program under the control of pdb, the Python debugger.
1514 This allows you to execute your program step by step, watch variables,
1514 This allows you to execute your program step by step, watch variables,
1515 etc. Internally, what IPython does is similar to calling:
1515 etc. Internally, what IPython does is similar to calling:
1516
1516
1517 pdb.run('execfile("YOURFILENAME")')
1517 pdb.run('execfile("YOURFILENAME")')
1518
1518
1519 with a breakpoint set on line 1 of your file. You can change the line
1519 with a breakpoint set on line 1 of your file. You can change the line
1520 number for this automatic breakpoint to be <N> by using the -bN option
1520 number for this automatic breakpoint to be <N> by using the -bN option
1521 (where N must be an integer). For example:
1521 (where N must be an integer). For example:
1522
1522
1523 %run -d -b40 myscript
1523 %run -d -b40 myscript
1524
1524
1525 will set the first breakpoint at line 40 in myscript.py. Note that
1525 will set the first breakpoint at line 40 in myscript.py. Note that
1526 the first breakpoint must be set on a line which actually does
1526 the first breakpoint must be set on a line which actually does
1527 something (not a comment or docstring) for it to stop execution.
1527 something (not a comment or docstring) for it to stop execution.
1528
1528
1529 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1529 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1530 first enter 'c' (without qoutes) to start execution up to the first
1530 first enter 'c' (without qoutes) to start execution up to the first
1531 breakpoint.
1531 breakpoint.
1532
1532
1533 Entering 'help' gives information about the use of the debugger. You
1533 Entering 'help' gives information about the use of the debugger. You
1534 can easily see pdb's full documentation with "import pdb;pdb.help()"
1534 can easily see pdb's full documentation with "import pdb;pdb.help()"
1535 at a prompt.
1535 at a prompt.
1536
1536
1537 -p: run program under the control of the Python profiler module (which
1537 -p: run program under the control of the Python profiler module (which
1538 prints a detailed report of execution times, function calls, etc).
1538 prints a detailed report of execution times, function calls, etc).
1539
1539
1540 You can pass other options after -p which affect the behavior of the
1540 You can pass other options after -p which affect the behavior of the
1541 profiler itself. See the docs for %prun for details.
1541 profiler itself. See the docs for %prun for details.
1542
1542
1543 In this mode, the program's variables do NOT propagate back to the
1543 In this mode, the program's variables do NOT propagate back to the
1544 IPython interactive namespace (because they remain in the namespace
1544 IPython interactive namespace (because they remain in the namespace
1545 where the profiler executes them).
1545 where the profiler executes them).
1546
1546
1547 Internally this triggers a call to %prun, see its documentation for
1547 Internally this triggers a call to %prun, see its documentation for
1548 details on the options available specifically for profiling.
1548 details on the options available specifically for profiling.
1549
1549
1550 There is one special usage for which the text above doesn't apply:
1550 There is one special usage for which the text above doesn't apply:
1551 if the filename ends with .ipy, the file is run as ipython script,
1551 if the filename ends with .ipy, the file is run as ipython script,
1552 just as if the commands were written on IPython prompt.
1552 just as if the commands were written on IPython prompt.
1553 """
1553 """
1554
1554
1555 # get arguments and set sys.argv for program to be run.
1555 # get arguments and set sys.argv for program to be run.
1556 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1556 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1557 mode='list',list_all=1)
1557 mode='list',list_all=1)
1558
1558
1559 try:
1559 try:
1560 filename = file_finder(arg_lst[0])
1560 filename = file_finder(arg_lst[0])
1561 except IndexError:
1561 except IndexError:
1562 warn('you must provide at least a filename.')
1562 warn('you must provide at least a filename.')
1563 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1563 print '\n%run:\n',oinspect.getdoc(self.magic_run)
1564 return
1564 return
1565 except IOError,msg:
1565 except IOError,msg:
1566 error(msg)
1566 error(msg)
1567 return
1567 return
1568
1568
1569 if filename.lower().endswith('.ipy'):
1569 if filename.lower().endswith('.ipy'):
1570 self.shell.safe_execfile_ipy(filename)
1570 self.shell.safe_execfile_ipy(filename)
1571 return
1571 return
1572
1572
1573 # Control the response to exit() calls made by the script being run
1573 # Control the response to exit() calls made by the script being run
1574 exit_ignore = opts.has_key('e')
1574 exit_ignore = opts.has_key('e')
1575
1575
1576 # Make sure that the running script gets a proper sys.argv as if it
1576 # Make sure that the running script gets a proper sys.argv as if it
1577 # were run from a system shell.
1577 # were run from a system shell.
1578 save_argv = sys.argv # save it for later restoring
1578 save_argv = sys.argv # save it for later restoring
1579 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1579 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1580
1580
1581 if opts.has_key('i'):
1581 if opts.has_key('i'):
1582 # Run in user's interactive namespace
1582 # Run in user's interactive namespace
1583 prog_ns = self.shell.user_ns
1583 prog_ns = self.shell.user_ns
1584 __name__save = self.shell.user_ns['__name__']
1584 __name__save = self.shell.user_ns['__name__']
1585 prog_ns['__name__'] = '__main__'
1585 prog_ns['__name__'] = '__main__'
1586 main_mod = self.shell.new_main_mod(prog_ns)
1586 main_mod = self.shell.new_main_mod(prog_ns)
1587 else:
1587 else:
1588 # Run in a fresh, empty namespace
1588 # Run in a fresh, empty namespace
1589 if opts.has_key('n'):
1589 if opts.has_key('n'):
1590 name = os.path.splitext(os.path.basename(filename))[0]
1590 name = os.path.splitext(os.path.basename(filename))[0]
1591 else:
1591 else:
1592 name = '__main__'
1592 name = '__main__'
1593
1593
1594 main_mod = self.shell.new_main_mod()
1594 main_mod = self.shell.new_main_mod()
1595 prog_ns = main_mod.__dict__
1595 prog_ns = main_mod.__dict__
1596 prog_ns['__name__'] = name
1596 prog_ns['__name__'] = name
1597
1597
1598 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1598 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1599 # set the __file__ global in the script's namespace
1599 # set the __file__ global in the script's namespace
1600 prog_ns['__file__'] = filename
1600 prog_ns['__file__'] = filename
1601
1601
1602 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1602 # pickle fix. See interactiveshell for an explanation. But we need to make sure
1603 # that, if we overwrite __main__, we replace it at the end
1603 # that, if we overwrite __main__, we replace it at the end
1604 main_mod_name = prog_ns['__name__']
1604 main_mod_name = prog_ns['__name__']
1605
1605
1606 if main_mod_name == '__main__':
1606 if main_mod_name == '__main__':
1607 restore_main = sys.modules['__main__']
1607 restore_main = sys.modules['__main__']
1608 else:
1608 else:
1609 restore_main = False
1609 restore_main = False
1610
1610
1611 # This needs to be undone at the end to prevent holding references to
1611 # This needs to be undone at the end to prevent holding references to
1612 # every single object ever created.
1612 # every single object ever created.
1613 sys.modules[main_mod_name] = main_mod
1613 sys.modules[main_mod_name] = main_mod
1614
1614
1615 stats = None
1615 stats = None
1616 try:
1616 try:
1617 self.shell.save_history()
1617 self.shell.save_history()
1618
1618
1619 if opts.has_key('p'):
1619 if opts.has_key('p'):
1620 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1620 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1621 else:
1621 else:
1622 if opts.has_key('d'):
1622 if opts.has_key('d'):
1623 deb = debugger.Pdb(self.shell.colors)
1623 deb = debugger.Pdb(self.shell.colors)
1624 # reset Breakpoint state, which is moronically kept
1624 # reset Breakpoint state, which is moronically kept
1625 # in a class
1625 # in a class
1626 bdb.Breakpoint.next = 1
1626 bdb.Breakpoint.next = 1
1627 bdb.Breakpoint.bplist = {}
1627 bdb.Breakpoint.bplist = {}
1628 bdb.Breakpoint.bpbynumber = [None]
1628 bdb.Breakpoint.bpbynumber = [None]
1629 # Set an initial breakpoint to stop execution
1629 # Set an initial breakpoint to stop execution
1630 maxtries = 10
1630 maxtries = 10
1631 bp = int(opts.get('b',[1])[0])
1631 bp = int(opts.get('b',[1])[0])
1632 checkline = deb.checkline(filename,bp)
1632 checkline = deb.checkline(filename,bp)
1633 if not checkline:
1633 if not checkline:
1634 for bp in range(bp+1,bp+maxtries+1):
1634 for bp in range(bp+1,bp+maxtries+1):
1635 if deb.checkline(filename,bp):
1635 if deb.checkline(filename,bp):
1636 break
1636 break
1637 else:
1637 else:
1638 msg = ("\nI failed to find a valid line to set "
1638 msg = ("\nI failed to find a valid line to set "
1639 "a breakpoint\n"
1639 "a breakpoint\n"
1640 "after trying up to line: %s.\n"
1640 "after trying up to line: %s.\n"
1641 "Please set a valid breakpoint manually "
1641 "Please set a valid breakpoint manually "
1642 "with the -b option." % bp)
1642 "with the -b option." % bp)
1643 error(msg)
1643 error(msg)
1644 return
1644 return
1645 # if we find a good linenumber, set the breakpoint
1645 # if we find a good linenumber, set the breakpoint
1646 deb.do_break('%s:%s' % (filename,bp))
1646 deb.do_break('%s:%s' % (filename,bp))
1647 # Start file run
1647 # Start file run
1648 print "NOTE: Enter 'c' at the",
1648 print "NOTE: Enter 'c' at the",
1649 print "%s prompt to start your script." % deb.prompt
1649 print "%s prompt to start your script." % deb.prompt
1650 try:
1650 try:
1651 deb.run('execfile("%s")' % filename,prog_ns)
1651 deb.run('execfile("%s")' % filename,prog_ns)
1652
1652
1653 except:
1653 except:
1654 etype, value, tb = sys.exc_info()
1654 etype, value, tb = sys.exc_info()
1655 # Skip three frames in the traceback: the %run one,
1655 # Skip three frames in the traceback: the %run one,
1656 # one inside bdb.py, and the command-line typed by the
1656 # one inside bdb.py, and the command-line typed by the
1657 # user (run by exec in pdb itself).
1657 # user (run by exec in pdb itself).
1658 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1658 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1659 else:
1659 else:
1660 if runner is None:
1660 if runner is None:
1661 runner = self.shell.safe_execfile
1661 runner = self.shell.safe_execfile
1662 if opts.has_key('t'):
1662 if opts.has_key('t'):
1663 # timed execution
1663 # timed execution
1664 try:
1664 try:
1665 nruns = int(opts['N'][0])
1665 nruns = int(opts['N'][0])
1666 if nruns < 1:
1666 if nruns < 1:
1667 error('Number of runs must be >=1')
1667 error('Number of runs must be >=1')
1668 return
1668 return
1669 except (KeyError):
1669 except (KeyError):
1670 nruns = 1
1670 nruns = 1
1671 if nruns == 1:
1671 if nruns == 1:
1672 t0 = clock2()
1672 t0 = clock2()
1673 runner(filename,prog_ns,prog_ns,
1673 runner(filename,prog_ns,prog_ns,
1674 exit_ignore=exit_ignore)
1674 exit_ignore=exit_ignore)
1675 t1 = clock2()
1675 t1 = clock2()
1676 t_usr = t1[0]-t0[0]
1676 t_usr = t1[0]-t0[0]
1677 t_sys = t1[1]-t0[1]
1677 t_sys = t1[1]-t0[1]
1678 print "\nIPython CPU timings (estimated):"
1678 print "\nIPython CPU timings (estimated):"
1679 print " User : %10s s." % t_usr
1679 print " User : %10s s." % t_usr
1680 print " System: %10s s." % t_sys
1680 print " System: %10s s." % t_sys
1681 else:
1681 else:
1682 runs = range(nruns)
1682 runs = range(nruns)
1683 t0 = clock2()
1683 t0 = clock2()
1684 for nr in runs:
1684 for nr in runs:
1685 runner(filename,prog_ns,prog_ns,
1685 runner(filename,prog_ns,prog_ns,
1686 exit_ignore=exit_ignore)
1686 exit_ignore=exit_ignore)
1687 t1 = clock2()
1687 t1 = clock2()
1688 t_usr = t1[0]-t0[0]
1688 t_usr = t1[0]-t0[0]
1689 t_sys = t1[1]-t0[1]
1689 t_sys = t1[1]-t0[1]
1690 print "\nIPython CPU timings (estimated):"
1690 print "\nIPython CPU timings (estimated):"
1691 print "Total runs performed:",nruns
1691 print "Total runs performed:",nruns
1692 print " Times : %10s %10s" % ('Total','Per run')
1692 print " Times : %10s %10s" % ('Total','Per run')
1693 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1693 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1694 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1694 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1695
1695
1696 else:
1696 else:
1697 # regular execution
1697 # regular execution
1698 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1698 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1699
1699
1700 if opts.has_key('i'):
1700 if opts.has_key('i'):
1701 self.shell.user_ns['__name__'] = __name__save
1701 self.shell.user_ns['__name__'] = __name__save
1702 else:
1702 else:
1703 # The shell MUST hold a reference to prog_ns so after %run
1703 # The shell MUST hold a reference to prog_ns so after %run
1704 # exits, the python deletion mechanism doesn't zero it out
1704 # exits, the python deletion mechanism doesn't zero it out
1705 # (leaving dangling references).
1705 # (leaving dangling references).
1706 self.shell.cache_main_mod(prog_ns,filename)
1706 self.shell.cache_main_mod(prog_ns,filename)
1707 # update IPython interactive namespace
1707 # update IPython interactive namespace
1708
1708
1709 # Some forms of read errors on the file may mean the
1709 # Some forms of read errors on the file may mean the
1710 # __name__ key was never set; using pop we don't have to
1710 # __name__ key was never set; using pop we don't have to
1711 # worry about a possible KeyError.
1711 # worry about a possible KeyError.
1712 prog_ns.pop('__name__', None)
1712 prog_ns.pop('__name__', None)
1713
1713
1714 self.shell.user_ns.update(prog_ns)
1714 self.shell.user_ns.update(prog_ns)
1715 finally:
1715 finally:
1716 # It's a bit of a mystery why, but __builtins__ can change from
1716 # It's a bit of a mystery why, but __builtins__ can change from
1717 # being a module to becoming a dict missing some key data after
1717 # being a module to becoming a dict missing some key data after
1718 # %run. As best I can see, this is NOT something IPython is doing
1718 # %run. As best I can see, this is NOT something IPython is doing
1719 # at all, and similar problems have been reported before:
1719 # at all, and similar problems have been reported before:
1720 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1720 # http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-10/0188.html
1721 # Since this seems to be done by the interpreter itself, the best
1721 # Since this seems to be done by the interpreter itself, the best
1722 # we can do is to at least restore __builtins__ for the user on
1722 # we can do is to at least restore __builtins__ for the user on
1723 # exit.
1723 # exit.
1724 self.shell.user_ns['__builtins__'] = __builtin__
1724 self.shell.user_ns['__builtins__'] = __builtin__
1725
1725
1726 # Ensure key global structures are restored
1726 # Ensure key global structures are restored
1727 sys.argv = save_argv
1727 sys.argv = save_argv
1728 if restore_main:
1728 if restore_main:
1729 sys.modules['__main__'] = restore_main
1729 sys.modules['__main__'] = restore_main
1730 else:
1730 else:
1731 # Remove from sys.modules the reference to main_mod we'd
1731 # Remove from sys.modules the reference to main_mod we'd
1732 # added. Otherwise it will trap references to objects
1732 # added. Otherwise it will trap references to objects
1733 # contained therein.
1733 # contained therein.
1734 del sys.modules[main_mod_name]
1734 del sys.modules[main_mod_name]
1735
1735
1736 self.shell.reload_history()
1736 self.shell.reload_history()
1737
1737
1738 return stats
1738 return stats
1739
1739
1740 @testdec.skip_doctest
1740 @testdec.skip_doctest
1741 def magic_timeit(self, parameter_s =''):
1741 def magic_timeit(self, parameter_s =''):
1742 """Time execution of a Python statement or expression
1742 """Time execution of a Python statement or expression
1743
1743
1744 Usage:\\
1744 Usage:\\
1745 %timeit [-n<N> -r<R> [-t|-c]] statement
1745 %timeit [-n<N> -r<R> [-t|-c]] statement
1746
1746
1747 Time execution of a Python statement or expression using the timeit
1747 Time execution of a Python statement or expression using the timeit
1748 module.
1748 module.
1749
1749
1750 Options:
1750 Options:
1751 -n<N>: execute the given statement <N> times in a loop. If this value
1751 -n<N>: execute the given statement <N> times in a loop. If this value
1752 is not given, a fitting value is chosen.
1752 is not given, a fitting value is chosen.
1753
1753
1754 -r<R>: repeat the loop iteration <R> times and take the best result.
1754 -r<R>: repeat the loop iteration <R> times and take the best result.
1755 Default: 3
1755 Default: 3
1756
1756
1757 -t: use time.time to measure the time, which is the default on Unix.
1757 -t: use time.time to measure the time, which is the default on Unix.
1758 This function measures wall time.
1758 This function measures wall time.
1759
1759
1760 -c: use time.clock to measure the time, which is the default on
1760 -c: use time.clock to measure the time, which is the default on
1761 Windows and measures wall time. On Unix, resource.getrusage is used
1761 Windows and measures wall time. On Unix, resource.getrusage is used
1762 instead and returns the CPU user time.
1762 instead and returns the CPU user time.
1763
1763
1764 -p<P>: use a precision of <P> digits to display the timing result.
1764 -p<P>: use a precision of <P> digits to display the timing result.
1765 Default: 3
1765 Default: 3
1766
1766
1767
1767
1768 Examples:
1768 Examples:
1769
1769
1770 In [1]: %timeit pass
1770 In [1]: %timeit pass
1771 10000000 loops, best of 3: 53.3 ns per loop
1771 10000000 loops, best of 3: 53.3 ns per loop
1772
1772
1773 In [2]: u = None
1773 In [2]: u = None
1774
1774
1775 In [3]: %timeit u is None
1775 In [3]: %timeit u is None
1776 10000000 loops, best of 3: 184 ns per loop
1776 10000000 loops, best of 3: 184 ns per loop
1777
1777
1778 In [4]: %timeit -r 4 u == None
1778 In [4]: %timeit -r 4 u == None
1779 1000000 loops, best of 4: 242 ns per loop
1779 1000000 loops, best of 4: 242 ns per loop
1780
1780
1781 In [5]: import time
1781 In [5]: import time
1782
1782
1783 In [6]: %timeit -n1 time.sleep(2)
1783 In [6]: %timeit -n1 time.sleep(2)
1784 1 loops, best of 3: 2 s per loop
1784 1 loops, best of 3: 2 s per loop
1785
1785
1786
1786
1787 The times reported by %timeit will be slightly higher than those
1787 The times reported by %timeit will be slightly higher than those
1788 reported by the timeit.py script when variables are accessed. This is
1788 reported by the timeit.py script when variables are accessed. This is
1789 due to the fact that %timeit executes the statement in the namespace
1789 due to the fact that %timeit executes the statement in the namespace
1790 of the shell, compared with timeit.py, which uses a single setup
1790 of the shell, compared with timeit.py, which uses a single setup
1791 statement to import function or create variables. Generally, the bias
1791 statement to import function or create variables. Generally, the bias
1792 does not matter as long as results from timeit.py are not mixed with
1792 does not matter as long as results from timeit.py are not mixed with
1793 those from %timeit."""
1793 those from %timeit."""
1794
1794
1795 import timeit
1795 import timeit
1796 import math
1796 import math
1797
1797
1798 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1798 # XXX: Unfortunately the unicode 'micro' symbol can cause problems in
1799 # certain terminals. Until we figure out a robust way of
1799 # certain terminals. Until we figure out a robust way of
1800 # auto-detecting if the terminal can deal with it, use plain 'us' for
1800 # auto-detecting if the terminal can deal with it, use plain 'us' for
1801 # microseconds. I am really NOT happy about disabling the proper
1801 # microseconds. I am really NOT happy about disabling the proper
1802 # 'micro' prefix, but crashing is worse... If anyone knows what the
1802 # 'micro' prefix, but crashing is worse... If anyone knows what the
1803 # right solution for this is, I'm all ears...
1803 # right solution for this is, I'm all ears...
1804 #
1804 #
1805 # Note: using
1805 # Note: using
1806 #
1806 #
1807 # s = u'\xb5'
1807 # s = u'\xb5'
1808 # s.encode(sys.getdefaultencoding())
1808 # s.encode(sys.getdefaultencoding())
1809 #
1809 #
1810 # is not sufficient, as I've seen terminals where that fails but
1810 # is not sufficient, as I've seen terminals where that fails but
1811 # print s
1811 # print s
1812 #
1812 #
1813 # succeeds
1813 # succeeds
1814 #
1814 #
1815 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1815 # See bug: https://bugs.launchpad.net/ipython/+bug/348466
1816
1816
1817 #units = [u"s", u"ms",u'\xb5',"ns"]
1817 #units = [u"s", u"ms",u'\xb5',"ns"]
1818 units = [u"s", u"ms",u'us',"ns"]
1818 units = [u"s", u"ms",u'us',"ns"]
1819
1819
1820 scaling = [1, 1e3, 1e6, 1e9]
1820 scaling = [1, 1e3, 1e6, 1e9]
1821
1821
1822 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1822 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1823 posix=False)
1823 posix=False)
1824 if stmt == "":
1824 if stmt == "":
1825 return
1825 return
1826 timefunc = timeit.default_timer
1826 timefunc = timeit.default_timer
1827 number = int(getattr(opts, "n", 0))
1827 number = int(getattr(opts, "n", 0))
1828 repeat = int(getattr(opts, "r", timeit.default_repeat))
1828 repeat = int(getattr(opts, "r", timeit.default_repeat))
1829 precision = int(getattr(opts, "p", 3))
1829 precision = int(getattr(opts, "p", 3))
1830 if hasattr(opts, "t"):
1830 if hasattr(opts, "t"):
1831 timefunc = time.time
1831 timefunc = time.time
1832 if hasattr(opts, "c"):
1832 if hasattr(opts, "c"):
1833 timefunc = clock
1833 timefunc = clock
1834
1834
1835 timer = timeit.Timer(timer=timefunc)
1835 timer = timeit.Timer(timer=timefunc)
1836 # this code has tight coupling to the inner workings of timeit.Timer,
1836 # this code has tight coupling to the inner workings of timeit.Timer,
1837 # but is there a better way to achieve that the code stmt has access
1837 # but is there a better way to achieve that the code stmt has access
1838 # to the shell namespace?
1838 # to the shell namespace?
1839
1839
1840 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1840 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1841 'setup': "pass"}
1841 'setup': "pass"}
1842 # Track compilation time so it can be reported if too long
1842 # Track compilation time so it can be reported if too long
1843 # Minimum time above which compilation time will be reported
1843 # Minimum time above which compilation time will be reported
1844 tc_min = 0.1
1844 tc_min = 0.1
1845
1845
1846 t0 = clock()
1846 t0 = clock()
1847 code = compile(src, "<magic-timeit>", "exec")
1847 code = compile(src, "<magic-timeit>", "exec")
1848 tc = clock()-t0
1848 tc = clock()-t0
1849
1849
1850 ns = {}
1850 ns = {}
1851 exec code in self.shell.user_ns, ns
1851 exec code in self.shell.user_ns, ns
1852 timer.inner = ns["inner"]
1852 timer.inner = ns["inner"]
1853
1853
1854 if number == 0:
1854 if number == 0:
1855 # determine number so that 0.2 <= total time < 2.0
1855 # determine number so that 0.2 <= total time < 2.0
1856 number = 1
1856 number = 1
1857 for i in range(1, 10):
1857 for i in range(1, 10):
1858 if timer.timeit(number) >= 0.2:
1858 if timer.timeit(number) >= 0.2:
1859 break
1859 break
1860 number *= 10
1860 number *= 10
1861
1861
1862 best = min(timer.repeat(repeat, number)) / number
1862 best = min(timer.repeat(repeat, number)) / number
1863
1863
1864 if best > 0.0 and best < 1000.0:
1864 if best > 0.0 and best < 1000.0:
1865 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1865 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1866 elif best >= 1000.0:
1866 elif best >= 1000.0:
1867 order = 0
1867 order = 0
1868 else:
1868 else:
1869 order = 3
1869 order = 3
1870 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1870 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1871 precision,
1871 precision,
1872 best * scaling[order],
1872 best * scaling[order],
1873 units[order])
1873 units[order])
1874 if tc > tc_min:
1874 if tc > tc_min:
1875 print "Compiler time: %.2f s" % tc
1875 print "Compiler time: %.2f s" % tc
1876
1876
1877 @testdec.skip_doctest
1877 @testdec.skip_doctest
1878 def magic_time(self,parameter_s = ''):
1878 def magic_time(self,parameter_s = ''):
1879 """Time execution of a Python statement or expression.
1879 """Time execution of a Python statement or expression.
1880
1880
1881 The CPU and wall clock times are printed, and the value of the
1881 The CPU and wall clock times are printed, and the value of the
1882 expression (if any) is returned. Note that under Win32, system time
1882 expression (if any) is returned. Note that under Win32, system time
1883 is always reported as 0, since it can not be measured.
1883 is always reported as 0, since it can not be measured.
1884
1884
1885 This function provides very basic timing functionality. In Python
1885 This function provides very basic timing functionality. In Python
1886 2.3, the timeit module offers more control and sophistication, so this
1886 2.3, the timeit module offers more control and sophistication, so this
1887 could be rewritten to use it (patches welcome).
1887 could be rewritten to use it (patches welcome).
1888
1888
1889 Some examples:
1889 Some examples:
1890
1890
1891 In [1]: time 2**128
1891 In [1]: time 2**128
1892 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1892 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1893 Wall time: 0.00
1893 Wall time: 0.00
1894 Out[1]: 340282366920938463463374607431768211456L
1894 Out[1]: 340282366920938463463374607431768211456L
1895
1895
1896 In [2]: n = 1000000
1896 In [2]: n = 1000000
1897
1897
1898 In [3]: time sum(range(n))
1898 In [3]: time sum(range(n))
1899 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1899 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1900 Wall time: 1.37
1900 Wall time: 1.37
1901 Out[3]: 499999500000L
1901 Out[3]: 499999500000L
1902
1902
1903 In [4]: time print 'hello world'
1903 In [4]: time print 'hello world'
1904 hello world
1904 hello world
1905 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1905 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1906 Wall time: 0.00
1906 Wall time: 0.00
1907
1907
1908 Note that the time needed by Python to compile the given expression
1908 Note that the time needed by Python to compile the given expression
1909 will be reported if it is more than 0.1s. In this example, the
1909 will be reported if it is more than 0.1s. In this example, the
1910 actual exponentiation is done by Python at compilation time, so while
1910 actual exponentiation is done by Python at compilation time, so while
1911 the expression can take a noticeable amount of time to compute, that
1911 the expression can take a noticeable amount of time to compute, that
1912 time is purely due to the compilation:
1912 time is purely due to the compilation:
1913
1913
1914 In [5]: time 3**9999;
1914 In [5]: time 3**9999;
1915 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1915 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1916 Wall time: 0.00 s
1916 Wall time: 0.00 s
1917
1917
1918 In [6]: time 3**999999;
1918 In [6]: time 3**999999;
1919 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1919 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1920 Wall time: 0.00 s
1920 Wall time: 0.00 s
1921 Compiler : 0.78 s
1921 Compiler : 0.78 s
1922 """
1922 """
1923
1923
1924 # fail immediately if the given expression can't be compiled
1924 # fail immediately if the given expression can't be compiled
1925
1925
1926 expr = self.shell.prefilter(parameter_s,False)
1926 expr = self.shell.prefilter(parameter_s,False)
1927
1927
1928 # Minimum time above which compilation time will be reported
1928 # Minimum time above which compilation time will be reported
1929 tc_min = 0.1
1929 tc_min = 0.1
1930
1930
1931 try:
1931 try:
1932 mode = 'eval'
1932 mode = 'eval'
1933 t0 = clock()
1933 t0 = clock()
1934 code = compile(expr,'<timed eval>',mode)
1934 code = compile(expr,'<timed eval>',mode)
1935 tc = clock()-t0
1935 tc = clock()-t0
1936 except SyntaxError:
1936 except SyntaxError:
1937 mode = 'exec'
1937 mode = 'exec'
1938 t0 = clock()
1938 t0 = clock()
1939 code = compile(expr,'<timed exec>',mode)
1939 code = compile(expr,'<timed exec>',mode)
1940 tc = clock()-t0
1940 tc = clock()-t0
1941 # skew measurement as little as possible
1941 # skew measurement as little as possible
1942 glob = self.shell.user_ns
1942 glob = self.shell.user_ns
1943 clk = clock2
1943 clk = clock2
1944 wtime = time.time
1944 wtime = time.time
1945 # time execution
1945 # time execution
1946 wall_st = wtime()
1946 wall_st = wtime()
1947 if mode=='eval':
1947 if mode=='eval':
1948 st = clk()
1948 st = clk()
1949 out = eval(code,glob)
1949 out = eval(code,glob)
1950 end = clk()
1950 end = clk()
1951 else:
1951 else:
1952 st = clk()
1952 st = clk()
1953 exec code in glob
1953 exec code in glob
1954 end = clk()
1954 end = clk()
1955 out = None
1955 out = None
1956 wall_end = wtime()
1956 wall_end = wtime()
1957 # Compute actual times and report
1957 # Compute actual times and report
1958 wall_time = wall_end-wall_st
1958 wall_time = wall_end-wall_st
1959 cpu_user = end[0]-st[0]
1959 cpu_user = end[0]-st[0]
1960 cpu_sys = end[1]-st[1]
1960 cpu_sys = end[1]-st[1]
1961 cpu_tot = cpu_user+cpu_sys
1961 cpu_tot = cpu_user+cpu_sys
1962 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1962 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1963 (cpu_user,cpu_sys,cpu_tot)
1963 (cpu_user,cpu_sys,cpu_tot)
1964 print "Wall time: %.2f s" % wall_time
1964 print "Wall time: %.2f s" % wall_time
1965 if tc > tc_min:
1965 if tc > tc_min:
1966 print "Compiler : %.2f s" % tc
1966 print "Compiler : %.2f s" % tc
1967 return out
1967 return out
1968
1968
1969 @testdec.skip_doctest
1969 @testdec.skip_doctest
1970 def magic_macro(self,parameter_s = ''):
1970 def magic_macro(self,parameter_s = ''):
1971 """Define a set of input lines as a macro for future re-execution.
1971 """Define a set of input lines as a macro for future re-execution.
1972
1972
1973 Usage:\\
1973 Usage:\\
1974 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1974 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1975
1975
1976 Options:
1976 Options:
1977
1977
1978 -r: use 'raw' input. By default, the 'processed' history is used,
1978 -r: use 'raw' input. By default, the 'processed' history is used,
1979 so that magics are loaded in their transformed version to valid
1979 so that magics are loaded in their transformed version to valid
1980 Python. If this option is given, the raw input as typed as the
1980 Python. If this option is given, the raw input as typed as the
1981 command line is used instead.
1981 command line is used instead.
1982
1982
1983 This will define a global variable called `name` which is a string
1983 This will define a global variable called `name` which is a string
1984 made of joining the slices and lines you specify (n1,n2,... numbers
1984 made of joining the slices and lines you specify (n1,n2,... numbers
1985 above) from your input history into a single string. This variable
1985 above) from your input history into a single string. This variable
1986 acts like an automatic function which re-executes those lines as if
1986 acts like an automatic function which re-executes those lines as if
1987 you had typed them. You just type 'name' at the prompt and the code
1987 you had typed them. You just type 'name' at the prompt and the code
1988 executes.
1988 executes.
1989
1989
1990 The notation for indicating number ranges is: n1-n2 means 'use line
1990 The notation for indicating number ranges is: n1-n2 means 'use line
1991 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1991 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1992 using the lines numbered 5,6 and 7.
1992 using the lines numbered 5,6 and 7.
1993
1993
1994 Note: as a 'hidden' feature, you can also use traditional python slice
1994 Note: as a 'hidden' feature, you can also use traditional python slice
1995 notation, where N:M means numbers N through M-1.
1995 notation, where N:M means numbers N through M-1.
1996
1996
1997 For example, if your history contains (%hist prints it):
1997 For example, if your history contains (%hist prints it):
1998
1998
1999 44: x=1
1999 44: x=1
2000 45: y=3
2000 45: y=3
2001 46: z=x+y
2001 46: z=x+y
2002 47: print x
2002 47: print x
2003 48: a=5
2003 48: a=5
2004 49: print 'x',x,'y',y
2004 49: print 'x',x,'y',y
2005
2005
2006 you can create a macro with lines 44 through 47 (included) and line 49
2006 you can create a macro with lines 44 through 47 (included) and line 49
2007 called my_macro with:
2007 called my_macro with:
2008
2008
2009 In [55]: %macro my_macro 44-47 49
2009 In [55]: %macro my_macro 44-47 49
2010
2010
2011 Now, typing `my_macro` (without quotes) will re-execute all this code
2011 Now, typing `my_macro` (without quotes) will re-execute all this code
2012 in one pass.
2012 in one pass.
2013
2013
2014 You don't need to give the line-numbers in order, and any given line
2014 You don't need to give the line-numbers in order, and any given line
2015 number can appear multiple times. You can assemble macros with any
2015 number can appear multiple times. You can assemble macros with any
2016 lines from your input history in any order.
2016 lines from your input history in any order.
2017
2017
2018 The macro is a simple object which holds its value in an attribute,
2018 The macro is a simple object which holds its value in an attribute,
2019 but IPython's display system checks for macros and executes them as
2019 but IPython's display system checks for macros and executes them as
2020 code instead of printing them when you type their name.
2020 code instead of printing them when you type their name.
2021
2021
2022 You can view a macro's contents by explicitly printing it with:
2022 You can view a macro's contents by explicitly printing it with:
2023
2023
2024 'print macro_name'.
2024 'print macro_name'.
2025
2025
2026 For one-off cases which DON'T contain magic function calls in them you
2026 For one-off cases which DON'T contain magic function calls in them you
2027 can obtain similar results by explicitly executing slices from your
2027 can obtain similar results by explicitly executing slices from your
2028 input history with:
2028 input history with:
2029
2029
2030 In [60]: exec In[44:48]+In[49]"""
2030 In [60]: exec In[44:48]+In[49]"""
2031
2031
2032 opts,args = self.parse_options(parameter_s,'r',mode='list')
2032 opts,args = self.parse_options(parameter_s,'r',mode='list')
2033 if not args:
2033 if not args:
2034 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
2034 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
2035 macs.sort()
2035 macs.sort()
2036 return macs
2036 return macs
2037 if len(args) == 1:
2037 if len(args) == 1:
2038 raise UsageError(
2038 raise UsageError(
2039 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2039 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2040 name,ranges = args[0], args[1:]
2040 name,ranges = args[0], args[1:]
2041
2041
2042 #print 'rng',ranges # dbg
2042 #print 'rng',ranges # dbg
2043 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2043 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2044 macro = Macro("\n".join(lines))
2044 macro = Macro("\n".join(lines))
2045 self.shell.define_macro(name, macro)
2045 self.shell.define_macro(name, macro)
2046 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2046 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2047 print 'Macro contents:'
2047 print 'Macro contents:'
2048 print macro,
2048 print macro,
2049
2049
2050 def magic_save(self,parameter_s = ''):
2050 def magic_save(self,parameter_s = ''):
2051 """Save a set of lines to a given filename.
2051 """Save a set of lines to a given filename.
2052
2052
2053 Usage:\\
2053 Usage:\\
2054 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2054 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2055
2055
2056 Options:
2056 Options:
2057
2057
2058 -r: use 'raw' input. By default, the 'processed' history is used,
2058 -r: use 'raw' input. By default, the 'processed' history is used,
2059 so that magics are loaded in their transformed version to valid
2059 so that magics are loaded in their transformed version to valid
2060 Python. If this option is given, the raw input as typed as the
2060 Python. If this option is given, the raw input as typed as the
2061 command line is used instead.
2061 command line is used instead.
2062
2062
2063 This function uses the same syntax as %macro for line extraction, but
2063 This function uses the same syntax as %macro for line extraction, but
2064 instead of creating a macro it saves the resulting string to the
2064 instead of creating a macro it saves the resulting string to the
2065 filename you specify.
2065 filename you specify.
2066
2066
2067 It adds a '.py' extension to the file if you don't do so yourself, and
2067 It adds a '.py' extension to the file if you don't do so yourself, and
2068 it asks for confirmation before overwriting existing files."""
2068 it asks for confirmation before overwriting existing files."""
2069
2069
2070 opts,args = self.parse_options(parameter_s,'r',mode='list')
2070 opts,args = self.parse_options(parameter_s,'r',mode='list')
2071 fname,ranges = args[0], args[1:]
2071 fname,ranges = args[0], args[1:]
2072 if not fname.endswith('.py'):
2072 if not fname.endswith('.py'):
2073 fname += '.py'
2073 fname += '.py'
2074 if os.path.isfile(fname):
2074 if os.path.isfile(fname):
2075 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2075 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2076 if ans.lower() not in ['y','yes']:
2076 if ans.lower() not in ['y','yes']:
2077 print 'Operation cancelled.'
2077 print 'Operation cancelled.'
2078 return
2078 return
2079 cmds = '\n'.join(self.extract_input_slices(ranges,opts.has_key('r')))
2079 cmds = '\n'.join(self.extract_input_slices(ranges,opts.has_key('r')))
2080 with open(fname,'w') as f:
2080 with open(fname,'w') as f:
2081 f.write(cmds)
2081 f.write(cmds)
2082 print 'The following commands were written to file `%s`:' % fname
2082 print 'The following commands were written to file `%s`:' % fname
2083 print cmds
2083 print cmds
2084
2084
2085 def _edit_macro(self,mname,macro):
2085 def _edit_macro(self,mname,macro):
2086 """open an editor with the macro data in a file"""
2086 """open an editor with the macro data in a file"""
2087 filename = self.shell.mktempfile(macro.value)
2087 filename = self.shell.mktempfile(macro.value)
2088 self.shell.hooks.editor(filename)
2088 self.shell.hooks.editor(filename)
2089
2089
2090 # and make a new macro object, to replace the old one
2090 # and make a new macro object, to replace the old one
2091 mfile = open(filename)
2091 mfile = open(filename)
2092 mvalue = mfile.read()
2092 mvalue = mfile.read()
2093 mfile.close()
2093 mfile.close()
2094 self.shell.user_ns[mname] = Macro(mvalue)
2094 self.shell.user_ns[mname] = Macro(mvalue)
2095
2095
2096 def magic_ed(self,parameter_s=''):
2096 def magic_ed(self,parameter_s=''):
2097 """Alias to %edit."""
2097 """Alias to %edit."""
2098 return self.magic_edit(parameter_s)
2098 return self.magic_edit(parameter_s)
2099
2099
2100 @testdec.skip_doctest
2100 @testdec.skip_doctest
2101 def magic_edit(self,parameter_s='',last_call=['','']):
2101 def magic_edit(self,parameter_s='',last_call=['','']):
2102 """Bring up an editor and execute the resulting code.
2102 """Bring up an editor and execute the resulting code.
2103
2103
2104 Usage:
2104 Usage:
2105 %edit [options] [args]
2105 %edit [options] [args]
2106
2106
2107 %edit runs IPython's editor hook. The default version of this hook is
2107 %edit runs IPython's editor hook. The default version of this hook is
2108 set to call the __IPYTHON__.rc.editor command. This is read from your
2108 set to call the __IPYTHON__.rc.editor command. This is read from your
2109 environment variable $EDITOR. If this isn't found, it will default to
2109 environment variable $EDITOR. If this isn't found, it will default to
2110 vi under Linux/Unix and to notepad under Windows. See the end of this
2110 vi under Linux/Unix and to notepad under Windows. See the end of this
2111 docstring for how to change the editor hook.
2111 docstring for how to change the editor hook.
2112
2112
2113 You can also set the value of this editor via the command line option
2113 You can also set the value of this editor via the command line option
2114 '-editor' or in your ipythonrc file. This is useful if you wish to use
2114 '-editor' or in your ipythonrc file. This is useful if you wish to use
2115 specifically for IPython an editor different from your typical default
2115 specifically for IPython an editor different from your typical default
2116 (and for Windows users who typically don't set environment variables).
2116 (and for Windows users who typically don't set environment variables).
2117
2117
2118 This command allows you to conveniently edit multi-line code right in
2118 This command allows you to conveniently edit multi-line code right in
2119 your IPython session.
2119 your IPython session.
2120
2120
2121 If called without arguments, %edit opens up an empty editor with a
2121 If called without arguments, %edit opens up an empty editor with a
2122 temporary file and will execute the contents of this file when you
2122 temporary file and will execute the contents of this file when you
2123 close it (don't forget to save it!).
2123 close it (don't forget to save it!).
2124
2124
2125
2125
2126 Options:
2126 Options:
2127
2127
2128 -n <number>: open the editor at a specified line number. By default,
2128 -n <number>: open the editor at a specified line number. By default,
2129 the IPython editor hook uses the unix syntax 'editor +N filename', but
2129 the IPython editor hook uses the unix syntax 'editor +N filename', but
2130 you can configure this by providing your own modified hook if your
2130 you can configure this by providing your own modified hook if your
2131 favorite editor supports line-number specifications with a different
2131 favorite editor supports line-number specifications with a different
2132 syntax.
2132 syntax.
2133
2133
2134 -p: this will call the editor with the same data as the previous time
2134 -p: this will call the editor with the same data as the previous time
2135 it was used, regardless of how long ago (in your current session) it
2135 it was used, regardless of how long ago (in your current session) it
2136 was.
2136 was.
2137
2137
2138 -r: use 'raw' input. This option only applies to input taken from the
2138 -r: use 'raw' input. This option only applies to input taken from the
2139 user's history. By default, the 'processed' history is used, so that
2139 user's history. By default, the 'processed' history is used, so that
2140 magics are loaded in their transformed version to valid Python. If
2140 magics are loaded in their transformed version to valid Python. If
2141 this option is given, the raw input as typed as the command line is
2141 this option is given, the raw input as typed as the command line is
2142 used instead. When you exit the editor, it will be executed by
2142 used instead. When you exit the editor, it will be executed by
2143 IPython's own processor.
2143 IPython's own processor.
2144
2144
2145 -x: do not execute the edited code immediately upon exit. This is
2145 -x: do not execute the edited code immediately upon exit. This is
2146 mainly useful if you are editing programs which need to be called with
2146 mainly useful if you are editing programs which need to be called with
2147 command line arguments, which you can then do using %run.
2147 command line arguments, which you can then do using %run.
2148
2148
2149
2149
2150 Arguments:
2150 Arguments:
2151
2151
2152 If arguments are given, the following possibilites exist:
2152 If arguments are given, the following possibilites exist:
2153
2153
2154 - The arguments are numbers or pairs of colon-separated numbers (like
2154 - The arguments are numbers or pairs of colon-separated numbers (like
2155 1 4:8 9). These are interpreted as lines of previous input to be
2155 1 4:8 9). These are interpreted as lines of previous input to be
2156 loaded into the editor. The syntax is the same of the %macro command.
2156 loaded into the editor. The syntax is the same of the %macro command.
2157
2157
2158 - If the argument doesn't start with a number, it is evaluated as a
2158 - If the argument doesn't start with a number, it is evaluated as a
2159 variable and its contents loaded into the editor. You can thus edit
2159 variable and its contents loaded into the editor. You can thus edit
2160 any string which contains python code (including the result of
2160 any string which contains python code (including the result of
2161 previous edits).
2161 previous edits).
2162
2162
2163 - If the argument is the name of an object (other than a string),
2163 - If the argument is the name of an object (other than a string),
2164 IPython will try to locate the file where it was defined and open the
2164 IPython will try to locate the file where it was defined and open the
2165 editor at the point where it is defined. You can use `%edit function`
2165 editor at the point where it is defined. You can use `%edit function`
2166 to load an editor exactly at the point where 'function' is defined,
2166 to load an editor exactly at the point where 'function' is defined,
2167 edit it and have the file be executed automatically.
2167 edit it and have the file be executed automatically.
2168
2168
2169 If the object is a macro (see %macro for details), this opens up your
2169 If the object is a macro (see %macro for details), this opens up your
2170 specified editor with a temporary file containing the macro's data.
2170 specified editor with a temporary file containing the macro's data.
2171 Upon exit, the macro is reloaded with the contents of the file.
2171 Upon exit, the macro is reloaded with the contents of the file.
2172
2172
2173 Note: opening at an exact line is only supported under Unix, and some
2173 Note: opening at an exact line is only supported under Unix, and some
2174 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2174 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2175 '+NUMBER' parameter necessary for this feature. Good editors like
2175 '+NUMBER' parameter necessary for this feature. Good editors like
2176 (X)Emacs, vi, jed, pico and joe all do.
2176 (X)Emacs, vi, jed, pico and joe all do.
2177
2177
2178 - If the argument is not found as a variable, IPython will look for a
2178 - If the argument is not found as a variable, IPython will look for a
2179 file with that name (adding .py if necessary) and load it into the
2179 file with that name (adding .py if necessary) and load it into the
2180 editor. It will execute its contents with execfile() when you exit,
2180 editor. It will execute its contents with execfile() when you exit,
2181 loading any code in the file into your interactive namespace.
2181 loading any code in the file into your interactive namespace.
2182
2182
2183 After executing your code, %edit will return as output the code you
2183 After executing your code, %edit will return as output the code you
2184 typed in the editor (except when it was an existing file). This way
2184 typed in the editor (except when it was an existing file). This way
2185 you can reload the code in further invocations of %edit as a variable,
2185 you can reload the code in further invocations of %edit as a variable,
2186 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2186 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2187 the output.
2187 the output.
2188
2188
2189 Note that %edit is also available through the alias %ed.
2189 Note that %edit is also available through the alias %ed.
2190
2190
2191 This is an example of creating a simple function inside the editor and
2191 This is an example of creating a simple function inside the editor and
2192 then modifying it. First, start up the editor:
2192 then modifying it. First, start up the editor:
2193
2193
2194 In [1]: ed
2194 In [1]: ed
2195 Editing... done. Executing edited code...
2195 Editing... done. Executing edited code...
2196 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2196 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2197
2197
2198 We can then call the function foo():
2198 We can then call the function foo():
2199
2199
2200 In [2]: foo()
2200 In [2]: foo()
2201 foo() was defined in an editing session
2201 foo() was defined in an editing session
2202
2202
2203 Now we edit foo. IPython automatically loads the editor with the
2203 Now we edit foo. IPython automatically loads the editor with the
2204 (temporary) file where foo() was previously defined:
2204 (temporary) file where foo() was previously defined:
2205
2205
2206 In [3]: ed foo
2206 In [3]: ed foo
2207 Editing... done. Executing edited code...
2207 Editing... done. Executing edited code...
2208
2208
2209 And if we call foo() again we get the modified version:
2209 And if we call foo() again we get the modified version:
2210
2210
2211 In [4]: foo()
2211 In [4]: foo()
2212 foo() has now been changed!
2212 foo() has now been changed!
2213
2213
2214 Here is an example of how to edit a code snippet successive
2214 Here is an example of how to edit a code snippet successive
2215 times. First we call the editor:
2215 times. First we call the editor:
2216
2216
2217 In [5]: ed
2217 In [5]: ed
2218 Editing... done. Executing edited code...
2218 Editing... done. Executing edited code...
2219 hello
2219 hello
2220 Out[5]: "print 'hello'n"
2220 Out[5]: "print 'hello'n"
2221
2221
2222 Now we call it again with the previous output (stored in _):
2222 Now we call it again with the previous output (stored in _):
2223
2223
2224 In [6]: ed _
2224 In [6]: ed _
2225 Editing... done. Executing edited code...
2225 Editing... done. Executing edited code...
2226 hello world
2226 hello world
2227 Out[6]: "print 'hello world'n"
2227 Out[6]: "print 'hello world'n"
2228
2228
2229 Now we call it with the output #8 (stored in _8, also as Out[8]):
2229 Now we call it with the output #8 (stored in _8, also as Out[8]):
2230
2230
2231 In [7]: ed _8
2231 In [7]: ed _8
2232 Editing... done. Executing edited code...
2232 Editing... done. Executing edited code...
2233 hello again
2233 hello again
2234 Out[7]: "print 'hello again'n"
2234 Out[7]: "print 'hello again'n"
2235
2235
2236
2236
2237 Changing the default editor hook:
2237 Changing the default editor hook:
2238
2238
2239 If you wish to write your own editor hook, you can put it in a
2239 If you wish to write your own editor hook, you can put it in a
2240 configuration file which you load at startup time. The default hook
2240 configuration file which you load at startup time. The default hook
2241 is defined in the IPython.core.hooks module, and you can use that as a
2241 is defined in the IPython.core.hooks module, and you can use that as a
2242 starting example for further modifications. That file also has
2242 starting example for further modifications. That file also has
2243 general instructions on how to set a new hook for use once you've
2243 general instructions on how to set a new hook for use once you've
2244 defined it."""
2244 defined it."""
2245
2245
2246 # FIXME: This function has become a convoluted mess. It needs a
2246 # FIXME: This function has become a convoluted mess. It needs a
2247 # ground-up rewrite with clean, simple logic.
2247 # ground-up rewrite with clean, simple logic.
2248
2248
2249 def make_filename(arg):
2249 def make_filename(arg):
2250 "Make a filename from the given args"
2250 "Make a filename from the given args"
2251 try:
2251 try:
2252 filename = get_py_filename(arg)
2252 filename = get_py_filename(arg)
2253 except IOError:
2253 except IOError:
2254 if args.endswith('.py'):
2254 if args.endswith('.py'):
2255 filename = arg
2255 filename = arg
2256 else:
2256 else:
2257 filename = None
2257 filename = None
2258 return filename
2258 return filename
2259
2259
2260 # custom exceptions
2260 # custom exceptions
2261 class DataIsObject(Exception): pass
2261 class DataIsObject(Exception): pass
2262
2262
2263 opts,args = self.parse_options(parameter_s,'prxn:')
2263 opts,args = self.parse_options(parameter_s,'prxn:')
2264 # Set a few locals from the options for convenience:
2264 # Set a few locals from the options for convenience:
2265 opts_p = opts.has_key('p')
2265 opts_p = opts.has_key('p')
2266 opts_r = opts.has_key('r')
2266 opts_r = opts.has_key('r')
2267
2267
2268 # Default line number value
2268 # Default line number value
2269 lineno = opts.get('n',None)
2269 lineno = opts.get('n',None)
2270
2270
2271 if opts_p:
2271 if opts_p:
2272 args = '_%s' % last_call[0]
2272 args = '_%s' % last_call[0]
2273 if not self.shell.user_ns.has_key(args):
2273 if not self.shell.user_ns.has_key(args):
2274 args = last_call[1]
2274 args = last_call[1]
2275
2275
2276 # use last_call to remember the state of the previous call, but don't
2276 # use last_call to remember the state of the previous call, but don't
2277 # let it be clobbered by successive '-p' calls.
2277 # let it be clobbered by successive '-p' calls.
2278 try:
2278 try:
2279 last_call[0] = self.shell.displayhook.prompt_count
2279 last_call[0] = self.shell.displayhook.prompt_count
2280 if not opts_p:
2280 if not opts_p:
2281 last_call[1] = parameter_s
2281 last_call[1] = parameter_s
2282 except:
2282 except:
2283 pass
2283 pass
2284
2284
2285 # by default this is done with temp files, except when the given
2285 # by default this is done with temp files, except when the given
2286 # arg is a filename
2286 # arg is a filename
2287 use_temp = 1
2287 use_temp = True
2288
2288
2289 if re.match(r'\d',args):
2289 data = ''
2290 if args[0].isdigit():
2290 # Mode where user specifies ranges of lines, like in %macro.
2291 # Mode where user specifies ranges of lines, like in %macro.
2291 # This means that you can't edit files whose names begin with
2292 # This means that you can't edit files whose names begin with
2292 # numbers this way. Tough.
2293 # numbers this way. Tough.
2293 ranges = args.split()
2294 ranges = args.split()
2294 data = '\n'.join(self.extract_input_slices(ranges,opts_r))
2295 data = '\n'.join(self.extract_input_slices(ranges,opts_r))
2295 elif args.endswith('.py'):
2296 elif args.endswith('.py'):
2296 filename = make_filename(args)
2297 filename = make_filename(args)
2297 data = ''
2298 use_temp = False
2298 use_temp = 0
2299 elif args:
2299 elif args:
2300 try:
2300 try:
2301 # Load the parameter given as a variable. If not a string,
2301 # Load the parameter given as a variable. If not a string,
2302 # process it as an object instead (below)
2302 # process it as an object instead (below)
2303
2303
2304 #print '*** args',args,'type',type(args) # dbg
2304 #print '*** args',args,'type',type(args) # dbg
2305 data = eval(args,self.shell.user_ns)
2305 data = eval(args, self.shell.user_ns)
2306 if not type(data) in StringTypes:
2306 if not isinstance(data, basestring):
2307 raise DataIsObject
2307 raise DataIsObject
2308
2308
2309 except (NameError,SyntaxError):
2309 except (NameError,SyntaxError):
2310 # given argument is not a variable, try as a filename
2310 # given argument is not a variable, try as a filename
2311 filename = make_filename(args)
2311 filename = make_filename(args)
2312 if filename is None:
2312 if filename is None:
2313 warn("Argument given (%s) can't be found as a variable "
2313 warn("Argument given (%s) can't be found as a variable "
2314 "or as a filename." % args)
2314 "or as a filename." % args)
2315 return
2315 return
2316
2316 use_temp = False
2317 data = ''
2317
2318 use_temp = 0
2319 except DataIsObject:
2318 except DataIsObject:
2320
2321 # macros have a special edit function
2319 # macros have a special edit function
2322 if isinstance(data,Macro):
2320 if isinstance(data, Macro):
2323 self._edit_macro(args,data)
2321 self._edit_macro(args,data)
2324 return
2322 return
2325
2323
2326 # For objects, try to edit the file where they are defined
2324 # For objects, try to edit the file where they are defined
2327 try:
2325 try:
2328 filename = inspect.getabsfile(data)
2326 filename = inspect.getabsfile(data)
2329 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2327 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2330 # class created by %edit? Try to find source
2328 # class created by %edit? Try to find source
2331 # by looking for method definitions instead, the
2329 # by looking for method definitions instead, the
2332 # __module__ in those classes is FakeModule.
2330 # __module__ in those classes is FakeModule.
2333 attrs = [getattr(data, aname) for aname in dir(data)]
2331 attrs = [getattr(data, aname) for aname in dir(data)]
2334 for attr in attrs:
2332 for attr in attrs:
2335 if not inspect.ismethod(attr):
2333 if not inspect.ismethod(attr):
2336 continue
2334 continue
2337 filename = inspect.getabsfile(attr)
2335 filename = inspect.getabsfile(attr)
2338 if filename and 'fakemodule' not in filename.lower():
2336 if filename and 'fakemodule' not in filename.lower():
2339 # change the attribute to be the edit target instead
2337 # change the attribute to be the edit target instead
2340 data = attr
2338 data = attr
2341 break
2339 break
2342
2340
2343 datafile = 1
2341 datafile = 1
2344 except TypeError:
2342 except TypeError:
2345 filename = make_filename(args)
2343 filename = make_filename(args)
2346 datafile = 1
2344 datafile = 1
2347 warn('Could not find file where `%s` is defined.\n'
2345 warn('Could not find file where `%s` is defined.\n'
2348 'Opening a file named `%s`' % (args,filename))
2346 'Opening a file named `%s`' % (args,filename))
2349 # Now, make sure we can actually read the source (if it was in
2347 # Now, make sure we can actually read the source (if it was in
2350 # a temp file it's gone by now).
2348 # a temp file it's gone by now).
2351 if datafile:
2349 if datafile:
2352 try:
2350 try:
2353 if lineno is None:
2351 if lineno is None:
2354 lineno = inspect.getsourcelines(data)[1]
2352 lineno = inspect.getsourcelines(data)[1]
2355 except IOError:
2353 except IOError:
2356 filename = make_filename(args)
2354 filename = make_filename(args)
2357 if filename is None:
2355 if filename is None:
2358 warn('The file `%s` where `%s` was defined cannot '
2356 warn('The file `%s` where `%s` was defined cannot '
2359 'be read.' % (filename,data))
2357 'be read.' % (filename,data))
2360 return
2358 return
2361 use_temp = 0
2359 use_temp = False
2362 else:
2363 data = ''
2364
2360
2365 if use_temp:
2361 if use_temp:
2366 filename = self.shell.mktempfile(data)
2362 filename = self.shell.mktempfile(data)
2367 print 'IPython will make a temporary file named:',filename
2363 print 'IPython will make a temporary file named:',filename
2368
2364
2369 # do actual editing here
2365 # do actual editing here
2370 print 'Editing...',
2366 print 'Editing...',
2371 sys.stdout.flush()
2367 sys.stdout.flush()
2372 try:
2368 try:
2373 # Quote filenames that may have spaces in them
2369 # Quote filenames that may have spaces in them
2374 if ' ' in filename:
2370 if ' ' in filename:
2375 filename = "%s" % filename
2371 filename = "%s" % filename
2376 self.shell.hooks.editor(filename,lineno)
2372 self.shell.hooks.editor(filename,lineno)
2377 except TryNext:
2373 except TryNext:
2378 warn('Could not open editor')
2374 warn('Could not open editor')
2379 return
2375 return
2380
2376
2381 # XXX TODO: should this be generalized for all string vars?
2377 # XXX TODO: should this be generalized for all string vars?
2382 # For now, this is special-cased to blocks created by cpaste
2378 # For now, this is special-cased to blocks created by cpaste
2383 if args.strip() == 'pasted_block':
2379 if args.strip() == 'pasted_block':
2384 self.shell.user_ns['pasted_block'] = file_read(filename)
2380 self.shell.user_ns['pasted_block'] = file_read(filename)
2385
2381
2386 if opts.has_key('x'): # -x prevents actual execution
2382 if 'x' in opts: # -x prevents actual execution
2387 print
2383 print
2388 else:
2384 else:
2389 print 'done. Executing edited code...'
2385 print 'done. Executing edited code...'
2390 if opts_r:
2386 if opts_r:
2391 self.shell.run_cell(file_read(filename))
2387 self.shell.run_cell(file_read(filename))
2392 else:
2388 else:
2393 self.shell.safe_execfile(filename,self.shell.user_ns,
2389 self.shell.safe_execfile(filename,self.shell.user_ns,
2394 self.shell.user_ns)
2390 self.shell.user_ns)
2395
2391
2396
2392
2397 if use_temp:
2393 if use_temp:
2398 try:
2394 try:
2399 return open(filename).read()
2395 return open(filename).read()
2400 except IOError,msg:
2396 except IOError,msg:
2401 if msg.filename == filename:
2397 if msg.filename == filename:
2402 warn('File not found. Did you forget to save?')
2398 warn('File not found. Did you forget to save?')
2403 return
2399 return
2404 else:
2400 else:
2405 self.shell.showtraceback()
2401 self.shell.showtraceback()
2406
2402
2407 def magic_xmode(self,parameter_s = ''):
2403 def magic_xmode(self,parameter_s = ''):
2408 """Switch modes for the exception handlers.
2404 """Switch modes for the exception handlers.
2409
2405
2410 Valid modes: Plain, Context and Verbose.
2406 Valid modes: Plain, Context and Verbose.
2411
2407
2412 If called without arguments, acts as a toggle."""
2408 If called without arguments, acts as a toggle."""
2413
2409
2414 def xmode_switch_err(name):
2410 def xmode_switch_err(name):
2415 warn('Error changing %s exception modes.\n%s' %
2411 warn('Error changing %s exception modes.\n%s' %
2416 (name,sys.exc_info()[1]))
2412 (name,sys.exc_info()[1]))
2417
2413
2418 shell = self.shell
2414 shell = self.shell
2419 new_mode = parameter_s.strip().capitalize()
2415 new_mode = parameter_s.strip().capitalize()
2420 try:
2416 try:
2421 shell.InteractiveTB.set_mode(mode=new_mode)
2417 shell.InteractiveTB.set_mode(mode=new_mode)
2422 print 'Exception reporting mode:',shell.InteractiveTB.mode
2418 print 'Exception reporting mode:',shell.InteractiveTB.mode
2423 except:
2419 except:
2424 xmode_switch_err('user')
2420 xmode_switch_err('user')
2425
2421
2426 def magic_colors(self,parameter_s = ''):
2422 def magic_colors(self,parameter_s = ''):
2427 """Switch color scheme for prompts, info system and exception handlers.
2423 """Switch color scheme for prompts, info system and exception handlers.
2428
2424
2429 Currently implemented schemes: NoColor, Linux, LightBG.
2425 Currently implemented schemes: NoColor, Linux, LightBG.
2430
2426
2431 Color scheme names are not case-sensitive.
2427 Color scheme names are not case-sensitive.
2432
2428
2433 Examples
2429 Examples
2434 --------
2430 --------
2435 To get a plain black and white terminal::
2431 To get a plain black and white terminal::
2436
2432
2437 %colors nocolor
2433 %colors nocolor
2438 """
2434 """
2439
2435
2440 def color_switch_err(name):
2436 def color_switch_err(name):
2441 warn('Error changing %s color schemes.\n%s' %
2437 warn('Error changing %s color schemes.\n%s' %
2442 (name,sys.exc_info()[1]))
2438 (name,sys.exc_info()[1]))
2443
2439
2444
2440
2445 new_scheme = parameter_s.strip()
2441 new_scheme = parameter_s.strip()
2446 if not new_scheme:
2442 if not new_scheme:
2447 raise UsageError(
2443 raise UsageError(
2448 "%colors: you must specify a color scheme. See '%colors?'")
2444 "%colors: you must specify a color scheme. See '%colors?'")
2449 return
2445 return
2450 # local shortcut
2446 # local shortcut
2451 shell = self.shell
2447 shell = self.shell
2452
2448
2453 import IPython.utils.rlineimpl as readline
2449 import IPython.utils.rlineimpl as readline
2454
2450
2455 if not readline.have_readline and sys.platform == "win32":
2451 if not readline.have_readline and sys.platform == "win32":
2456 msg = """\
2452 msg = """\
2457 Proper color support under MS Windows requires the pyreadline library.
2453 Proper color support under MS Windows requires the pyreadline library.
2458 You can find it at:
2454 You can find it at:
2459 http://ipython.scipy.org/moin/PyReadline/Intro
2455 http://ipython.scipy.org/moin/PyReadline/Intro
2460 Gary's readline needs the ctypes module, from:
2456 Gary's readline needs the ctypes module, from:
2461 http://starship.python.net/crew/theller/ctypes
2457 http://starship.python.net/crew/theller/ctypes
2462 (Note that ctypes is already part of Python versions 2.5 and newer).
2458 (Note that ctypes is already part of Python versions 2.5 and newer).
2463
2459
2464 Defaulting color scheme to 'NoColor'"""
2460 Defaulting color scheme to 'NoColor'"""
2465 new_scheme = 'NoColor'
2461 new_scheme = 'NoColor'
2466 warn(msg)
2462 warn(msg)
2467
2463
2468 # readline option is 0
2464 # readline option is 0
2469 if not shell.has_readline:
2465 if not shell.has_readline:
2470 new_scheme = 'NoColor'
2466 new_scheme = 'NoColor'
2471
2467
2472 # Set prompt colors
2468 # Set prompt colors
2473 try:
2469 try:
2474 shell.displayhook.set_colors(new_scheme)
2470 shell.displayhook.set_colors(new_scheme)
2475 except:
2471 except:
2476 color_switch_err('prompt')
2472 color_switch_err('prompt')
2477 else:
2473 else:
2478 shell.colors = \
2474 shell.colors = \
2479 shell.displayhook.color_table.active_scheme_name
2475 shell.displayhook.color_table.active_scheme_name
2480 # Set exception colors
2476 # Set exception colors
2481 try:
2477 try:
2482 shell.InteractiveTB.set_colors(scheme = new_scheme)
2478 shell.InteractiveTB.set_colors(scheme = new_scheme)
2483 shell.SyntaxTB.set_colors(scheme = new_scheme)
2479 shell.SyntaxTB.set_colors(scheme = new_scheme)
2484 except:
2480 except:
2485 color_switch_err('exception')
2481 color_switch_err('exception')
2486
2482
2487 # Set info (for 'object?') colors
2483 # Set info (for 'object?') colors
2488 if shell.color_info:
2484 if shell.color_info:
2489 try:
2485 try:
2490 shell.inspector.set_active_scheme(new_scheme)
2486 shell.inspector.set_active_scheme(new_scheme)
2491 except:
2487 except:
2492 color_switch_err('object inspector')
2488 color_switch_err('object inspector')
2493 else:
2489 else:
2494 shell.inspector.set_active_scheme('NoColor')
2490 shell.inspector.set_active_scheme('NoColor')
2495
2491
2496 def magic_pprint(self, parameter_s=''):
2492 def magic_pprint(self, parameter_s=''):
2497 """Toggle pretty printing on/off."""
2493 """Toggle pretty printing on/off."""
2498 ptformatter = self.shell.display_formatter.formatters['text/plain']
2494 ptformatter = self.shell.display_formatter.formatters['text/plain']
2499 ptformatter.pprint = bool(1 - ptformatter.pprint)
2495 ptformatter.pprint = bool(1 - ptformatter.pprint)
2500 print 'Pretty printing has been turned', \
2496 print 'Pretty printing has been turned', \
2501 ['OFF','ON'][ptformatter.pprint]
2497 ['OFF','ON'][ptformatter.pprint]
2502
2498
2503 def magic_Exit(self, parameter_s=''):
2499 def magic_Exit(self, parameter_s=''):
2504 """Exit IPython."""
2500 """Exit IPython."""
2505
2501
2506 self.shell.ask_exit()
2502 self.shell.ask_exit()
2507
2503
2508 # Add aliases as magics so all common forms work: exit, quit, Exit, Quit.
2504 # Add aliases as magics so all common forms work: exit, quit, Exit, Quit.
2509 magic_exit = magic_quit = magic_Quit = magic_Exit
2505 magic_exit = magic_quit = magic_Quit = magic_Exit
2510
2506
2511 #......................................................................
2507 #......................................................................
2512 # Functions to implement unix shell-type things
2508 # Functions to implement unix shell-type things
2513
2509
2514 @testdec.skip_doctest
2510 @testdec.skip_doctest
2515 def magic_alias(self, parameter_s = ''):
2511 def magic_alias(self, parameter_s = ''):
2516 """Define an alias for a system command.
2512 """Define an alias for a system command.
2517
2513
2518 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2514 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2519
2515
2520 Then, typing 'alias_name params' will execute the system command 'cmd
2516 Then, typing 'alias_name params' will execute the system command 'cmd
2521 params' (from your underlying operating system).
2517 params' (from your underlying operating system).
2522
2518
2523 Aliases have lower precedence than magic functions and Python normal
2519 Aliases have lower precedence than magic functions and Python normal
2524 variables, so if 'foo' is both a Python variable and an alias, the
2520 variables, so if 'foo' is both a Python variable and an alias, the
2525 alias can not be executed until 'del foo' removes the Python variable.
2521 alias can not be executed until 'del foo' removes the Python variable.
2526
2522
2527 You can use the %l specifier in an alias definition to represent the
2523 You can use the %l specifier in an alias definition to represent the
2528 whole line when the alias is called. For example:
2524 whole line when the alias is called. For example:
2529
2525
2530 In [2]: alias bracket echo "Input in brackets: <%l>"
2526 In [2]: alias bracket echo "Input in brackets: <%l>"
2531 In [3]: bracket hello world
2527 In [3]: bracket hello world
2532 Input in brackets: <hello world>
2528 Input in brackets: <hello world>
2533
2529
2534 You can also define aliases with parameters using %s specifiers (one
2530 You can also define aliases with parameters using %s specifiers (one
2535 per parameter):
2531 per parameter):
2536
2532
2537 In [1]: alias parts echo first %s second %s
2533 In [1]: alias parts echo first %s second %s
2538 In [2]: %parts A B
2534 In [2]: %parts A B
2539 first A second B
2535 first A second B
2540 In [3]: %parts A
2536 In [3]: %parts A
2541 Incorrect number of arguments: 2 expected.
2537 Incorrect number of arguments: 2 expected.
2542 parts is an alias to: 'echo first %s second %s'
2538 parts is an alias to: 'echo first %s second %s'
2543
2539
2544 Note that %l and %s are mutually exclusive. You can only use one or
2540 Note that %l and %s are mutually exclusive. You can only use one or
2545 the other in your aliases.
2541 the other in your aliases.
2546
2542
2547 Aliases expand Python variables just like system calls using ! or !!
2543 Aliases expand Python variables just like system calls using ! or !!
2548 do: all expressions prefixed with '$' get expanded. For details of
2544 do: all expressions prefixed with '$' get expanded. For details of
2549 the semantic rules, see PEP-215:
2545 the semantic rules, see PEP-215:
2550 http://www.python.org/peps/pep-0215.html. This is the library used by
2546 http://www.python.org/peps/pep-0215.html. This is the library used by
2551 IPython for variable expansion. If you want to access a true shell
2547 IPython for variable expansion. If you want to access a true shell
2552 variable, an extra $ is necessary to prevent its expansion by IPython:
2548 variable, an extra $ is necessary to prevent its expansion by IPython:
2553
2549
2554 In [6]: alias show echo
2550 In [6]: alias show echo
2555 In [7]: PATH='A Python string'
2551 In [7]: PATH='A Python string'
2556 In [8]: show $PATH
2552 In [8]: show $PATH
2557 A Python string
2553 A Python string
2558 In [9]: show $$PATH
2554 In [9]: show $$PATH
2559 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2555 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2560
2556
2561 You can use the alias facility to acess all of $PATH. See the %rehash
2557 You can use the alias facility to acess all of $PATH. See the %rehash
2562 and %rehashx functions, which automatically create aliases for the
2558 and %rehashx functions, which automatically create aliases for the
2563 contents of your $PATH.
2559 contents of your $PATH.
2564
2560
2565 If called with no parameters, %alias prints the current alias table."""
2561 If called with no parameters, %alias prints the current alias table."""
2566
2562
2567 par = parameter_s.strip()
2563 par = parameter_s.strip()
2568 if not par:
2564 if not par:
2569 stored = self.db.get('stored_aliases', {} )
2565 stored = self.db.get('stored_aliases', {} )
2570 aliases = sorted(self.shell.alias_manager.aliases)
2566 aliases = sorted(self.shell.alias_manager.aliases)
2571 # for k, v in stored:
2567 # for k, v in stored:
2572 # atab.append(k, v[0])
2568 # atab.append(k, v[0])
2573
2569
2574 print "Total number of aliases:", len(aliases)
2570 print "Total number of aliases:", len(aliases)
2575 sys.stdout.flush()
2571 sys.stdout.flush()
2576 return aliases
2572 return aliases
2577
2573
2578 # Now try to define a new one
2574 # Now try to define a new one
2579 try:
2575 try:
2580 alias,cmd = par.split(None, 1)
2576 alias,cmd = par.split(None, 1)
2581 except:
2577 except:
2582 print oinspect.getdoc(self.magic_alias)
2578 print oinspect.getdoc(self.magic_alias)
2583 else:
2579 else:
2584 self.shell.alias_manager.soft_define_alias(alias, cmd)
2580 self.shell.alias_manager.soft_define_alias(alias, cmd)
2585 # end magic_alias
2581 # end magic_alias
2586
2582
2587 def magic_unalias(self, parameter_s = ''):
2583 def magic_unalias(self, parameter_s = ''):
2588 """Remove an alias"""
2584 """Remove an alias"""
2589
2585
2590 aname = parameter_s.strip()
2586 aname = parameter_s.strip()
2591 self.shell.alias_manager.undefine_alias(aname)
2587 self.shell.alias_manager.undefine_alias(aname)
2592 stored = self.db.get('stored_aliases', {} )
2588 stored = self.db.get('stored_aliases', {} )
2593 if aname in stored:
2589 if aname in stored:
2594 print "Removing %stored alias",aname
2590 print "Removing %stored alias",aname
2595 del stored[aname]
2591 del stored[aname]
2596 self.db['stored_aliases'] = stored
2592 self.db['stored_aliases'] = stored
2597
2593
2598 def magic_rehashx(self, parameter_s = ''):
2594 def magic_rehashx(self, parameter_s = ''):
2599 """Update the alias table with all executable files in $PATH.
2595 """Update the alias table with all executable files in $PATH.
2600
2596
2601 This version explicitly checks that every entry in $PATH is a file
2597 This version explicitly checks that every entry in $PATH is a file
2602 with execute access (os.X_OK), so it is much slower than %rehash.
2598 with execute access (os.X_OK), so it is much slower than %rehash.
2603
2599
2604 Under Windows, it checks executability as a match agains a
2600 Under Windows, it checks executability as a match agains a
2605 '|'-separated string of extensions, stored in the IPython config
2601 '|'-separated string of extensions, stored in the IPython config
2606 variable win_exec_ext. This defaults to 'exe|com|bat'.
2602 variable win_exec_ext. This defaults to 'exe|com|bat'.
2607
2603
2608 This function also resets the root module cache of module completer,
2604 This function also resets the root module cache of module completer,
2609 used on slow filesystems.
2605 used on slow filesystems.
2610 """
2606 """
2611 from IPython.core.alias import InvalidAliasError
2607 from IPython.core.alias import InvalidAliasError
2612
2608
2613 # for the benefit of module completer in ipy_completers.py
2609 # for the benefit of module completer in ipy_completers.py
2614 del self.db['rootmodules']
2610 del self.db['rootmodules']
2615
2611
2616 path = [os.path.abspath(os.path.expanduser(p)) for p in
2612 path = [os.path.abspath(os.path.expanduser(p)) for p in
2617 os.environ.get('PATH','').split(os.pathsep)]
2613 os.environ.get('PATH','').split(os.pathsep)]
2618 path = filter(os.path.isdir,path)
2614 path = filter(os.path.isdir,path)
2619
2615
2620 syscmdlist = []
2616 syscmdlist = []
2621 # Now define isexec in a cross platform manner.
2617 # Now define isexec in a cross platform manner.
2622 if os.name == 'posix':
2618 if os.name == 'posix':
2623 isexec = lambda fname:os.path.isfile(fname) and \
2619 isexec = lambda fname:os.path.isfile(fname) and \
2624 os.access(fname,os.X_OK)
2620 os.access(fname,os.X_OK)
2625 else:
2621 else:
2626 try:
2622 try:
2627 winext = os.environ['pathext'].replace(';','|').replace('.','')
2623 winext = os.environ['pathext'].replace(';','|').replace('.','')
2628 except KeyError:
2624 except KeyError:
2629 winext = 'exe|com|bat|py'
2625 winext = 'exe|com|bat|py'
2630 if 'py' not in winext:
2626 if 'py' not in winext:
2631 winext += '|py'
2627 winext += '|py'
2632 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2628 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2633 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2629 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2634 savedir = os.getcwd()
2630 savedir = os.getcwd()
2635
2631
2636 # Now walk the paths looking for executables to alias.
2632 # Now walk the paths looking for executables to alias.
2637 try:
2633 try:
2638 # write the whole loop for posix/Windows so we don't have an if in
2634 # write the whole loop for posix/Windows so we don't have an if in
2639 # the innermost part
2635 # the innermost part
2640 if os.name == 'posix':
2636 if os.name == 'posix':
2641 for pdir in path:
2637 for pdir in path:
2642 os.chdir(pdir)
2638 os.chdir(pdir)
2643 for ff in os.listdir(pdir):
2639 for ff in os.listdir(pdir):
2644 if isexec(ff):
2640 if isexec(ff):
2645 try:
2641 try:
2646 # Removes dots from the name since ipython
2642 # Removes dots from the name since ipython
2647 # will assume names with dots to be python.
2643 # will assume names with dots to be python.
2648 self.shell.alias_manager.define_alias(
2644 self.shell.alias_manager.define_alias(
2649 ff.replace('.',''), ff)
2645 ff.replace('.',''), ff)
2650 except InvalidAliasError:
2646 except InvalidAliasError:
2651 pass
2647 pass
2652 else:
2648 else:
2653 syscmdlist.append(ff)
2649 syscmdlist.append(ff)
2654 else:
2650 else:
2655 no_alias = self.shell.alias_manager.no_alias
2651 no_alias = self.shell.alias_manager.no_alias
2656 for pdir in path:
2652 for pdir in path:
2657 os.chdir(pdir)
2653 os.chdir(pdir)
2658 for ff in os.listdir(pdir):
2654 for ff in os.listdir(pdir):
2659 base, ext = os.path.splitext(ff)
2655 base, ext = os.path.splitext(ff)
2660 if isexec(ff) and base.lower() not in no_alias:
2656 if isexec(ff) and base.lower() not in no_alias:
2661 if ext.lower() == '.exe':
2657 if ext.lower() == '.exe':
2662 ff = base
2658 ff = base
2663 try:
2659 try:
2664 # Removes dots from the name since ipython
2660 # Removes dots from the name since ipython
2665 # will assume names with dots to be python.
2661 # will assume names with dots to be python.
2666 self.shell.alias_manager.define_alias(
2662 self.shell.alias_manager.define_alias(
2667 base.lower().replace('.',''), ff)
2663 base.lower().replace('.',''), ff)
2668 except InvalidAliasError:
2664 except InvalidAliasError:
2669 pass
2665 pass
2670 syscmdlist.append(ff)
2666 syscmdlist.append(ff)
2671 db = self.db
2667 db = self.db
2672 db['syscmdlist'] = syscmdlist
2668 db['syscmdlist'] = syscmdlist
2673 finally:
2669 finally:
2674 os.chdir(savedir)
2670 os.chdir(savedir)
2675
2671
2676 @testdec.skip_doctest
2672 @testdec.skip_doctest
2677 def magic_pwd(self, parameter_s = ''):
2673 def magic_pwd(self, parameter_s = ''):
2678 """Return the current working directory path.
2674 """Return the current working directory path.
2679
2675
2680 Examples
2676 Examples
2681 --------
2677 --------
2682 ::
2678 ::
2683
2679
2684 In [9]: pwd
2680 In [9]: pwd
2685 Out[9]: '/home/tsuser/sprint/ipython'
2681 Out[9]: '/home/tsuser/sprint/ipython'
2686 """
2682 """
2687 return os.getcwd()
2683 return os.getcwd()
2688
2684
2689 @testdec.skip_doctest
2685 @testdec.skip_doctest
2690 def magic_cd(self, parameter_s=''):
2686 def magic_cd(self, parameter_s=''):
2691 """Change the current working directory.
2687 """Change the current working directory.
2692
2688
2693 This command automatically maintains an internal list of directories
2689 This command automatically maintains an internal list of directories
2694 you visit during your IPython session, in the variable _dh. The
2690 you visit during your IPython session, in the variable _dh. The
2695 command %dhist shows this history nicely formatted. You can also
2691 command %dhist shows this history nicely formatted. You can also
2696 do 'cd -<tab>' to see directory history conveniently.
2692 do 'cd -<tab>' to see directory history conveniently.
2697
2693
2698 Usage:
2694 Usage:
2699
2695
2700 cd 'dir': changes to directory 'dir'.
2696 cd 'dir': changes to directory 'dir'.
2701
2697
2702 cd -: changes to the last visited directory.
2698 cd -: changes to the last visited directory.
2703
2699
2704 cd -<n>: changes to the n-th directory in the directory history.
2700 cd -<n>: changes to the n-th directory in the directory history.
2705
2701
2706 cd --foo: change to directory that matches 'foo' in history
2702 cd --foo: change to directory that matches 'foo' in history
2707
2703
2708 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2704 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2709 (note: cd <bookmark_name> is enough if there is no
2705 (note: cd <bookmark_name> is enough if there is no
2710 directory <bookmark_name>, but a bookmark with the name exists.)
2706 directory <bookmark_name>, but a bookmark with the name exists.)
2711 'cd -b <tab>' allows you to tab-complete bookmark names.
2707 'cd -b <tab>' allows you to tab-complete bookmark names.
2712
2708
2713 Options:
2709 Options:
2714
2710
2715 -q: quiet. Do not print the working directory after the cd command is
2711 -q: quiet. Do not print the working directory after the cd command is
2716 executed. By default IPython's cd command does print this directory,
2712 executed. By default IPython's cd command does print this directory,
2717 since the default prompts do not display path information.
2713 since the default prompts do not display path information.
2718
2714
2719 Note that !cd doesn't work for this purpose because the shell where
2715 Note that !cd doesn't work for this purpose because the shell where
2720 !command runs is immediately discarded after executing 'command'.
2716 !command runs is immediately discarded after executing 'command'.
2721
2717
2722 Examples
2718 Examples
2723 --------
2719 --------
2724 ::
2720 ::
2725
2721
2726 In [10]: cd parent/child
2722 In [10]: cd parent/child
2727 /home/tsuser/parent/child
2723 /home/tsuser/parent/child
2728 """
2724 """
2729
2725
2730 parameter_s = parameter_s.strip()
2726 parameter_s = parameter_s.strip()
2731 #bkms = self.shell.persist.get("bookmarks",{})
2727 #bkms = self.shell.persist.get("bookmarks",{})
2732
2728
2733 oldcwd = os.getcwd()
2729 oldcwd = os.getcwd()
2734 numcd = re.match(r'(-)(\d+)$',parameter_s)
2730 numcd = re.match(r'(-)(\d+)$',parameter_s)
2735 # jump in directory history by number
2731 # jump in directory history by number
2736 if numcd:
2732 if numcd:
2737 nn = int(numcd.group(2))
2733 nn = int(numcd.group(2))
2738 try:
2734 try:
2739 ps = self.shell.user_ns['_dh'][nn]
2735 ps = self.shell.user_ns['_dh'][nn]
2740 except IndexError:
2736 except IndexError:
2741 print 'The requested directory does not exist in history.'
2737 print 'The requested directory does not exist in history.'
2742 return
2738 return
2743 else:
2739 else:
2744 opts = {}
2740 opts = {}
2745 elif parameter_s.startswith('--'):
2741 elif parameter_s.startswith('--'):
2746 ps = None
2742 ps = None
2747 fallback = None
2743 fallback = None
2748 pat = parameter_s[2:]
2744 pat = parameter_s[2:]
2749 dh = self.shell.user_ns['_dh']
2745 dh = self.shell.user_ns['_dh']
2750 # first search only by basename (last component)
2746 # first search only by basename (last component)
2751 for ent in reversed(dh):
2747 for ent in reversed(dh):
2752 if pat in os.path.basename(ent) and os.path.isdir(ent):
2748 if pat in os.path.basename(ent) and os.path.isdir(ent):
2753 ps = ent
2749 ps = ent
2754 break
2750 break
2755
2751
2756 if fallback is None and pat in ent and os.path.isdir(ent):
2752 if fallback is None and pat in ent and os.path.isdir(ent):
2757 fallback = ent
2753 fallback = ent
2758
2754
2759 # if we have no last part match, pick the first full path match
2755 # if we have no last part match, pick the first full path match
2760 if ps is None:
2756 if ps is None:
2761 ps = fallback
2757 ps = fallback
2762
2758
2763 if ps is None:
2759 if ps is None:
2764 print "No matching entry in directory history"
2760 print "No matching entry in directory history"
2765 return
2761 return
2766 else:
2762 else:
2767 opts = {}
2763 opts = {}
2768
2764
2769
2765
2770 else:
2766 else:
2771 #turn all non-space-escaping backslashes to slashes,
2767 #turn all non-space-escaping backslashes to slashes,
2772 # for c:\windows\directory\names\
2768 # for c:\windows\directory\names\
2773 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2769 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2774 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2770 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2775 # jump to previous
2771 # jump to previous
2776 if ps == '-':
2772 if ps == '-':
2777 try:
2773 try:
2778 ps = self.shell.user_ns['_dh'][-2]
2774 ps = self.shell.user_ns['_dh'][-2]
2779 except IndexError:
2775 except IndexError:
2780 raise UsageError('%cd -: No previous directory to change to.')
2776 raise UsageError('%cd -: No previous directory to change to.')
2781 # jump to bookmark if needed
2777 # jump to bookmark if needed
2782 else:
2778 else:
2783 if not os.path.isdir(ps) or opts.has_key('b'):
2779 if not os.path.isdir(ps) or opts.has_key('b'):
2784 bkms = self.db.get('bookmarks', {})
2780 bkms = self.db.get('bookmarks', {})
2785
2781
2786 if bkms.has_key(ps):
2782 if bkms.has_key(ps):
2787 target = bkms[ps]
2783 target = bkms[ps]
2788 print '(bookmark:%s) -> %s' % (ps,target)
2784 print '(bookmark:%s) -> %s' % (ps,target)
2789 ps = target
2785 ps = target
2790 else:
2786 else:
2791 if opts.has_key('b'):
2787 if opts.has_key('b'):
2792 raise UsageError("Bookmark '%s' not found. "
2788 raise UsageError("Bookmark '%s' not found. "
2793 "Use '%%bookmark -l' to see your bookmarks." % ps)
2789 "Use '%%bookmark -l' to see your bookmarks." % ps)
2794
2790
2795 # at this point ps should point to the target dir
2791 # at this point ps should point to the target dir
2796 if ps:
2792 if ps:
2797 try:
2793 try:
2798 os.chdir(os.path.expanduser(ps))
2794 os.chdir(os.path.expanduser(ps))
2799 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2795 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2800 set_term_title('IPython: ' + abbrev_cwd())
2796 set_term_title('IPython: ' + abbrev_cwd())
2801 except OSError:
2797 except OSError:
2802 print sys.exc_info()[1]
2798 print sys.exc_info()[1]
2803 else:
2799 else:
2804 cwd = os.getcwd()
2800 cwd = os.getcwd()
2805 dhist = self.shell.user_ns['_dh']
2801 dhist = self.shell.user_ns['_dh']
2806 if oldcwd != cwd:
2802 if oldcwd != cwd:
2807 dhist.append(cwd)
2803 dhist.append(cwd)
2808 self.db['dhist'] = compress_dhist(dhist)[-100:]
2804 self.db['dhist'] = compress_dhist(dhist)[-100:]
2809
2805
2810 else:
2806 else:
2811 os.chdir(self.shell.home_dir)
2807 os.chdir(self.shell.home_dir)
2812 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2808 if hasattr(self.shell, 'term_title') and self.shell.term_title:
2813 set_term_title('IPython: ' + '~')
2809 set_term_title('IPython: ' + '~')
2814 cwd = os.getcwd()
2810 cwd = os.getcwd()
2815 dhist = self.shell.user_ns['_dh']
2811 dhist = self.shell.user_ns['_dh']
2816
2812
2817 if oldcwd != cwd:
2813 if oldcwd != cwd:
2818 dhist.append(cwd)
2814 dhist.append(cwd)
2819 self.db['dhist'] = compress_dhist(dhist)[-100:]
2815 self.db['dhist'] = compress_dhist(dhist)[-100:]
2820 if not 'q' in opts and self.shell.user_ns['_dh']:
2816 if not 'q' in opts and self.shell.user_ns['_dh']:
2821 print self.shell.user_ns['_dh'][-1]
2817 print self.shell.user_ns['_dh'][-1]
2822
2818
2823
2819
2824 def magic_env(self, parameter_s=''):
2820 def magic_env(self, parameter_s=''):
2825 """List environment variables."""
2821 """List environment variables."""
2826
2822
2827 return os.environ.data
2823 return os.environ.data
2828
2824
2829 def magic_pushd(self, parameter_s=''):
2825 def magic_pushd(self, parameter_s=''):
2830 """Place the current dir on stack and change directory.
2826 """Place the current dir on stack and change directory.
2831
2827
2832 Usage:\\
2828 Usage:\\
2833 %pushd ['dirname']
2829 %pushd ['dirname']
2834 """
2830 """
2835
2831
2836 dir_s = self.shell.dir_stack
2832 dir_s = self.shell.dir_stack
2837 tgt = os.path.expanduser(parameter_s)
2833 tgt = os.path.expanduser(parameter_s)
2838 cwd = os.getcwd().replace(self.home_dir,'~')
2834 cwd = os.getcwd().replace(self.home_dir,'~')
2839 if tgt:
2835 if tgt:
2840 self.magic_cd(parameter_s)
2836 self.magic_cd(parameter_s)
2841 dir_s.insert(0,cwd)
2837 dir_s.insert(0,cwd)
2842 return self.magic_dirs()
2838 return self.magic_dirs()
2843
2839
2844 def magic_popd(self, parameter_s=''):
2840 def magic_popd(self, parameter_s=''):
2845 """Change to directory popped off the top of the stack.
2841 """Change to directory popped off the top of the stack.
2846 """
2842 """
2847 if not self.shell.dir_stack:
2843 if not self.shell.dir_stack:
2848 raise UsageError("%popd on empty stack")
2844 raise UsageError("%popd on empty stack")
2849 top = self.shell.dir_stack.pop(0)
2845 top = self.shell.dir_stack.pop(0)
2850 self.magic_cd(top)
2846 self.magic_cd(top)
2851 print "popd ->",top
2847 print "popd ->",top
2852
2848
2853 def magic_dirs(self, parameter_s=''):
2849 def magic_dirs(self, parameter_s=''):
2854 """Return the current directory stack."""
2850 """Return the current directory stack."""
2855
2851
2856 return self.shell.dir_stack
2852 return self.shell.dir_stack
2857
2853
2858 def magic_dhist(self, parameter_s=''):
2854 def magic_dhist(self, parameter_s=''):
2859 """Print your history of visited directories.
2855 """Print your history of visited directories.
2860
2856
2861 %dhist -> print full history\\
2857 %dhist -> print full history\\
2862 %dhist n -> print last n entries only\\
2858 %dhist n -> print last n entries only\\
2863 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2859 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2864
2860
2865 This history is automatically maintained by the %cd command, and
2861 This history is automatically maintained by the %cd command, and
2866 always available as the global list variable _dh. You can use %cd -<n>
2862 always available as the global list variable _dh. You can use %cd -<n>
2867 to go to directory number <n>.
2863 to go to directory number <n>.
2868
2864
2869 Note that most of time, you should view directory history by entering
2865 Note that most of time, you should view directory history by entering
2870 cd -<TAB>.
2866 cd -<TAB>.
2871
2867
2872 """
2868 """
2873
2869
2874 dh = self.shell.user_ns['_dh']
2870 dh = self.shell.user_ns['_dh']
2875 if parameter_s:
2871 if parameter_s:
2876 try:
2872 try:
2877 args = map(int,parameter_s.split())
2873 args = map(int,parameter_s.split())
2878 except:
2874 except:
2879 self.arg_err(Magic.magic_dhist)
2875 self.arg_err(Magic.magic_dhist)
2880 return
2876 return
2881 if len(args) == 1:
2877 if len(args) == 1:
2882 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2878 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2883 elif len(args) == 2:
2879 elif len(args) == 2:
2884 ini,fin = args
2880 ini,fin = args
2885 else:
2881 else:
2886 self.arg_err(Magic.magic_dhist)
2882 self.arg_err(Magic.magic_dhist)
2887 return
2883 return
2888 else:
2884 else:
2889 ini,fin = 0,len(dh)
2885 ini,fin = 0,len(dh)
2890 nlprint(dh,
2886 nlprint(dh,
2891 header = 'Directory history (kept in _dh)',
2887 header = 'Directory history (kept in _dh)',
2892 start=ini,stop=fin)
2888 start=ini,stop=fin)
2893
2889
2894 @testdec.skip_doctest
2890 @testdec.skip_doctest
2895 def magic_sc(self, parameter_s=''):
2891 def magic_sc(self, parameter_s=''):
2896 """Shell capture - execute a shell command and capture its output.
2892 """Shell capture - execute a shell command and capture its output.
2897
2893
2898 DEPRECATED. Suboptimal, retained for backwards compatibility.
2894 DEPRECATED. Suboptimal, retained for backwards compatibility.
2899
2895
2900 You should use the form 'var = !command' instead. Example:
2896 You should use the form 'var = !command' instead. Example:
2901
2897
2902 "%sc -l myfiles = ls ~" should now be written as
2898 "%sc -l myfiles = ls ~" should now be written as
2903
2899
2904 "myfiles = !ls ~"
2900 "myfiles = !ls ~"
2905
2901
2906 myfiles.s, myfiles.l and myfiles.n still apply as documented
2902 myfiles.s, myfiles.l and myfiles.n still apply as documented
2907 below.
2903 below.
2908
2904
2909 --
2905 --
2910 %sc [options] varname=command
2906 %sc [options] varname=command
2911
2907
2912 IPython will run the given command using commands.getoutput(), and
2908 IPython will run the given command using commands.getoutput(), and
2913 will then update the user's interactive namespace with a variable
2909 will then update the user's interactive namespace with a variable
2914 called varname, containing the value of the call. Your command can
2910 called varname, containing the value of the call. Your command can
2915 contain shell wildcards, pipes, etc.
2911 contain shell wildcards, pipes, etc.
2916
2912
2917 The '=' sign in the syntax is mandatory, and the variable name you
2913 The '=' sign in the syntax is mandatory, and the variable name you
2918 supply must follow Python's standard conventions for valid names.
2914 supply must follow Python's standard conventions for valid names.
2919
2915
2920 (A special format without variable name exists for internal use)
2916 (A special format without variable name exists for internal use)
2921
2917
2922 Options:
2918 Options:
2923
2919
2924 -l: list output. Split the output on newlines into a list before
2920 -l: list output. Split the output on newlines into a list before
2925 assigning it to the given variable. By default the output is stored
2921 assigning it to the given variable. By default the output is stored
2926 as a single string.
2922 as a single string.
2927
2923
2928 -v: verbose. Print the contents of the variable.
2924 -v: verbose. Print the contents of the variable.
2929
2925
2930 In most cases you should not need to split as a list, because the
2926 In most cases you should not need to split as a list, because the
2931 returned value is a special type of string which can automatically
2927 returned value is a special type of string which can automatically
2932 provide its contents either as a list (split on newlines) or as a
2928 provide its contents either as a list (split on newlines) or as a
2933 space-separated string. These are convenient, respectively, either
2929 space-separated string. These are convenient, respectively, either
2934 for sequential processing or to be passed to a shell command.
2930 for sequential processing or to be passed to a shell command.
2935
2931
2936 For example:
2932 For example:
2937
2933
2938 # all-random
2934 # all-random
2939
2935
2940 # Capture into variable a
2936 # Capture into variable a
2941 In [1]: sc a=ls *py
2937 In [1]: sc a=ls *py
2942
2938
2943 # a is a string with embedded newlines
2939 # a is a string with embedded newlines
2944 In [2]: a
2940 In [2]: a
2945 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2941 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2946
2942
2947 # which can be seen as a list:
2943 # which can be seen as a list:
2948 In [3]: a.l
2944 In [3]: a.l
2949 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2945 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2950
2946
2951 # or as a whitespace-separated string:
2947 # or as a whitespace-separated string:
2952 In [4]: a.s
2948 In [4]: a.s
2953 Out[4]: 'setup.py win32_manual_post_install.py'
2949 Out[4]: 'setup.py win32_manual_post_install.py'
2954
2950
2955 # a.s is useful to pass as a single command line:
2951 # a.s is useful to pass as a single command line:
2956 In [5]: !wc -l $a.s
2952 In [5]: !wc -l $a.s
2957 146 setup.py
2953 146 setup.py
2958 130 win32_manual_post_install.py
2954 130 win32_manual_post_install.py
2959 276 total
2955 276 total
2960
2956
2961 # while the list form is useful to loop over:
2957 # while the list form is useful to loop over:
2962 In [6]: for f in a.l:
2958 In [6]: for f in a.l:
2963 ...: !wc -l $f
2959 ...: !wc -l $f
2964 ...:
2960 ...:
2965 146 setup.py
2961 146 setup.py
2966 130 win32_manual_post_install.py
2962 130 win32_manual_post_install.py
2967
2963
2968 Similiarly, the lists returned by the -l option are also special, in
2964 Similiarly, the lists returned by the -l option are also special, in
2969 the sense that you can equally invoke the .s attribute on them to
2965 the sense that you can equally invoke the .s attribute on them to
2970 automatically get a whitespace-separated string from their contents:
2966 automatically get a whitespace-separated string from their contents:
2971
2967
2972 In [7]: sc -l b=ls *py
2968 In [7]: sc -l b=ls *py
2973
2969
2974 In [8]: b
2970 In [8]: b
2975 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2971 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2976
2972
2977 In [9]: b.s
2973 In [9]: b.s
2978 Out[9]: 'setup.py win32_manual_post_install.py'
2974 Out[9]: 'setup.py win32_manual_post_install.py'
2979
2975
2980 In summary, both the lists and strings used for ouptut capture have
2976 In summary, both the lists and strings used for ouptut capture have
2981 the following special attributes:
2977 the following special attributes:
2982
2978
2983 .l (or .list) : value as list.
2979 .l (or .list) : value as list.
2984 .n (or .nlstr): value as newline-separated string.
2980 .n (or .nlstr): value as newline-separated string.
2985 .s (or .spstr): value as space-separated string.
2981 .s (or .spstr): value as space-separated string.
2986 """
2982 """
2987
2983
2988 opts,args = self.parse_options(parameter_s,'lv')
2984 opts,args = self.parse_options(parameter_s,'lv')
2989 # Try to get a variable name and command to run
2985 # Try to get a variable name and command to run
2990 try:
2986 try:
2991 # the variable name must be obtained from the parse_options
2987 # the variable name must be obtained from the parse_options
2992 # output, which uses shlex.split to strip options out.
2988 # output, which uses shlex.split to strip options out.
2993 var,_ = args.split('=',1)
2989 var,_ = args.split('=',1)
2994 var = var.strip()
2990 var = var.strip()
2995 # But the the command has to be extracted from the original input
2991 # But the the command has to be extracted from the original input
2996 # parameter_s, not on what parse_options returns, to avoid the
2992 # parameter_s, not on what parse_options returns, to avoid the
2997 # quote stripping which shlex.split performs on it.
2993 # quote stripping which shlex.split performs on it.
2998 _,cmd = parameter_s.split('=',1)
2994 _,cmd = parameter_s.split('=',1)
2999 except ValueError:
2995 except ValueError:
3000 var,cmd = '',''
2996 var,cmd = '',''
3001 # If all looks ok, proceed
2997 # If all looks ok, proceed
3002 split = 'l' in opts
2998 split = 'l' in opts
3003 out = self.shell.getoutput(cmd, split=split)
2999 out = self.shell.getoutput(cmd, split=split)
3004 if opts.has_key('v'):
3000 if opts.has_key('v'):
3005 print '%s ==\n%s' % (var,pformat(out))
3001 print '%s ==\n%s' % (var,pformat(out))
3006 if var:
3002 if var:
3007 self.shell.user_ns.update({var:out})
3003 self.shell.user_ns.update({var:out})
3008 else:
3004 else:
3009 return out
3005 return out
3010
3006
3011 def magic_sx(self, parameter_s=''):
3007 def magic_sx(self, parameter_s=''):
3012 """Shell execute - run a shell command and capture its output.
3008 """Shell execute - run a shell command and capture its output.
3013
3009
3014 %sx command
3010 %sx command
3015
3011
3016 IPython will run the given command using commands.getoutput(), and
3012 IPython will run the given command using commands.getoutput(), and
3017 return the result formatted as a list (split on '\\n'). Since the
3013 return the result formatted as a list (split on '\\n'). Since the
3018 output is _returned_, it will be stored in ipython's regular output
3014 output is _returned_, it will be stored in ipython's regular output
3019 cache Out[N] and in the '_N' automatic variables.
3015 cache Out[N] and in the '_N' automatic variables.
3020
3016
3021 Notes:
3017 Notes:
3022
3018
3023 1) If an input line begins with '!!', then %sx is automatically
3019 1) If an input line begins with '!!', then %sx is automatically
3024 invoked. That is, while:
3020 invoked. That is, while:
3025 !ls
3021 !ls
3026 causes ipython to simply issue system('ls'), typing
3022 causes ipython to simply issue system('ls'), typing
3027 !!ls
3023 !!ls
3028 is a shorthand equivalent to:
3024 is a shorthand equivalent to:
3029 %sx ls
3025 %sx ls
3030
3026
3031 2) %sx differs from %sc in that %sx automatically splits into a list,
3027 2) %sx differs from %sc in that %sx automatically splits into a list,
3032 like '%sc -l'. The reason for this is to make it as easy as possible
3028 like '%sc -l'. The reason for this is to make it as easy as possible
3033 to process line-oriented shell output via further python commands.
3029 to process line-oriented shell output via further python commands.
3034 %sc is meant to provide much finer control, but requires more
3030 %sc is meant to provide much finer control, but requires more
3035 typing.
3031 typing.
3036
3032
3037 3) Just like %sc -l, this is a list with special attributes:
3033 3) Just like %sc -l, this is a list with special attributes:
3038
3034
3039 .l (or .list) : value as list.
3035 .l (or .list) : value as list.
3040 .n (or .nlstr): value as newline-separated string.
3036 .n (or .nlstr): value as newline-separated string.
3041 .s (or .spstr): value as whitespace-separated string.
3037 .s (or .spstr): value as whitespace-separated string.
3042
3038
3043 This is very useful when trying to use such lists as arguments to
3039 This is very useful when trying to use such lists as arguments to
3044 system commands."""
3040 system commands."""
3045
3041
3046 if parameter_s:
3042 if parameter_s:
3047 return self.shell.getoutput(parameter_s)
3043 return self.shell.getoutput(parameter_s)
3048
3044
3049 def magic_r(self, parameter_s=''):
3045 def magic_r(self, parameter_s=''):
3050 """Repeat previous input.
3046 """Repeat previous input.
3051
3047
3052 Note: Consider using the more powerfull %rep instead!
3048 Note: Consider using the more powerfull %rep instead!
3053
3049
3054 If given an argument, repeats the previous command which starts with
3050 If given an argument, repeats the previous command which starts with
3055 the same string, otherwise it just repeats the previous input.
3051 the same string, otherwise it just repeats the previous input.
3056
3052
3057 Shell escaped commands (with ! as first character) are not recognized
3053 Shell escaped commands (with ! as first character) are not recognized
3058 by this system, only pure python code and magic commands.
3054 by this system, only pure python code and magic commands.
3059 """
3055 """
3060
3056
3061 start = parameter_s.strip()
3057 start = parameter_s.strip()
3062 esc_magic = ESC_MAGIC
3058 esc_magic = ESC_MAGIC
3063 # Identify magic commands even if automagic is on (which means
3059 # Identify magic commands even if automagic is on (which means
3064 # the in-memory version is different from that typed by the user).
3060 # the in-memory version is different from that typed by the user).
3065 if self.shell.automagic:
3061 if self.shell.automagic:
3066 start_magic = esc_magic+start
3062 start_magic = esc_magic+start
3067 else:
3063 else:
3068 start_magic = start
3064 start_magic = start
3069 # Look through the input history in reverse
3065 # Look through the input history in reverse
3070 for n in range(len(self.shell.history_manager.input_hist_parsed)-2,0,-1):
3066 for n in range(len(self.shell.history_manager.input_hist_parsed)-2,0,-1):
3071 input = self.shell.history_manager.input_hist_parsed[n]
3067 input = self.shell.history_manager.input_hist_parsed[n]
3072 # skip plain 'r' lines so we don't recurse to infinity
3068 # skip plain 'r' lines so we don't recurse to infinity
3073 if input != '_ip.magic("r")\n' and \
3069 if input != '_ip.magic("r")\n' and \
3074 (input.startswith(start) or input.startswith(start_magic)):
3070 (input.startswith(start) or input.startswith(start_magic)):
3075 #print 'match',`input` # dbg
3071 #print 'match',`input` # dbg
3076 print 'Executing:',input,
3072 print 'Executing:',input,
3077 self.shell.run_cell(input)
3073 self.shell.run_cell(input)
3078 return
3074 return
3079 print 'No previous input matching `%s` found.' % start
3075 print 'No previous input matching `%s` found.' % start
3080
3076
3081
3077
3082 def magic_bookmark(self, parameter_s=''):
3078 def magic_bookmark(self, parameter_s=''):
3083 """Manage IPython's bookmark system.
3079 """Manage IPython's bookmark system.
3084
3080
3085 %bookmark <name> - set bookmark to current dir
3081 %bookmark <name> - set bookmark to current dir
3086 %bookmark <name> <dir> - set bookmark to <dir>
3082 %bookmark <name> <dir> - set bookmark to <dir>
3087 %bookmark -l - list all bookmarks
3083 %bookmark -l - list all bookmarks
3088 %bookmark -d <name> - remove bookmark
3084 %bookmark -d <name> - remove bookmark
3089 %bookmark -r - remove all bookmarks
3085 %bookmark -r - remove all bookmarks
3090
3086
3091 You can later on access a bookmarked folder with:
3087 You can later on access a bookmarked folder with:
3092 %cd -b <name>
3088 %cd -b <name>
3093 or simply '%cd <name>' if there is no directory called <name> AND
3089 or simply '%cd <name>' if there is no directory called <name> AND
3094 there is such a bookmark defined.
3090 there is such a bookmark defined.
3095
3091
3096 Your bookmarks persist through IPython sessions, but they are
3092 Your bookmarks persist through IPython sessions, but they are
3097 associated with each profile."""
3093 associated with each profile."""
3098
3094
3099 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3095 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3100 if len(args) > 2:
3096 if len(args) > 2:
3101 raise UsageError("%bookmark: too many arguments")
3097 raise UsageError("%bookmark: too many arguments")
3102
3098
3103 bkms = self.db.get('bookmarks',{})
3099 bkms = self.db.get('bookmarks',{})
3104
3100
3105 if opts.has_key('d'):
3101 if opts.has_key('d'):
3106 try:
3102 try:
3107 todel = args[0]
3103 todel = args[0]
3108 except IndexError:
3104 except IndexError:
3109 raise UsageError(
3105 raise UsageError(
3110 "%bookmark -d: must provide a bookmark to delete")
3106 "%bookmark -d: must provide a bookmark to delete")
3111 else:
3107 else:
3112 try:
3108 try:
3113 del bkms[todel]
3109 del bkms[todel]
3114 except KeyError:
3110 except KeyError:
3115 raise UsageError(
3111 raise UsageError(
3116 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3112 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3117
3113
3118 elif opts.has_key('r'):
3114 elif opts.has_key('r'):
3119 bkms = {}
3115 bkms = {}
3120 elif opts.has_key('l'):
3116 elif opts.has_key('l'):
3121 bks = bkms.keys()
3117 bks = bkms.keys()
3122 bks.sort()
3118 bks.sort()
3123 if bks:
3119 if bks:
3124 size = max(map(len,bks))
3120 size = max(map(len,bks))
3125 else:
3121 else:
3126 size = 0
3122 size = 0
3127 fmt = '%-'+str(size)+'s -> %s'
3123 fmt = '%-'+str(size)+'s -> %s'
3128 print 'Current bookmarks:'
3124 print 'Current bookmarks:'
3129 for bk in bks:
3125 for bk in bks:
3130 print fmt % (bk,bkms[bk])
3126 print fmt % (bk,bkms[bk])
3131 else:
3127 else:
3132 if not args:
3128 if not args:
3133 raise UsageError("%bookmark: You must specify the bookmark name")
3129 raise UsageError("%bookmark: You must specify the bookmark name")
3134 elif len(args)==1:
3130 elif len(args)==1:
3135 bkms[args[0]] = os.getcwd()
3131 bkms[args[0]] = os.getcwd()
3136 elif len(args)==2:
3132 elif len(args)==2:
3137 bkms[args[0]] = args[1]
3133 bkms[args[0]] = args[1]
3138 self.db['bookmarks'] = bkms
3134 self.db['bookmarks'] = bkms
3139
3135
3140 def magic_pycat(self, parameter_s=''):
3136 def magic_pycat(self, parameter_s=''):
3141 """Show a syntax-highlighted file through a pager.
3137 """Show a syntax-highlighted file through a pager.
3142
3138
3143 This magic is similar to the cat utility, but it will assume the file
3139 This magic is similar to the cat utility, but it will assume the file
3144 to be Python source and will show it with syntax highlighting. """
3140 to be Python source and will show it with syntax highlighting. """
3145
3141
3146 try:
3142 try:
3147 filename = get_py_filename(parameter_s)
3143 filename = get_py_filename(parameter_s)
3148 cont = file_read(filename)
3144 cont = file_read(filename)
3149 except IOError:
3145 except IOError:
3150 try:
3146 try:
3151 cont = eval(parameter_s,self.user_ns)
3147 cont = eval(parameter_s,self.user_ns)
3152 except NameError:
3148 except NameError:
3153 cont = None
3149 cont = None
3154 if cont is None:
3150 if cont is None:
3155 print "Error: no such file or variable"
3151 print "Error: no such file or variable"
3156 return
3152 return
3157
3153
3158 page.page(self.shell.pycolorize(cont))
3154 page.page(self.shell.pycolorize(cont))
3159
3155
3160 def _rerun_pasted(self):
3156 def _rerun_pasted(self):
3161 """ Rerun a previously pasted command.
3157 """ Rerun a previously pasted command.
3162 """
3158 """
3163 b = self.user_ns.get('pasted_block', None)
3159 b = self.user_ns.get('pasted_block', None)
3164 if b is None:
3160 if b is None:
3165 raise UsageError('No previous pasted block available')
3161 raise UsageError('No previous pasted block available')
3166 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3162 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3167 exec b in self.user_ns
3163 exec b in self.user_ns
3168
3164
3169 def _get_pasted_lines(self, sentinel):
3165 def _get_pasted_lines(self, sentinel):
3170 """ Yield pasted lines until the user enters the given sentinel value.
3166 """ Yield pasted lines until the user enters the given sentinel value.
3171 """
3167 """
3172 from IPython.core import interactiveshell
3168 from IPython.core import interactiveshell
3173 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3169 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3174 while True:
3170 while True:
3175 l = interactiveshell.raw_input_original(':')
3171 l = interactiveshell.raw_input_original(':')
3176 if l == sentinel:
3172 if l == sentinel:
3177 return
3173 return
3178 else:
3174 else:
3179 yield l
3175 yield l
3180
3176
3181 def _strip_pasted_lines_for_code(self, raw_lines):
3177 def _strip_pasted_lines_for_code(self, raw_lines):
3182 """ Strip non-code parts of a sequence of lines to return a block of
3178 """ Strip non-code parts of a sequence of lines to return a block of
3183 code.
3179 code.
3184 """
3180 """
3185 # Regular expressions that declare text we strip from the input:
3181 # Regular expressions that declare text we strip from the input:
3186 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3182 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3187 r'^\s*(\s?>)+', # Python input prompt
3183 r'^\s*(\s?>)+', # Python input prompt
3188 r'^\s*\.{3,}', # Continuation prompts
3184 r'^\s*\.{3,}', # Continuation prompts
3189 r'^\++',
3185 r'^\++',
3190 ]
3186 ]
3191
3187
3192 strip_from_start = map(re.compile,strip_re)
3188 strip_from_start = map(re.compile,strip_re)
3193
3189
3194 lines = []
3190 lines = []
3195 for l in raw_lines:
3191 for l in raw_lines:
3196 for pat in strip_from_start:
3192 for pat in strip_from_start:
3197 l = pat.sub('',l)
3193 l = pat.sub('',l)
3198 lines.append(l)
3194 lines.append(l)
3199
3195
3200 block = "\n".join(lines) + '\n'
3196 block = "\n".join(lines) + '\n'
3201 #print "block:\n",block
3197 #print "block:\n",block
3202 return block
3198 return block
3203
3199
3204 def _execute_block(self, block, par):
3200 def _execute_block(self, block, par):
3205 """ Execute a block, or store it in a variable, per the user's request.
3201 """ Execute a block, or store it in a variable, per the user's request.
3206 """
3202 """
3207 if not par:
3203 if not par:
3208 b = textwrap.dedent(block)
3204 b = textwrap.dedent(block)
3209 self.user_ns['pasted_block'] = b
3205 self.user_ns['pasted_block'] = b
3210 exec b in self.user_ns
3206 exec b in self.user_ns
3211 else:
3207 else:
3212 self.user_ns[par] = SList(block.splitlines())
3208 self.user_ns[par] = SList(block.splitlines())
3213 print "Block assigned to '%s'" % par
3209 print "Block assigned to '%s'" % par
3214
3210
3215 def magic_quickref(self,arg):
3211 def magic_quickref(self,arg):
3216 """ Show a quick reference sheet """
3212 """ Show a quick reference sheet """
3217 import IPython.core.usage
3213 import IPython.core.usage
3218 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3214 qr = IPython.core.usage.quick_reference + self.magic_magic('-brief')
3219
3215
3220 page.page(qr)
3216 page.page(qr)
3221
3217
3222 def magic_doctest_mode(self,parameter_s=''):
3218 def magic_doctest_mode(self,parameter_s=''):
3223 """Toggle doctest mode on and off.
3219 """Toggle doctest mode on and off.
3224
3220
3225 This mode is intended to make IPython behave as much as possible like a
3221 This mode is intended to make IPython behave as much as possible like a
3226 plain Python shell, from the perspective of how its prompts, exceptions
3222 plain Python shell, from the perspective of how its prompts, exceptions
3227 and output look. This makes it easy to copy and paste parts of a
3223 and output look. This makes it easy to copy and paste parts of a
3228 session into doctests. It does so by:
3224 session into doctests. It does so by:
3229
3225
3230 - Changing the prompts to the classic ``>>>`` ones.
3226 - Changing the prompts to the classic ``>>>`` ones.
3231 - Changing the exception reporting mode to 'Plain'.
3227 - Changing the exception reporting mode to 'Plain'.
3232 - Disabling pretty-printing of output.
3228 - Disabling pretty-printing of output.
3233
3229
3234 Note that IPython also supports the pasting of code snippets that have
3230 Note that IPython also supports the pasting of code snippets that have
3235 leading '>>>' and '...' prompts in them. This means that you can paste
3231 leading '>>>' and '...' prompts in them. This means that you can paste
3236 doctests from files or docstrings (even if they have leading
3232 doctests from files or docstrings (even if they have leading
3237 whitespace), and the code will execute correctly. You can then use
3233 whitespace), and the code will execute correctly. You can then use
3238 '%history -t' to see the translated history; this will give you the
3234 '%history -t' to see the translated history; this will give you the
3239 input after removal of all the leading prompts and whitespace, which
3235 input after removal of all the leading prompts and whitespace, which
3240 can be pasted back into an editor.
3236 can be pasted back into an editor.
3241
3237
3242 With these features, you can switch into this mode easily whenever you
3238 With these features, you can switch into this mode easily whenever you
3243 need to do testing and changes to doctests, without having to leave
3239 need to do testing and changes to doctests, without having to leave
3244 your existing IPython session.
3240 your existing IPython session.
3245 """
3241 """
3246
3242
3247 from IPython.utils.ipstruct import Struct
3243 from IPython.utils.ipstruct import Struct
3248
3244
3249 # Shorthands
3245 # Shorthands
3250 shell = self.shell
3246 shell = self.shell
3251 oc = shell.displayhook
3247 oc = shell.displayhook
3252 meta = shell.meta
3248 meta = shell.meta
3253 disp_formatter = self.shell.display_formatter
3249 disp_formatter = self.shell.display_formatter
3254 ptformatter = disp_formatter.formatters['text/plain']
3250 ptformatter = disp_formatter.formatters['text/plain']
3255 # dstore is a data store kept in the instance metadata bag to track any
3251 # dstore is a data store kept in the instance metadata bag to track any
3256 # changes we make, so we can undo them later.
3252 # changes we make, so we can undo them later.
3257 dstore = meta.setdefault('doctest_mode',Struct())
3253 dstore = meta.setdefault('doctest_mode',Struct())
3258 save_dstore = dstore.setdefault
3254 save_dstore = dstore.setdefault
3259
3255
3260 # save a few values we'll need to recover later
3256 # save a few values we'll need to recover later
3261 mode = save_dstore('mode',False)
3257 mode = save_dstore('mode',False)
3262 save_dstore('rc_pprint',ptformatter.pprint)
3258 save_dstore('rc_pprint',ptformatter.pprint)
3263 save_dstore('xmode',shell.InteractiveTB.mode)
3259 save_dstore('xmode',shell.InteractiveTB.mode)
3264 save_dstore('rc_separate_out',shell.separate_out)
3260 save_dstore('rc_separate_out',shell.separate_out)
3265 save_dstore('rc_separate_out2',shell.separate_out2)
3261 save_dstore('rc_separate_out2',shell.separate_out2)
3266 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3262 save_dstore('rc_prompts_pad_left',shell.prompts_pad_left)
3267 save_dstore('rc_separate_in',shell.separate_in)
3263 save_dstore('rc_separate_in',shell.separate_in)
3268 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3264 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
3269
3265
3270 if mode == False:
3266 if mode == False:
3271 # turn on
3267 # turn on
3272 oc.prompt1.p_template = '>>> '
3268 oc.prompt1.p_template = '>>> '
3273 oc.prompt2.p_template = '... '
3269 oc.prompt2.p_template = '... '
3274 oc.prompt_out.p_template = ''
3270 oc.prompt_out.p_template = ''
3275
3271
3276 # Prompt separators like plain python
3272 # Prompt separators like plain python
3277 oc.input_sep = oc.prompt1.sep = ''
3273 oc.input_sep = oc.prompt1.sep = ''
3278 oc.output_sep = ''
3274 oc.output_sep = ''
3279 oc.output_sep2 = ''
3275 oc.output_sep2 = ''
3280
3276
3281 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3277 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3282 oc.prompt_out.pad_left = False
3278 oc.prompt_out.pad_left = False
3283
3279
3284 ptformatter.pprint = False
3280 ptformatter.pprint = False
3285 disp_formatter.plain_text_only = True
3281 disp_formatter.plain_text_only = True
3286
3282
3287 shell.magic_xmode('Plain')
3283 shell.magic_xmode('Plain')
3288 else:
3284 else:
3289 # turn off
3285 # turn off
3290 oc.prompt1.p_template = shell.prompt_in1
3286 oc.prompt1.p_template = shell.prompt_in1
3291 oc.prompt2.p_template = shell.prompt_in2
3287 oc.prompt2.p_template = shell.prompt_in2
3292 oc.prompt_out.p_template = shell.prompt_out
3288 oc.prompt_out.p_template = shell.prompt_out
3293
3289
3294 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3290 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3295
3291
3296 oc.output_sep = dstore.rc_separate_out
3292 oc.output_sep = dstore.rc_separate_out
3297 oc.output_sep2 = dstore.rc_separate_out2
3293 oc.output_sep2 = dstore.rc_separate_out2
3298
3294
3299 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3295 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3300 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3296 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3301
3297
3302 ptformatter.pprint = dstore.rc_pprint
3298 ptformatter.pprint = dstore.rc_pprint
3303 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3299 disp_formatter.plain_text_only = dstore.rc_plain_text_only
3304
3300
3305 shell.magic_xmode(dstore.xmode)
3301 shell.magic_xmode(dstore.xmode)
3306
3302
3307 # Store new mode and inform
3303 # Store new mode and inform
3308 dstore.mode = bool(1-int(mode))
3304 dstore.mode = bool(1-int(mode))
3309 mode_label = ['OFF','ON'][dstore.mode]
3305 mode_label = ['OFF','ON'][dstore.mode]
3310 print 'Doctest mode is:', mode_label
3306 print 'Doctest mode is:', mode_label
3311
3307
3312 def magic_gui(self, parameter_s=''):
3308 def magic_gui(self, parameter_s=''):
3313 """Enable or disable IPython GUI event loop integration.
3309 """Enable or disable IPython GUI event loop integration.
3314
3310
3315 %gui [GUINAME]
3311 %gui [GUINAME]
3316
3312
3317 This magic replaces IPython's threaded shells that were activated
3313 This magic replaces IPython's threaded shells that were activated
3318 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3314 using the (pylab/wthread/etc.) command line flags. GUI toolkits
3319 can now be enabled, disabled and swtiched at runtime and keyboard
3315 can now be enabled, disabled and swtiched at runtime and keyboard
3320 interrupts should work without any problems. The following toolkits
3316 interrupts should work without any problems. The following toolkits
3321 are supported: wxPython, PyQt4, PyGTK, and Tk::
3317 are supported: wxPython, PyQt4, PyGTK, and Tk::
3322
3318
3323 %gui wx # enable wxPython event loop integration
3319 %gui wx # enable wxPython event loop integration
3324 %gui qt4|qt # enable PyQt4 event loop integration
3320 %gui qt4|qt # enable PyQt4 event loop integration
3325 %gui gtk # enable PyGTK event loop integration
3321 %gui gtk # enable PyGTK event loop integration
3326 %gui tk # enable Tk event loop integration
3322 %gui tk # enable Tk event loop integration
3327 %gui # disable all event loop integration
3323 %gui # disable all event loop integration
3328
3324
3329 WARNING: after any of these has been called you can simply create
3325 WARNING: after any of these has been called you can simply create
3330 an application object, but DO NOT start the event loop yourself, as
3326 an application object, but DO NOT start the event loop yourself, as
3331 we have already handled that.
3327 we have already handled that.
3332 """
3328 """
3333 from IPython.lib.inputhook import enable_gui
3329 from IPython.lib.inputhook import enable_gui
3334 opts, arg = self.parse_options(parameter_s, '')
3330 opts, arg = self.parse_options(parameter_s, '')
3335 if arg=='': arg = None
3331 if arg=='': arg = None
3336 return enable_gui(arg)
3332 return enable_gui(arg)
3337
3333
3338 def magic_load_ext(self, module_str):
3334 def magic_load_ext(self, module_str):
3339 """Load an IPython extension by its module name."""
3335 """Load an IPython extension by its module name."""
3340 return self.extension_manager.load_extension(module_str)
3336 return self.extension_manager.load_extension(module_str)
3341
3337
3342 def magic_unload_ext(self, module_str):
3338 def magic_unload_ext(self, module_str):
3343 """Unload an IPython extension by its module name."""
3339 """Unload an IPython extension by its module name."""
3344 self.extension_manager.unload_extension(module_str)
3340 self.extension_manager.unload_extension(module_str)
3345
3341
3346 def magic_reload_ext(self, module_str):
3342 def magic_reload_ext(self, module_str):
3347 """Reload an IPython extension by its module name."""
3343 """Reload an IPython extension by its module name."""
3348 self.extension_manager.reload_extension(module_str)
3344 self.extension_manager.reload_extension(module_str)
3349
3345
3350 @testdec.skip_doctest
3346 @testdec.skip_doctest
3351 def magic_install_profiles(self, s):
3347 def magic_install_profiles(self, s):
3352 """Install the default IPython profiles into the .ipython dir.
3348 """Install the default IPython profiles into the .ipython dir.
3353
3349
3354 If the default profiles have already been installed, they will not
3350 If the default profiles have already been installed, they will not
3355 be overwritten. You can force overwriting them by using the ``-o``
3351 be overwritten. You can force overwriting them by using the ``-o``
3356 option::
3352 option::
3357
3353
3358 In [1]: %install_profiles -o
3354 In [1]: %install_profiles -o
3359 """
3355 """
3360 if '-o' in s:
3356 if '-o' in s:
3361 overwrite = True
3357 overwrite = True
3362 else:
3358 else:
3363 overwrite = False
3359 overwrite = False
3364 from IPython.config import profile
3360 from IPython.config import profile
3365 profile_dir = os.path.split(profile.__file__)[0]
3361 profile_dir = os.path.split(profile.__file__)[0]
3366 ipython_dir = self.ipython_dir
3362 ipython_dir = self.ipython_dir
3367 files = os.listdir(profile_dir)
3363 files = os.listdir(profile_dir)
3368
3364
3369 to_install = []
3365 to_install = []
3370 for f in files:
3366 for f in files:
3371 if f.startswith('ipython_config'):
3367 if f.startswith('ipython_config'):
3372 src = os.path.join(profile_dir, f)
3368 src = os.path.join(profile_dir, f)
3373 dst = os.path.join(ipython_dir, f)
3369 dst = os.path.join(ipython_dir, f)
3374 if (not os.path.isfile(dst)) or overwrite:
3370 if (not os.path.isfile(dst)) or overwrite:
3375 to_install.append((f, src, dst))
3371 to_install.append((f, src, dst))
3376 if len(to_install)>0:
3372 if len(to_install)>0:
3377 print "Installing profiles to: ", ipython_dir
3373 print "Installing profiles to: ", ipython_dir
3378 for (f, src, dst) in to_install:
3374 for (f, src, dst) in to_install:
3379 shutil.copy(src, dst)
3375 shutil.copy(src, dst)
3380 print " %s" % f
3376 print " %s" % f
3381
3377
3382 def magic_install_default_config(self, s):
3378 def magic_install_default_config(self, s):
3383 """Install IPython's default config file into the .ipython dir.
3379 """Install IPython's default config file into the .ipython dir.
3384
3380
3385 If the default config file (:file:`ipython_config.py`) is already
3381 If the default config file (:file:`ipython_config.py`) is already
3386 installed, it will not be overwritten. You can force overwriting
3382 installed, it will not be overwritten. You can force overwriting
3387 by using the ``-o`` option::
3383 by using the ``-o`` option::
3388
3384
3389 In [1]: %install_default_config
3385 In [1]: %install_default_config
3390 """
3386 """
3391 if '-o' in s:
3387 if '-o' in s:
3392 overwrite = True
3388 overwrite = True
3393 else:
3389 else:
3394 overwrite = False
3390 overwrite = False
3395 from IPython.config import default
3391 from IPython.config import default
3396 config_dir = os.path.split(default.__file__)[0]
3392 config_dir = os.path.split(default.__file__)[0]
3397 ipython_dir = self.ipython_dir
3393 ipython_dir = self.ipython_dir
3398 default_config_file_name = 'ipython_config.py'
3394 default_config_file_name = 'ipython_config.py'
3399 src = os.path.join(config_dir, default_config_file_name)
3395 src = os.path.join(config_dir, default_config_file_name)
3400 dst = os.path.join(ipython_dir, default_config_file_name)
3396 dst = os.path.join(ipython_dir, default_config_file_name)
3401 if (not os.path.isfile(dst)) or overwrite:
3397 if (not os.path.isfile(dst)) or overwrite:
3402 shutil.copy(src, dst)
3398 shutil.copy(src, dst)
3403 print "Installing default config file: %s" % dst
3399 print "Installing default config file: %s" % dst
3404
3400
3405 # Pylab support: simple wrappers that activate pylab, load gui input
3401 # Pylab support: simple wrappers that activate pylab, load gui input
3406 # handling and modify slightly %run
3402 # handling and modify slightly %run
3407
3403
3408 @testdec.skip_doctest
3404 @testdec.skip_doctest
3409 def _pylab_magic_run(self, parameter_s=''):
3405 def _pylab_magic_run(self, parameter_s=''):
3410 Magic.magic_run(self, parameter_s,
3406 Magic.magic_run(self, parameter_s,
3411 runner=mpl_runner(self.shell.safe_execfile))
3407 runner=mpl_runner(self.shell.safe_execfile))
3412
3408
3413 _pylab_magic_run.__doc__ = magic_run.__doc__
3409 _pylab_magic_run.__doc__ = magic_run.__doc__
3414
3410
3415 @testdec.skip_doctest
3411 @testdec.skip_doctest
3416 def magic_pylab(self, s):
3412 def magic_pylab(self, s):
3417 """Load numpy and matplotlib to work interactively.
3413 """Load numpy and matplotlib to work interactively.
3418
3414
3419 %pylab [GUINAME]
3415 %pylab [GUINAME]
3420
3416
3421 This function lets you activate pylab (matplotlib, numpy and
3417 This function lets you activate pylab (matplotlib, numpy and
3422 interactive support) at any point during an IPython session.
3418 interactive support) at any point during an IPython session.
3423
3419
3424 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3420 It will import at the top level numpy as np, pyplot as plt, matplotlib,
3425 pylab and mlab, as well as all names from numpy and pylab.
3421 pylab and mlab, as well as all names from numpy and pylab.
3426
3422
3427 Parameters
3423 Parameters
3428 ----------
3424 ----------
3429 guiname : optional
3425 guiname : optional
3430 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk' or
3426 One of the valid arguments to the %gui magic ('qt', 'wx', 'gtk' or
3431 'tk'). If given, the corresponding Matplotlib backend is used,
3427 'tk'). If given, the corresponding Matplotlib backend is used,
3432 otherwise matplotlib's default (which you can override in your
3428 otherwise matplotlib's default (which you can override in your
3433 matplotlib config file) is used.
3429 matplotlib config file) is used.
3434
3430
3435 Examples
3431 Examples
3436 --------
3432 --------
3437 In this case, where the MPL default is TkAgg:
3433 In this case, where the MPL default is TkAgg:
3438 In [2]: %pylab
3434 In [2]: %pylab
3439
3435
3440 Welcome to pylab, a matplotlib-based Python environment.
3436 Welcome to pylab, a matplotlib-based Python environment.
3441 Backend in use: TkAgg
3437 Backend in use: TkAgg
3442 For more information, type 'help(pylab)'.
3438 For more information, type 'help(pylab)'.
3443
3439
3444 But you can explicitly request a different backend:
3440 But you can explicitly request a different backend:
3445 In [3]: %pylab qt
3441 In [3]: %pylab qt
3446
3442
3447 Welcome to pylab, a matplotlib-based Python environment.
3443 Welcome to pylab, a matplotlib-based Python environment.
3448 Backend in use: Qt4Agg
3444 Backend in use: Qt4Agg
3449 For more information, type 'help(pylab)'.
3445 For more information, type 'help(pylab)'.
3450 """
3446 """
3451 self.shell.enable_pylab(s)
3447 self.shell.enable_pylab(s)
3452
3448
3453 def magic_tb(self, s):
3449 def magic_tb(self, s):
3454 """Print the last traceback with the currently active exception mode.
3450 """Print the last traceback with the currently active exception mode.
3455
3451
3456 See %xmode for changing exception reporting modes."""
3452 See %xmode for changing exception reporting modes."""
3457 self.shell.showtraceback()
3453 self.shell.showtraceback()
3458
3454
3459 @testdec.skip_doctest
3455 @testdec.skip_doctest
3460 def magic_precision(self, s=''):
3456 def magic_precision(self, s=''):
3461 """Set floating point precision for pretty printing.
3457 """Set floating point precision for pretty printing.
3462
3458
3463 Can set either integer precision or a format string.
3459 Can set either integer precision or a format string.
3464
3460
3465 If numpy has been imported and precision is an int,
3461 If numpy has been imported and precision is an int,
3466 numpy display precision will also be set, via ``numpy.set_printoptions``.
3462 numpy display precision will also be set, via ``numpy.set_printoptions``.
3467
3463
3468 If no argument is given, defaults will be restored.
3464 If no argument is given, defaults will be restored.
3469
3465
3470 Examples
3466 Examples
3471 --------
3467 --------
3472 ::
3468 ::
3473
3469
3474 In [1]: from math import pi
3470 In [1]: from math import pi
3475
3471
3476 In [2]: %precision 3
3472 In [2]: %precision 3
3477 Out[2]: '%.3f'
3473 Out[2]: '%.3f'
3478
3474
3479 In [3]: pi
3475 In [3]: pi
3480 Out[3]: 3.142
3476 Out[3]: 3.142
3481
3477
3482 In [4]: %precision %i
3478 In [4]: %precision %i
3483 Out[4]: '%i'
3479 Out[4]: '%i'
3484
3480
3485 In [5]: pi
3481 In [5]: pi
3486 Out[5]: 3
3482 Out[5]: 3
3487
3483
3488 In [6]: %precision %e
3484 In [6]: %precision %e
3489 Out[6]: '%e'
3485 Out[6]: '%e'
3490
3486
3491 In [7]: pi**10
3487 In [7]: pi**10
3492 Out[7]: 9.364805e+04
3488 Out[7]: 9.364805e+04
3493
3489
3494 In [8]: %precision
3490 In [8]: %precision
3495 Out[8]: '%r'
3491 Out[8]: '%r'
3496
3492
3497 In [9]: pi**10
3493 In [9]: pi**10
3498 Out[9]: 93648.047476082982
3494 Out[9]: 93648.047476082982
3499
3495
3500 """
3496 """
3501
3497
3502 ptformatter = self.shell.display_formatter.formatters['text/plain']
3498 ptformatter = self.shell.display_formatter.formatters['text/plain']
3503 ptformatter.float_precision = s
3499 ptformatter.float_precision = s
3504 return ptformatter.float_format
3500 return ptformatter.float_format
3505
3501
3506 # end Magic
3502 # end Magic
@@ -1,499 +1,496 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 Utilities for working with strings and text.
3 Utilities for working with strings and text.
4 """
4 """
5
5
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2008-2009 The IPython Development Team
7 # Copyright (C) 2008-2009 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 import __main__
17 import __main__
18
18
19 import os
19 import os
20 import re
20 import re
21 import shutil
21 import shutil
22 import types
23
22
24 from IPython.external.path import path
23 from IPython.external.path import path
25
24
26 from IPython.utils.io import nlprint
25 from IPython.utils.io import nlprint
27 from IPython.utils.data import flatten
26 from IPython.utils.data import flatten
28
27
29 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
30 # Code
29 # Code
31 #-----------------------------------------------------------------------------
30 #-----------------------------------------------------------------------------
32
31
33 StringTypes = types.StringTypes
34
35
32
36 def unquote_ends(istr):
33 def unquote_ends(istr):
37 """Remove a single pair of quotes from the endpoints of a string."""
34 """Remove a single pair of quotes from the endpoints of a string."""
38
35
39 if not istr:
36 if not istr:
40 return istr
37 return istr
41 if (istr[0]=="'" and istr[-1]=="'") or \
38 if (istr[0]=="'" and istr[-1]=="'") or \
42 (istr[0]=='"' and istr[-1]=='"'):
39 (istr[0]=='"' and istr[-1]=='"'):
43 return istr[1:-1]
40 return istr[1:-1]
44 else:
41 else:
45 return istr
42 return istr
46
43
47
44
48 class LSString(str):
45 class LSString(str):
49 """String derivative with a special access attributes.
46 """String derivative with a special access attributes.
50
47
51 These are normal strings, but with the special attributes:
48 These are normal strings, but with the special attributes:
52
49
53 .l (or .list) : value as list (split on newlines).
50 .l (or .list) : value as list (split on newlines).
54 .n (or .nlstr): original value (the string itself).
51 .n (or .nlstr): original value (the string itself).
55 .s (or .spstr): value as whitespace-separated string.
52 .s (or .spstr): value as whitespace-separated string.
56 .p (or .paths): list of path objects
53 .p (or .paths): list of path objects
57
54
58 Any values which require transformations are computed only once and
55 Any values which require transformations are computed only once and
59 cached.
56 cached.
60
57
61 Such strings are very useful to efficiently interact with the shell, which
58 Such strings are very useful to efficiently interact with the shell, which
62 typically only understands whitespace-separated options for commands."""
59 typically only understands whitespace-separated options for commands."""
63
60
64 def get_list(self):
61 def get_list(self):
65 try:
62 try:
66 return self.__list
63 return self.__list
67 except AttributeError:
64 except AttributeError:
68 self.__list = self.split('\n')
65 self.__list = self.split('\n')
69 return self.__list
66 return self.__list
70
67
71 l = list = property(get_list)
68 l = list = property(get_list)
72
69
73 def get_spstr(self):
70 def get_spstr(self):
74 try:
71 try:
75 return self.__spstr
72 return self.__spstr
76 except AttributeError:
73 except AttributeError:
77 self.__spstr = self.replace('\n',' ')
74 self.__spstr = self.replace('\n',' ')
78 return self.__spstr
75 return self.__spstr
79
76
80 s = spstr = property(get_spstr)
77 s = spstr = property(get_spstr)
81
78
82 def get_nlstr(self):
79 def get_nlstr(self):
83 return self
80 return self
84
81
85 n = nlstr = property(get_nlstr)
82 n = nlstr = property(get_nlstr)
86
83
87 def get_paths(self):
84 def get_paths(self):
88 try:
85 try:
89 return self.__paths
86 return self.__paths
90 except AttributeError:
87 except AttributeError:
91 self.__paths = [path(p) for p in self.split('\n') if os.path.exists(p)]
88 self.__paths = [path(p) for p in self.split('\n') if os.path.exists(p)]
92 return self.__paths
89 return self.__paths
93
90
94 p = paths = property(get_paths)
91 p = paths = property(get_paths)
95
92
96 # FIXME: We need to reimplement type specific displayhook and then add this
93 # FIXME: We need to reimplement type specific displayhook and then add this
97 # back as a custom printer. This should also be moved outside utils into the
94 # back as a custom printer. This should also be moved outside utils into the
98 # core.
95 # core.
99
96
100 # def print_lsstring(arg):
97 # def print_lsstring(arg):
101 # """ Prettier (non-repr-like) and more informative printer for LSString """
98 # """ Prettier (non-repr-like) and more informative printer for LSString """
102 # print "LSString (.p, .n, .l, .s available). Value:"
99 # print "LSString (.p, .n, .l, .s available). Value:"
103 # print arg
100 # print arg
104 #
101 #
105 #
102 #
106 # print_lsstring = result_display.when_type(LSString)(print_lsstring)
103 # print_lsstring = result_display.when_type(LSString)(print_lsstring)
107
104
108
105
109 class SList(list):
106 class SList(list):
110 """List derivative with a special access attributes.
107 """List derivative with a special access attributes.
111
108
112 These are normal lists, but with the special attributes:
109 These are normal lists, but with the special attributes:
113
110
114 .l (or .list) : value as list (the list itself).
111 .l (or .list) : value as list (the list itself).
115 .n (or .nlstr): value as a string, joined on newlines.
112 .n (or .nlstr): value as a string, joined on newlines.
116 .s (or .spstr): value as a string, joined on spaces.
113 .s (or .spstr): value as a string, joined on spaces.
117 .p (or .paths): list of path objects
114 .p (or .paths): list of path objects
118
115
119 Any values which require transformations are computed only once and
116 Any values which require transformations are computed only once and
120 cached."""
117 cached."""
121
118
122 def get_list(self):
119 def get_list(self):
123 return self
120 return self
124
121
125 l = list = property(get_list)
122 l = list = property(get_list)
126
123
127 def get_spstr(self):
124 def get_spstr(self):
128 try:
125 try:
129 return self.__spstr
126 return self.__spstr
130 except AttributeError:
127 except AttributeError:
131 self.__spstr = ' '.join(self)
128 self.__spstr = ' '.join(self)
132 return self.__spstr
129 return self.__spstr
133
130
134 s = spstr = property(get_spstr)
131 s = spstr = property(get_spstr)
135
132
136 def get_nlstr(self):
133 def get_nlstr(self):
137 try:
134 try:
138 return self.__nlstr
135 return self.__nlstr
139 except AttributeError:
136 except AttributeError:
140 self.__nlstr = '\n'.join(self)
137 self.__nlstr = '\n'.join(self)
141 return self.__nlstr
138 return self.__nlstr
142
139
143 n = nlstr = property(get_nlstr)
140 n = nlstr = property(get_nlstr)
144
141
145 def get_paths(self):
142 def get_paths(self):
146 try:
143 try:
147 return self.__paths
144 return self.__paths
148 except AttributeError:
145 except AttributeError:
149 self.__paths = [path(p) for p in self if os.path.exists(p)]
146 self.__paths = [path(p) for p in self if os.path.exists(p)]
150 return self.__paths
147 return self.__paths
151
148
152 p = paths = property(get_paths)
149 p = paths = property(get_paths)
153
150
154 def grep(self, pattern, prune = False, field = None):
151 def grep(self, pattern, prune = False, field = None):
155 """ Return all strings matching 'pattern' (a regex or callable)
152 """ Return all strings matching 'pattern' (a regex or callable)
156
153
157 This is case-insensitive. If prune is true, return all items
154 This is case-insensitive. If prune is true, return all items
158 NOT matching the pattern.
155 NOT matching the pattern.
159
156
160 If field is specified, the match must occur in the specified
157 If field is specified, the match must occur in the specified
161 whitespace-separated field.
158 whitespace-separated field.
162
159
163 Examples::
160 Examples::
164
161
165 a.grep( lambda x: x.startswith('C') )
162 a.grep( lambda x: x.startswith('C') )
166 a.grep('Cha.*log', prune=1)
163 a.grep('Cha.*log', prune=1)
167 a.grep('chm', field=-1)
164 a.grep('chm', field=-1)
168 """
165 """
169
166
170 def match_target(s):
167 def match_target(s):
171 if field is None:
168 if field is None:
172 return s
169 return s
173 parts = s.split()
170 parts = s.split()
174 try:
171 try:
175 tgt = parts[field]
172 tgt = parts[field]
176 return tgt
173 return tgt
177 except IndexError:
174 except IndexError:
178 return ""
175 return ""
179
176
180 if isinstance(pattern, basestring):
177 if isinstance(pattern, basestring):
181 pred = lambda x : re.search(pattern, x, re.IGNORECASE)
178 pred = lambda x : re.search(pattern, x, re.IGNORECASE)
182 else:
179 else:
183 pred = pattern
180 pred = pattern
184 if not prune:
181 if not prune:
185 return SList([el for el in self if pred(match_target(el))])
182 return SList([el for el in self if pred(match_target(el))])
186 else:
183 else:
187 return SList([el for el in self if not pred(match_target(el))])
184 return SList([el for el in self if not pred(match_target(el))])
188
185
189 def fields(self, *fields):
186 def fields(self, *fields):
190 """ Collect whitespace-separated fields from string list
187 """ Collect whitespace-separated fields from string list
191
188
192 Allows quick awk-like usage of string lists.
189 Allows quick awk-like usage of string lists.
193
190
194 Example data (in var a, created by 'a = !ls -l')::
191 Example data (in var a, created by 'a = !ls -l')::
195 -rwxrwxrwx 1 ville None 18 Dec 14 2006 ChangeLog
192 -rwxrwxrwx 1 ville None 18 Dec 14 2006 ChangeLog
196 drwxrwxrwx+ 6 ville None 0 Oct 24 18:05 IPython
193 drwxrwxrwx+ 6 ville None 0 Oct 24 18:05 IPython
197
194
198 a.fields(0) is ['-rwxrwxrwx', 'drwxrwxrwx+']
195 a.fields(0) is ['-rwxrwxrwx', 'drwxrwxrwx+']
199 a.fields(1,0) is ['1 -rwxrwxrwx', '6 drwxrwxrwx+']
196 a.fields(1,0) is ['1 -rwxrwxrwx', '6 drwxrwxrwx+']
200 (note the joining by space).
197 (note the joining by space).
201 a.fields(-1) is ['ChangeLog', 'IPython']
198 a.fields(-1) is ['ChangeLog', 'IPython']
202
199
203 IndexErrors are ignored.
200 IndexErrors are ignored.
204
201
205 Without args, fields() just split()'s the strings.
202 Without args, fields() just split()'s the strings.
206 """
203 """
207 if len(fields) == 0:
204 if len(fields) == 0:
208 return [el.split() for el in self]
205 return [el.split() for el in self]
209
206
210 res = SList()
207 res = SList()
211 for el in [f.split() for f in self]:
208 for el in [f.split() for f in self]:
212 lineparts = []
209 lineparts = []
213
210
214 for fd in fields:
211 for fd in fields:
215 try:
212 try:
216 lineparts.append(el[fd])
213 lineparts.append(el[fd])
217 except IndexError:
214 except IndexError:
218 pass
215 pass
219 if lineparts:
216 if lineparts:
220 res.append(" ".join(lineparts))
217 res.append(" ".join(lineparts))
221
218
222 return res
219 return res
223
220
224 def sort(self,field= None, nums = False):
221 def sort(self,field= None, nums = False):
225 """ sort by specified fields (see fields())
222 """ sort by specified fields (see fields())
226
223
227 Example::
224 Example::
228 a.sort(1, nums = True)
225 a.sort(1, nums = True)
229
226
230 Sorts a by second field, in numerical order (so that 21 > 3)
227 Sorts a by second field, in numerical order (so that 21 > 3)
231
228
232 """
229 """
233
230
234 #decorate, sort, undecorate
231 #decorate, sort, undecorate
235 if field is not None:
232 if field is not None:
236 dsu = [[SList([line]).fields(field), line] for line in self]
233 dsu = [[SList([line]).fields(field), line] for line in self]
237 else:
234 else:
238 dsu = [[line, line] for line in self]
235 dsu = [[line, line] for line in self]
239 if nums:
236 if nums:
240 for i in range(len(dsu)):
237 for i in range(len(dsu)):
241 numstr = "".join([ch for ch in dsu[i][0] if ch.isdigit()])
238 numstr = "".join([ch for ch in dsu[i][0] if ch.isdigit()])
242 try:
239 try:
243 n = int(numstr)
240 n = int(numstr)
244 except ValueError:
241 except ValueError:
245 n = 0;
242 n = 0;
246 dsu[i][0] = n
243 dsu[i][0] = n
247
244
248
245
249 dsu.sort()
246 dsu.sort()
250 return SList([t[1] for t in dsu])
247 return SList([t[1] for t in dsu])
251
248
252
249
253 # FIXME: We need to reimplement type specific displayhook and then add this
250 # FIXME: We need to reimplement type specific displayhook and then add this
254 # back as a custom printer. This should also be moved outside utils into the
251 # back as a custom printer. This should also be moved outside utils into the
255 # core.
252 # core.
256
253
257 # def print_slist(arg):
254 # def print_slist(arg):
258 # """ Prettier (non-repr-like) and more informative printer for SList """
255 # """ Prettier (non-repr-like) and more informative printer for SList """
259 # print "SList (.p, .n, .l, .s, .grep(), .fields(), sort() available):"
256 # print "SList (.p, .n, .l, .s, .grep(), .fields(), sort() available):"
260 # if hasattr(arg, 'hideonce') and arg.hideonce:
257 # if hasattr(arg, 'hideonce') and arg.hideonce:
261 # arg.hideonce = False
258 # arg.hideonce = False
262 # return
259 # return
263 #
260 #
264 # nlprint(arg)
261 # nlprint(arg)
265 #
262 #
266 # print_slist = result_display.when_type(SList)(print_slist)
263 # print_slist = result_display.when_type(SList)(print_slist)
267
264
268
265
269 def esc_quotes(strng):
266 def esc_quotes(strng):
270 """Return the input string with single and double quotes escaped out"""
267 """Return the input string with single and double quotes escaped out"""
271
268
272 return strng.replace('"','\\"').replace("'","\\'")
269 return strng.replace('"','\\"').replace("'","\\'")
273
270
274
271
275 def make_quoted_expr(s):
272 def make_quoted_expr(s):
276 """Return string s in appropriate quotes, using raw string if possible.
273 """Return string s in appropriate quotes, using raw string if possible.
277
274
278 XXX - example removed because it caused encoding errors in documentation
275 XXX - example removed because it caused encoding errors in documentation
279 generation. We need a new example that doesn't contain invalid chars.
276 generation. We need a new example that doesn't contain invalid chars.
280
277
281 Note the use of raw string and padding at the end to allow trailing
278 Note the use of raw string and padding at the end to allow trailing
282 backslash.
279 backslash.
283 """
280 """
284
281
285 tail = ''
282 tail = ''
286 tailpadding = ''
283 tailpadding = ''
287 raw = ''
284 raw = ''
288 if "\\" in s:
285 if "\\" in s:
289 raw = 'r'
286 raw = 'r'
290 if s.endswith('\\'):
287 if s.endswith('\\'):
291 tail = '[:-1]'
288 tail = '[:-1]'
292 tailpadding = '_'
289 tailpadding = '_'
293 if '"' not in s:
290 if '"' not in s:
294 quote = '"'
291 quote = '"'
295 elif "'" not in s:
292 elif "'" not in s:
296 quote = "'"
293 quote = "'"
297 elif '"""' not in s and not s.endswith('"'):
294 elif '"""' not in s and not s.endswith('"'):
298 quote = '"""'
295 quote = '"""'
299 elif "'''" not in s and not s.endswith("'"):
296 elif "'''" not in s and not s.endswith("'"):
300 quote = "'''"
297 quote = "'''"
301 else:
298 else:
302 # give up, backslash-escaped string will do
299 # give up, backslash-escaped string will do
303 return '"%s"' % esc_quotes(s)
300 return '"%s"' % esc_quotes(s)
304 res = raw + quote + s + tailpadding + quote + tail
301 res = raw + quote + s + tailpadding + quote + tail
305 return res
302 return res
306
303
307
304
308 def qw(words,flat=0,sep=None,maxsplit=-1):
305 def qw(words,flat=0,sep=None,maxsplit=-1):
309 """Similar to Perl's qw() operator, but with some more options.
306 """Similar to Perl's qw() operator, but with some more options.
310
307
311 qw(words,flat=0,sep=' ',maxsplit=-1) -> words.split(sep,maxsplit)
308 qw(words,flat=0,sep=' ',maxsplit=-1) -> words.split(sep,maxsplit)
312
309
313 words can also be a list itself, and with flat=1, the output will be
310 words can also be a list itself, and with flat=1, the output will be
314 recursively flattened.
311 recursively flattened.
315
312
316 Examples:
313 Examples:
317
314
318 >>> qw('1 2')
315 >>> qw('1 2')
319 ['1', '2']
316 ['1', '2']
320
317
321 >>> qw(['a b','1 2',['m n','p q']])
318 >>> qw(['a b','1 2',['m n','p q']])
322 [['a', 'b'], ['1', '2'], [['m', 'n'], ['p', 'q']]]
319 [['a', 'b'], ['1', '2'], [['m', 'n'], ['p', 'q']]]
323
320
324 >>> qw(['a b','1 2',['m n','p q']],flat=1)
321 >>> qw(['a b','1 2',['m n','p q']],flat=1)
325 ['a', 'b', '1', '2', 'm', 'n', 'p', 'q']
322 ['a', 'b', '1', '2', 'm', 'n', 'p', 'q']
326 """
323 """
327
324
328 if type(words) in StringTypes:
325 if isinstance(words, basestring):
329 return [word.strip() for word in words.split(sep,maxsplit)
326 return [word.strip() for word in words.split(sep,maxsplit)
330 if word and not word.isspace() ]
327 if word and not word.isspace() ]
331 if flat:
328 if flat:
332 return flatten(map(qw,words,[1]*len(words)))
329 return flatten(map(qw,words,[1]*len(words)))
333 return map(qw,words)
330 return map(qw,words)
334
331
335
332
336 def qwflat(words,sep=None,maxsplit=-1):
333 def qwflat(words,sep=None,maxsplit=-1):
337 """Calls qw(words) in flat mode. It's just a convenient shorthand."""
334 """Calls qw(words) in flat mode. It's just a convenient shorthand."""
338 return qw(words,1,sep,maxsplit)
335 return qw(words,1,sep,maxsplit)
339
336
340
337
341 def qw_lol(indata):
338 def qw_lol(indata):
342 """qw_lol('a b') -> [['a','b']],
339 """qw_lol('a b') -> [['a','b']],
343 otherwise it's just a call to qw().
340 otherwise it's just a call to qw().
344
341
345 We need this to make sure the modules_some keys *always* end up as a
342 We need this to make sure the modules_some keys *always* end up as a
346 list of lists."""
343 list of lists."""
347
344
348 if type(indata) in StringTypes:
345 if isinstance(indata, basestring):
349 return [qw(indata)]
346 return [qw(indata)]
350 else:
347 else:
351 return qw(indata)
348 return qw(indata)
352
349
353
350
354 def grep(pat,list,case=1):
351 def grep(pat,list,case=1):
355 """Simple minded grep-like function.
352 """Simple minded grep-like function.
356 grep(pat,list) returns occurrences of pat in list, None on failure.
353 grep(pat,list) returns occurrences of pat in list, None on failure.
357
354
358 It only does simple string matching, with no support for regexps. Use the
355 It only does simple string matching, with no support for regexps. Use the
359 option case=0 for case-insensitive matching."""
356 option case=0 for case-insensitive matching."""
360
357
361 # This is pretty crude. At least it should implement copying only references
358 # This is pretty crude. At least it should implement copying only references
362 # to the original data in case it's big. Now it copies the data for output.
359 # to the original data in case it's big. Now it copies the data for output.
363 out=[]
360 out=[]
364 if case:
361 if case:
365 for term in list:
362 for term in list:
366 if term.find(pat)>-1: out.append(term)
363 if term.find(pat)>-1: out.append(term)
367 else:
364 else:
368 lpat=pat.lower()
365 lpat=pat.lower()
369 for term in list:
366 for term in list:
370 if term.lower().find(lpat)>-1: out.append(term)
367 if term.lower().find(lpat)>-1: out.append(term)
371
368
372 if len(out): return out
369 if len(out): return out
373 else: return None
370 else: return None
374
371
375
372
376 def dgrep(pat,*opts):
373 def dgrep(pat,*opts):
377 """Return grep() on dir()+dir(__builtins__).
374 """Return grep() on dir()+dir(__builtins__).
378
375
379 A very common use of grep() when working interactively."""
376 A very common use of grep() when working interactively."""
380
377
381 return grep(pat,dir(__main__)+dir(__main__.__builtins__),*opts)
378 return grep(pat,dir(__main__)+dir(__main__.__builtins__),*opts)
382
379
383
380
384 def idgrep(pat):
381 def idgrep(pat):
385 """Case-insensitive dgrep()"""
382 """Case-insensitive dgrep()"""
386
383
387 return dgrep(pat,0)
384 return dgrep(pat,0)
388
385
389
386
390 def igrep(pat,list):
387 def igrep(pat,list):
391 """Synonym for case-insensitive grep."""
388 """Synonym for case-insensitive grep."""
392
389
393 return grep(pat,list,case=0)
390 return grep(pat,list,case=0)
394
391
395
392
396 def indent(str,nspaces=4,ntabs=0):
393 def indent(str,nspaces=4,ntabs=0):
397 """Indent a string a given number of spaces or tabstops.
394 """Indent a string a given number of spaces or tabstops.
398
395
399 indent(str,nspaces=4,ntabs=0) -> indent str by ntabs+nspaces.
396 indent(str,nspaces=4,ntabs=0) -> indent str by ntabs+nspaces.
400 """
397 """
401 if str is None:
398 if str is None:
402 return
399 return
403 ind = '\t'*ntabs+' '*nspaces
400 ind = '\t'*ntabs+' '*nspaces
404 outstr = '%s%s' % (ind,str.replace(os.linesep,os.linesep+ind))
401 outstr = '%s%s' % (ind,str.replace(os.linesep,os.linesep+ind))
405 if outstr.endswith(os.linesep+ind):
402 if outstr.endswith(os.linesep+ind):
406 return outstr[:-len(ind)]
403 return outstr[:-len(ind)]
407 else:
404 else:
408 return outstr
405 return outstr
409
406
410 def native_line_ends(filename,backup=1):
407 def native_line_ends(filename,backup=1):
411 """Convert (in-place) a file to line-ends native to the current OS.
408 """Convert (in-place) a file to line-ends native to the current OS.
412
409
413 If the optional backup argument is given as false, no backup of the
410 If the optional backup argument is given as false, no backup of the
414 original file is left. """
411 original file is left. """
415
412
416 backup_suffixes = {'posix':'~','dos':'.bak','nt':'.bak','mac':'.bak'}
413 backup_suffixes = {'posix':'~','dos':'.bak','nt':'.bak','mac':'.bak'}
417
414
418 bak_filename = filename + backup_suffixes[os.name]
415 bak_filename = filename + backup_suffixes[os.name]
419
416
420 original = open(filename).read()
417 original = open(filename).read()
421 shutil.copy2(filename,bak_filename)
418 shutil.copy2(filename,bak_filename)
422 try:
419 try:
423 new = open(filename,'wb')
420 new = open(filename,'wb')
424 new.write(os.linesep.join(original.splitlines()))
421 new.write(os.linesep.join(original.splitlines()))
425 new.write(os.linesep) # ALWAYS put an eol at the end of the file
422 new.write(os.linesep) # ALWAYS put an eol at the end of the file
426 new.close()
423 new.close()
427 except:
424 except:
428 os.rename(bak_filename,filename)
425 os.rename(bak_filename,filename)
429 if not backup:
426 if not backup:
430 try:
427 try:
431 os.remove(bak_filename)
428 os.remove(bak_filename)
432 except:
429 except:
433 pass
430 pass
434
431
435
432
436 def list_strings(arg):
433 def list_strings(arg):
437 """Always return a list of strings, given a string or list of strings
434 """Always return a list of strings, given a string or list of strings
438 as input.
435 as input.
439
436
440 :Examples:
437 :Examples:
441
438
442 In [7]: list_strings('A single string')
439 In [7]: list_strings('A single string')
443 Out[7]: ['A single string']
440 Out[7]: ['A single string']
444
441
445 In [8]: list_strings(['A single string in a list'])
442 In [8]: list_strings(['A single string in a list'])
446 Out[8]: ['A single string in a list']
443 Out[8]: ['A single string in a list']
447
444
448 In [9]: list_strings(['A','list','of','strings'])
445 In [9]: list_strings(['A','list','of','strings'])
449 Out[9]: ['A', 'list', 'of', 'strings']
446 Out[9]: ['A', 'list', 'of', 'strings']
450 """
447 """
451
448
452 if isinstance(arg,basestring): return [arg]
449 if isinstance(arg,basestring): return [arg]
453 else: return arg
450 else: return arg
454
451
455
452
456 def marquee(txt='',width=78,mark='*'):
453 def marquee(txt='',width=78,mark='*'):
457 """Return the input string centered in a 'marquee'.
454 """Return the input string centered in a 'marquee'.
458
455
459 :Examples:
456 :Examples:
460
457
461 In [16]: marquee('A test',40)
458 In [16]: marquee('A test',40)
462 Out[16]: '**************** A test ****************'
459 Out[16]: '**************** A test ****************'
463
460
464 In [17]: marquee('A test',40,'-')
461 In [17]: marquee('A test',40,'-')
465 Out[17]: '---------------- A test ----------------'
462 Out[17]: '---------------- A test ----------------'
466
463
467 In [18]: marquee('A test',40,' ')
464 In [18]: marquee('A test',40,' ')
468 Out[18]: ' A test '
465 Out[18]: ' A test '
469
466
470 """
467 """
471 if not txt:
468 if not txt:
472 return (mark*width)[:width]
469 return (mark*width)[:width]
473 nmark = (width-len(txt)-2)/len(mark)/2
470 nmark = (width-len(txt)-2)/len(mark)/2
474 if nmark < 0: nmark =0
471 if nmark < 0: nmark =0
475 marks = mark*nmark
472 marks = mark*nmark
476 return '%s %s %s' % (marks,txt,marks)
473 return '%s %s %s' % (marks,txt,marks)
477
474
478
475
479 ini_spaces_re = re.compile(r'^(\s+)')
476 ini_spaces_re = re.compile(r'^(\s+)')
480
477
481 def num_ini_spaces(strng):
478 def num_ini_spaces(strng):
482 """Return the number of initial spaces in a string"""
479 """Return the number of initial spaces in a string"""
483
480
484 ini_spaces = ini_spaces_re.match(strng)
481 ini_spaces = ini_spaces_re.match(strng)
485 if ini_spaces:
482 if ini_spaces:
486 return ini_spaces.end()
483 return ini_spaces.end()
487 else:
484 else:
488 return 0
485 return 0
489
486
490
487
491 def format_screen(strng):
488 def format_screen(strng):
492 """Format a string for screen printing.
489 """Format a string for screen printing.
493
490
494 This removes some latex-type format codes."""
491 This removes some latex-type format codes."""
495 # Paragraph continue
492 # Paragraph continue
496 par_re = re.compile(r'\\$',re.MULTILINE)
493 par_re = re.compile(r'\\$',re.MULTILINE)
497 strng = par_re.sub('',strng)
494 strng = par_re.sub('',strng)
498 return strng
495 return strng
499
496
@@ -1,613 +1,607 b''
1 """A ZMQ-based subclass of InteractiveShell.
1 """A ZMQ-based subclass of InteractiveShell.
2
2
3 This code is meant to ease the refactoring of the base InteractiveShell into
3 This code is meant to ease the refactoring of the base InteractiveShell into
4 something with a cleaner architecture for 2-process use, without actually
4 something with a cleaner architecture for 2-process use, without actually
5 breaking InteractiveShell itself. So we're doing something a bit ugly, where
5 breaking InteractiveShell itself. So we're doing something a bit ugly, where
6 we subclass and override what we want to fix. Once this is working well, we
6 we subclass and override what we want to fix. Once this is working well, we
7 can go back to the base class and refactor the code for a cleaner inheritance
7 can go back to the base class and refactor the code for a cleaner inheritance
8 implementation that doesn't rely on so much monkeypatching.
8 implementation that doesn't rely on so much monkeypatching.
9
9
10 But this lets us maintain a fully working IPython as we develop the new
10 But this lets us maintain a fully working IPython as we develop the new
11 machinery. This should thus be thought of as scaffolding.
11 machinery. This should thus be thought of as scaffolding.
12 """
12 """
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 from __future__ import print_function
16 from __future__ import print_function
17
17
18 # Stdlib
18 # Stdlib
19 import inspect
19 import inspect
20 import os
20 import os
21 import re
22
21
23 # Our own
22 # Our own
24 from IPython.core.interactiveshell import (
23 from IPython.core.interactiveshell import (
25 InteractiveShell, InteractiveShellABC
24 InteractiveShell, InteractiveShellABC
26 )
25 )
27 from IPython.core import page
26 from IPython.core import page
28 from IPython.core.displayhook import DisplayHook
27 from IPython.core.displayhook import DisplayHook
29 from IPython.core.displaypub import DisplayPublisher
28 from IPython.core.displaypub import DisplayPublisher
30 from IPython.core.macro import Macro
29 from IPython.core.macro import Macro
31 from IPython.core.payloadpage import install_payload_page
30 from IPython.core.payloadpage import install_payload_page
32 from IPython.utils import io
31 from IPython.utils import io
33 from IPython.utils.path import get_py_filename
32 from IPython.utils.path import get_py_filename
34 from IPython.utils.text import StringTypes
35 from IPython.utils.traitlets import Instance, Type, Dict
33 from IPython.utils.traitlets import Instance, Type, Dict
36 from IPython.utils.warn import warn
34 from IPython.utils.warn import warn
37 from IPython.zmq.session import extract_header
35 from IPython.zmq.session import extract_header
38 from session import Session
36 from session import Session
39
37
40 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
41 # Globals and side-effects
39 # Globals and side-effects
42 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
43
41
44 # Install the payload version of page.
42 # Install the payload version of page.
45 install_payload_page()
43 install_payload_page()
46
44
47 #-----------------------------------------------------------------------------
45 #-----------------------------------------------------------------------------
48 # Functions and classes
46 # Functions and classes
49 #-----------------------------------------------------------------------------
47 #-----------------------------------------------------------------------------
50
48
51 class ZMQDisplayHook(DisplayHook):
49 class ZMQDisplayHook(DisplayHook):
52 """A displayhook subclass that publishes data using ZeroMQ."""
50 """A displayhook subclass that publishes data using ZeroMQ."""
53
51
54 session = Instance(Session)
52 session = Instance(Session)
55 pub_socket = Instance('zmq.Socket')
53 pub_socket = Instance('zmq.Socket')
56 parent_header = Dict({})
54 parent_header = Dict({})
57
55
58 def set_parent(self, parent):
56 def set_parent(self, parent):
59 """Set the parent for outbound messages."""
57 """Set the parent for outbound messages."""
60 self.parent_header = extract_header(parent)
58 self.parent_header = extract_header(parent)
61
59
62 def start_displayhook(self):
60 def start_displayhook(self):
63 self.msg = self.session.msg(u'pyout', {}, parent=self.parent_header)
61 self.msg = self.session.msg(u'pyout', {}, parent=self.parent_header)
64
62
65 def write_output_prompt(self):
63 def write_output_prompt(self):
66 """Write the output prompt."""
64 """Write the output prompt."""
67 if self.do_full_cache:
65 if self.do_full_cache:
68 self.msg['content']['execution_count'] = self.prompt_count
66 self.msg['content']['execution_count'] = self.prompt_count
69
67
70 def write_format_data(self, format_dict):
68 def write_format_data(self, format_dict):
71 self.msg['content']['data'] = format_dict
69 self.msg['content']['data'] = format_dict
72
70
73 def finish_displayhook(self):
71 def finish_displayhook(self):
74 """Finish up all displayhook activities."""
72 """Finish up all displayhook activities."""
75 self.session.send(self.pub_socket, self.msg)
73 self.session.send(self.pub_socket, self.msg)
76 self.msg = None
74 self.msg = None
77
75
78
76
79 class ZMQDisplayPublisher(DisplayPublisher):
77 class ZMQDisplayPublisher(DisplayPublisher):
80 """A display publisher that publishes data using a ZeroMQ PUB socket."""
78 """A display publisher that publishes data using a ZeroMQ PUB socket."""
81
79
82 session = Instance(Session)
80 session = Instance(Session)
83 pub_socket = Instance('zmq.Socket')
81 pub_socket = Instance('zmq.Socket')
84 parent_header = Dict({})
82 parent_header = Dict({})
85
83
86 def set_parent(self, parent):
84 def set_parent(self, parent):
87 """Set the parent for outbound messages."""
85 """Set the parent for outbound messages."""
88 self.parent_header = extract_header(parent)
86 self.parent_header = extract_header(parent)
89
87
90 def publish(self, source, data, metadata=None):
88 def publish(self, source, data, metadata=None):
91 if metadata is None:
89 if metadata is None:
92 metadata = {}
90 metadata = {}
93 self._validate_data(source, data, metadata)
91 self._validate_data(source, data, metadata)
94 content = {}
92 content = {}
95 content['source'] = source
93 content['source'] = source
96 content['data'] = data
94 content['data'] = data
97 content['metadata'] = metadata
95 content['metadata'] = metadata
98 self.session.send(
96 self.session.send(
99 self.pub_socket, u'display_data', content,
97 self.pub_socket, u'display_data', content,
100 parent=self.parent_header
98 parent=self.parent_header
101 )
99 )
102
100
103
101
104 class ZMQInteractiveShell(InteractiveShell):
102 class ZMQInteractiveShell(InteractiveShell):
105 """A subclass of InteractiveShell for ZMQ."""
103 """A subclass of InteractiveShell for ZMQ."""
106
104
107 displayhook_class = Type(ZMQDisplayHook)
105 displayhook_class = Type(ZMQDisplayHook)
108 display_pub_class = Type(ZMQDisplayPublisher)
106 display_pub_class = Type(ZMQDisplayPublisher)
109
107
110 keepkernel_on_exit = None
108 keepkernel_on_exit = None
111
109
112 def init_environment(self):
110 def init_environment(self):
113 """Configure the user's environment.
111 """Configure the user's environment.
114
112
115 """
113 """
116 env = os.environ
114 env = os.environ
117 # These two ensure 'ls' produces nice coloring on BSD-derived systems
115 # These two ensure 'ls' produces nice coloring on BSD-derived systems
118 env['TERM'] = 'xterm-color'
116 env['TERM'] = 'xterm-color'
119 env['CLICOLOR'] = '1'
117 env['CLICOLOR'] = '1'
120 # Since normal pagers don't work at all (over pexpect we don't have
118 # Since normal pagers don't work at all (over pexpect we don't have
121 # single-key control of the subprocess), try to disable paging in
119 # single-key control of the subprocess), try to disable paging in
122 # subprocesses as much as possible.
120 # subprocesses as much as possible.
123 env['PAGER'] = 'cat'
121 env['PAGER'] = 'cat'
124 env['GIT_PAGER'] = 'cat'
122 env['GIT_PAGER'] = 'cat'
125
123
126 def auto_rewrite_input(self, cmd):
124 def auto_rewrite_input(self, cmd):
127 """Called to show the auto-rewritten input for autocall and friends.
125 """Called to show the auto-rewritten input for autocall and friends.
128
126
129 FIXME: this payload is currently not correctly processed by the
127 FIXME: this payload is currently not correctly processed by the
130 frontend.
128 frontend.
131 """
129 """
132 new = self.displayhook.prompt1.auto_rewrite() + cmd
130 new = self.displayhook.prompt1.auto_rewrite() + cmd
133 payload = dict(
131 payload = dict(
134 source='IPython.zmq.zmqshell.ZMQInteractiveShell.auto_rewrite_input',
132 source='IPython.zmq.zmqshell.ZMQInteractiveShell.auto_rewrite_input',
135 transformed_input=new,
133 transformed_input=new,
136 )
134 )
137 self.payload_manager.write_payload(payload)
135 self.payload_manager.write_payload(payload)
138
136
139 def ask_exit(self):
137 def ask_exit(self):
140 """Engage the exit actions."""
138 """Engage the exit actions."""
141 payload = dict(
139 payload = dict(
142 source='IPython.zmq.zmqshell.ZMQInteractiveShell.ask_exit',
140 source='IPython.zmq.zmqshell.ZMQInteractiveShell.ask_exit',
143 exit=True,
141 exit=True,
144 keepkernel=self.keepkernel_on_exit,
142 keepkernel=self.keepkernel_on_exit,
145 )
143 )
146 self.payload_manager.write_payload(payload)
144 self.payload_manager.write_payload(payload)
147
145
148 def _showtraceback(self, etype, evalue, stb):
146 def _showtraceback(self, etype, evalue, stb):
149
147
150 exc_content = {
148 exc_content = {
151 u'traceback' : stb,
149 u'traceback' : stb,
152 u'ename' : unicode(etype.__name__),
150 u'ename' : unicode(etype.__name__),
153 u'evalue' : unicode(evalue)
151 u'evalue' : unicode(evalue)
154 }
152 }
155
153
156 dh = self.displayhook
154 dh = self.displayhook
157 # Send exception info over pub socket for other clients than the caller
155 # Send exception info over pub socket for other clients than the caller
158 # to pick up
156 # to pick up
159 exc_msg = dh.session.send(dh.pub_socket, u'pyerr', exc_content, dh.parent_header)
157 exc_msg = dh.session.send(dh.pub_socket, u'pyerr', exc_content, dh.parent_header)
160
158
161 # FIXME - Hack: store exception info in shell object. Right now, the
159 # FIXME - Hack: store exception info in shell object. Right now, the
162 # caller is reading this info after the fact, we need to fix this logic
160 # caller is reading this info after the fact, we need to fix this logic
163 # to remove this hack. Even uglier, we need to store the error status
161 # to remove this hack. Even uglier, we need to store the error status
164 # here, because in the main loop, the logic that sets it is being
162 # here, because in the main loop, the logic that sets it is being
165 # skipped because runlines swallows the exceptions.
163 # skipped because runlines swallows the exceptions.
166 exc_content[u'status'] = u'error'
164 exc_content[u'status'] = u'error'
167 self._reply_content = exc_content
165 self._reply_content = exc_content
168 # /FIXME
166 # /FIXME
169
167
170 return exc_content
168 return exc_content
171
169
172 #------------------------------------------------------------------------
170 #------------------------------------------------------------------------
173 # Magic overrides
171 # Magic overrides
174 #------------------------------------------------------------------------
172 #------------------------------------------------------------------------
175 # Once the base class stops inheriting from magic, this code needs to be
173 # Once the base class stops inheriting from magic, this code needs to be
176 # moved into a separate machinery as well. For now, at least isolate here
174 # moved into a separate machinery as well. For now, at least isolate here
177 # the magics which this class needs to implement differently from the base
175 # the magics which this class needs to implement differently from the base
178 # class, or that are unique to it.
176 # class, or that are unique to it.
179
177
180 def magic_doctest_mode(self,parameter_s=''):
178 def magic_doctest_mode(self,parameter_s=''):
181 """Toggle doctest mode on and off.
179 """Toggle doctest mode on and off.
182
180
183 This mode is intended to make IPython behave as much as possible like a
181 This mode is intended to make IPython behave as much as possible like a
184 plain Python shell, from the perspective of how its prompts, exceptions
182 plain Python shell, from the perspective of how its prompts, exceptions
185 and output look. This makes it easy to copy and paste parts of a
183 and output look. This makes it easy to copy and paste parts of a
186 session into doctests. It does so by:
184 session into doctests. It does so by:
187
185
188 - Changing the prompts to the classic ``>>>`` ones.
186 - Changing the prompts to the classic ``>>>`` ones.
189 - Changing the exception reporting mode to 'Plain'.
187 - Changing the exception reporting mode to 'Plain'.
190 - Disabling pretty-printing of output.
188 - Disabling pretty-printing of output.
191
189
192 Note that IPython also supports the pasting of code snippets that have
190 Note that IPython also supports the pasting of code snippets that have
193 leading '>>>' and '...' prompts in them. This means that you can paste
191 leading '>>>' and '...' prompts in them. This means that you can paste
194 doctests from files or docstrings (even if they have leading
192 doctests from files or docstrings (even if they have leading
195 whitespace), and the code will execute correctly. You can then use
193 whitespace), and the code will execute correctly. You can then use
196 '%history -t' to see the translated history; this will give you the
194 '%history -t' to see the translated history; this will give you the
197 input after removal of all the leading prompts and whitespace, which
195 input after removal of all the leading prompts and whitespace, which
198 can be pasted back into an editor.
196 can be pasted back into an editor.
199
197
200 With these features, you can switch into this mode easily whenever you
198 With these features, you can switch into this mode easily whenever you
201 need to do testing and changes to doctests, without having to leave
199 need to do testing and changes to doctests, without having to leave
202 your existing IPython session.
200 your existing IPython session.
203 """
201 """
204
202
205 from IPython.utils.ipstruct import Struct
203 from IPython.utils.ipstruct import Struct
206
204
207 # Shorthands
205 # Shorthands
208 shell = self.shell
206 shell = self.shell
209 disp_formatter = self.shell.display_formatter
207 disp_formatter = self.shell.display_formatter
210 ptformatter = disp_formatter.formatters['text/plain']
208 ptformatter = disp_formatter.formatters['text/plain']
211 # dstore is a data store kept in the instance metadata bag to track any
209 # dstore is a data store kept in the instance metadata bag to track any
212 # changes we make, so we can undo them later.
210 # changes we make, so we can undo them later.
213 dstore = shell.meta.setdefault('doctest_mode', Struct())
211 dstore = shell.meta.setdefault('doctest_mode', Struct())
214 save_dstore = dstore.setdefault
212 save_dstore = dstore.setdefault
215
213
216 # save a few values we'll need to recover later
214 # save a few values we'll need to recover later
217 mode = save_dstore('mode', False)
215 mode = save_dstore('mode', False)
218 save_dstore('rc_pprint', ptformatter.pprint)
216 save_dstore('rc_pprint', ptformatter.pprint)
219 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
217 save_dstore('rc_plain_text_only',disp_formatter.plain_text_only)
220 save_dstore('xmode', shell.InteractiveTB.mode)
218 save_dstore('xmode', shell.InteractiveTB.mode)
221
219
222 if mode == False:
220 if mode == False:
223 # turn on
221 # turn on
224 ptformatter.pprint = False
222 ptformatter.pprint = False
225 disp_formatter.plain_text_only = True
223 disp_formatter.plain_text_only = True
226 shell.magic_xmode('Plain')
224 shell.magic_xmode('Plain')
227 else:
225 else:
228 # turn off
226 # turn off
229 ptformatter.pprint = dstore.rc_pprint
227 ptformatter.pprint = dstore.rc_pprint
230 disp_formatter.plain_text_only = dstore.rc_plain_text_only
228 disp_formatter.plain_text_only = dstore.rc_plain_text_only
231 shell.magic_xmode(dstore.xmode)
229 shell.magic_xmode(dstore.xmode)
232
230
233 # Store new mode and inform on console
231 # Store new mode and inform on console
234 dstore.mode = bool(1-int(mode))
232 dstore.mode = bool(1-int(mode))
235 mode_label = ['OFF','ON'][dstore.mode]
233 mode_label = ['OFF','ON'][dstore.mode]
236 print('Doctest mode is:', mode_label)
234 print('Doctest mode is:', mode_label)
237
235
238 # Send the payload back so that clients can modify their prompt display
236 # Send the payload back so that clients can modify their prompt display
239 payload = dict(
237 payload = dict(
240 source='IPython.zmq.zmqshell.ZMQInteractiveShell.magic_doctest_mode',
238 source='IPython.zmq.zmqshell.ZMQInteractiveShell.magic_doctest_mode',
241 mode=dstore.mode)
239 mode=dstore.mode)
242 self.payload_manager.write_payload(payload)
240 self.payload_manager.write_payload(payload)
243
241
244 def magic_edit(self,parameter_s='',last_call=['','']):
242 def magic_edit(self,parameter_s='',last_call=['','']):
245 """Bring up an editor and execute the resulting code.
243 """Bring up an editor and execute the resulting code.
246
244
247 Usage:
245 Usage:
248 %edit [options] [args]
246 %edit [options] [args]
249
247
250 %edit runs IPython's editor hook. The default version of this hook is
248 %edit runs IPython's editor hook. The default version of this hook is
251 set to call the __IPYTHON__.rc.editor command. This is read from your
249 set to call the __IPYTHON__.rc.editor command. This is read from your
252 environment variable $EDITOR. If this isn't found, it will default to
250 environment variable $EDITOR. If this isn't found, it will default to
253 vi under Linux/Unix and to notepad under Windows. See the end of this
251 vi under Linux/Unix and to notepad under Windows. See the end of this
254 docstring for how to change the editor hook.
252 docstring for how to change the editor hook.
255
253
256 You can also set the value of this editor via the command line option
254 You can also set the value of this editor via the command line option
257 '-editor' or in your ipythonrc file. This is useful if you wish to use
255 '-editor' or in your ipythonrc file. This is useful if you wish to use
258 specifically for IPython an editor different from your typical default
256 specifically for IPython an editor different from your typical default
259 (and for Windows users who typically don't set environment variables).
257 (and for Windows users who typically don't set environment variables).
260
258
261 This command allows you to conveniently edit multi-line code right in
259 This command allows you to conveniently edit multi-line code right in
262 your IPython session.
260 your IPython session.
263
261
264 If called without arguments, %edit opens up an empty editor with a
262 If called without arguments, %edit opens up an empty editor with a
265 temporary file and will execute the contents of this file when you
263 temporary file and will execute the contents of this file when you
266 close it (don't forget to save it!).
264 close it (don't forget to save it!).
267
265
268
266
269 Options:
267 Options:
270
268
271 -n <number>: open the editor at a specified line number. By default,
269 -n <number>: open the editor at a specified line number. By default,
272 the IPython editor hook uses the unix syntax 'editor +N filename', but
270 the IPython editor hook uses the unix syntax 'editor +N filename', but
273 you can configure this by providing your own modified hook if your
271 you can configure this by providing your own modified hook if your
274 favorite editor supports line-number specifications with a different
272 favorite editor supports line-number specifications with a different
275 syntax.
273 syntax.
276
274
277 -p: this will call the editor with the same data as the previous time
275 -p: this will call the editor with the same data as the previous time
278 it was used, regardless of how long ago (in your current session) it
276 it was used, regardless of how long ago (in your current session) it
279 was.
277 was.
280
278
281 -r: use 'raw' input. This option only applies to input taken from the
279 -r: use 'raw' input. This option only applies to input taken from the
282 user's history. By default, the 'processed' history is used, so that
280 user's history. By default, the 'processed' history is used, so that
283 magics are loaded in their transformed version to valid Python. If
281 magics are loaded in their transformed version to valid Python. If
284 this option is given, the raw input as typed as the command line is
282 this option is given, the raw input as typed as the command line is
285 used instead. When you exit the editor, it will be executed by
283 used instead. When you exit the editor, it will be executed by
286 IPython's own processor.
284 IPython's own processor.
287
285
288 -x: do not execute the edited code immediately upon exit. This is
286 -x: do not execute the edited code immediately upon exit. This is
289 mainly useful if you are editing programs which need to be called with
287 mainly useful if you are editing programs which need to be called with
290 command line arguments, which you can then do using %run.
288 command line arguments, which you can then do using %run.
291
289
292
290
293 Arguments:
291 Arguments:
294
292
295 If arguments are given, the following possibilites exist:
293 If arguments are given, the following possibilites exist:
296
294
297 - The arguments are numbers or pairs of colon-separated numbers (like
295 - The arguments are numbers or pairs of colon-separated numbers (like
298 1 4:8 9). These are interpreted as lines of previous input to be
296 1 4:8 9). These are interpreted as lines of previous input to be
299 loaded into the editor. The syntax is the same of the %macro command.
297 loaded into the editor. The syntax is the same of the %macro command.
300
298
301 - If the argument doesn't start with a number, it is evaluated as a
299 - If the argument doesn't start with a number, it is evaluated as a
302 variable and its contents loaded into the editor. You can thus edit
300 variable and its contents loaded into the editor. You can thus edit
303 any string which contains python code (including the result of
301 any string which contains python code (including the result of
304 previous edits).
302 previous edits).
305
303
306 - If the argument is the name of an object (other than a string),
304 - If the argument is the name of an object (other than a string),
307 IPython will try to locate the file where it was defined and open the
305 IPython will try to locate the file where it was defined and open the
308 editor at the point where it is defined. You can use `%edit function`
306 editor at the point where it is defined. You can use `%edit function`
309 to load an editor exactly at the point where 'function' is defined,
307 to load an editor exactly at the point where 'function' is defined,
310 edit it and have the file be executed automatically.
308 edit it and have the file be executed automatically.
311
309
312 If the object is a macro (see %macro for details), this opens up your
310 If the object is a macro (see %macro for details), this opens up your
313 specified editor with a temporary file containing the macro's data.
311 specified editor with a temporary file containing the macro's data.
314 Upon exit, the macro is reloaded with the contents of the file.
312 Upon exit, the macro is reloaded with the contents of the file.
315
313
316 Note: opening at an exact line is only supported under Unix, and some
314 Note: opening at an exact line is only supported under Unix, and some
317 editors (like kedit and gedit up to Gnome 2.8) do not understand the
315 editors (like kedit and gedit up to Gnome 2.8) do not understand the
318 '+NUMBER' parameter necessary for this feature. Good editors like
316 '+NUMBER' parameter necessary for this feature. Good editors like
319 (X)Emacs, vi, jed, pico and joe all do.
317 (X)Emacs, vi, jed, pico and joe all do.
320
318
321 - If the argument is not found as a variable, IPython will look for a
319 - If the argument is not found as a variable, IPython will look for a
322 file with that name (adding .py if necessary) and load it into the
320 file with that name (adding .py if necessary) and load it into the
323 editor. It will execute its contents with execfile() when you exit,
321 editor. It will execute its contents with execfile() when you exit,
324 loading any code in the file into your interactive namespace.
322 loading any code in the file into your interactive namespace.
325
323
326 After executing your code, %edit will return as output the code you
324 After executing your code, %edit will return as output the code you
327 typed in the editor (except when it was an existing file). This way
325 typed in the editor (except when it was an existing file). This way
328 you can reload the code in further invocations of %edit as a variable,
326 you can reload the code in further invocations of %edit as a variable,
329 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
327 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
330 the output.
328 the output.
331
329
332 Note that %edit is also available through the alias %ed.
330 Note that %edit is also available through the alias %ed.
333
331
334 This is an example of creating a simple function inside the editor and
332 This is an example of creating a simple function inside the editor and
335 then modifying it. First, start up the editor:
333 then modifying it. First, start up the editor:
336
334
337 In [1]: ed
335 In [1]: ed
338 Editing... done. Executing edited code...
336 Editing... done. Executing edited code...
339 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
337 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
340
338
341 We can then call the function foo():
339 We can then call the function foo():
342
340
343 In [2]: foo()
341 In [2]: foo()
344 foo() was defined in an editing session
342 foo() was defined in an editing session
345
343
346 Now we edit foo. IPython automatically loads the editor with the
344 Now we edit foo. IPython automatically loads the editor with the
347 (temporary) file where foo() was previously defined:
345 (temporary) file where foo() was previously defined:
348
346
349 In [3]: ed foo
347 In [3]: ed foo
350 Editing... done. Executing edited code...
348 Editing... done. Executing edited code...
351
349
352 And if we call foo() again we get the modified version:
350 And if we call foo() again we get the modified version:
353
351
354 In [4]: foo()
352 In [4]: foo()
355 foo() has now been changed!
353 foo() has now been changed!
356
354
357 Here is an example of how to edit a code snippet successive
355 Here is an example of how to edit a code snippet successive
358 times. First we call the editor:
356 times. First we call the editor:
359
357
360 In [5]: ed
358 In [5]: ed
361 Editing... done. Executing edited code...
359 Editing... done. Executing edited code...
362 hello
360 hello
363 Out[5]: "print 'hello'n"
361 Out[5]: "print 'hello'n"
364
362
365 Now we call it again with the previous output (stored in _):
363 Now we call it again with the previous output (stored in _):
366
364
367 In [6]: ed _
365 In [6]: ed _
368 Editing... done. Executing edited code...
366 Editing... done. Executing edited code...
369 hello world
367 hello world
370 Out[6]: "print 'hello world'n"
368 Out[6]: "print 'hello world'n"
371
369
372 Now we call it with the output #8 (stored in _8, also as Out[8]):
370 Now we call it with the output #8 (stored in _8, also as Out[8]):
373
371
374 In [7]: ed _8
372 In [7]: ed _8
375 Editing... done. Executing edited code...
373 Editing... done. Executing edited code...
376 hello again
374 hello again
377 Out[7]: "print 'hello again'n"
375 Out[7]: "print 'hello again'n"
378
376
379
377
380 Changing the default editor hook:
378 Changing the default editor hook:
381
379
382 If you wish to write your own editor hook, you can put it in a
380 If you wish to write your own editor hook, you can put it in a
383 configuration file which you load at startup time. The default hook
381 configuration file which you load at startup time. The default hook
384 is defined in the IPython.core.hooks module, and you can use that as a
382 is defined in the IPython.core.hooks module, and you can use that as a
385 starting example for further modifications. That file also has
383 starting example for further modifications. That file also has
386 general instructions on how to set a new hook for use once you've
384 general instructions on how to set a new hook for use once you've
387 defined it."""
385 defined it."""
388
386
389 # FIXME: This function has become a convoluted mess. It needs a
387 # FIXME: This function has become a convoluted mess. It needs a
390 # ground-up rewrite with clean, simple logic.
388 # ground-up rewrite with clean, simple logic.
391
389
392 def make_filename(arg):
390 def make_filename(arg):
393 "Make a filename from the given args"
391 "Make a filename from the given args"
394 try:
392 try:
395 filename = get_py_filename(arg)
393 filename = get_py_filename(arg)
396 except IOError:
394 except IOError:
397 if args.endswith('.py'):
395 if args.endswith('.py'):
398 filename = arg
396 filename = arg
399 else:
397 else:
400 filename = None
398 filename = None
401 return filename
399 return filename
402
400
403 # custom exceptions
401 # custom exceptions
404 class DataIsObject(Exception): pass
402 class DataIsObject(Exception): pass
405
403
406 opts,args = self.parse_options(parameter_s,'prn:')
404 opts,args = self.parse_options(parameter_s,'prn:')
407 # Set a few locals from the options for convenience:
405 # Set a few locals from the options for convenience:
408 opts_p = opts.has_key('p')
406 opts_p = opts.has_key('p')
409 opts_r = opts.has_key('r')
407 opts_r = opts.has_key('r')
410
408
411 # Default line number value
409 # Default line number value
412 lineno = opts.get('n',None)
410 lineno = opts.get('n',None)
413 if lineno is not None:
411 if lineno is not None:
414 try:
412 try:
415 lineno = int(lineno)
413 lineno = int(lineno)
416 except:
414 except:
417 warn("The -n argument must be an integer.")
415 warn("The -n argument must be an integer.")
418 return
416 return
419
417
420 if opts_p:
418 if opts_p:
421 args = '_%s' % last_call[0]
419 args = '_%s' % last_call[0]
422 if not self.shell.user_ns.has_key(args):
420 if not self.shell.user_ns.has_key(args):
423 args = last_call[1]
421 args = last_call[1]
424
422
425 # use last_call to remember the state of the previous call, but don't
423 # use last_call to remember the state of the previous call, but don't
426 # let it be clobbered by successive '-p' calls.
424 # let it be clobbered by successive '-p' calls.
427 try:
425 try:
428 last_call[0] = self.shell.displayhook.prompt_count
426 last_call[0] = self.shell.displayhook.prompt_count
429 if not opts_p:
427 if not opts_p:
430 last_call[1] = parameter_s
428 last_call[1] = parameter_s
431 except:
429 except:
432 pass
430 pass
433
431
434 # by default this is done with temp files, except when the given
432 # by default this is done with temp files, except when the given
435 # arg is a filename
433 # arg is a filename
436 use_temp = 1
434 use_temp = True
437
435
438 if re.match(r'\d',args):
436 data = ''
437 if args[0].isdigit():
439 # Mode where user specifies ranges of lines, like in %macro.
438 # Mode where user specifies ranges of lines, like in %macro.
440 # This means that you can't edit files whose names begin with
439 # This means that you can't edit files whose names begin with
441 # numbers this way. Tough.
440 # numbers this way. Tough.
442 ranges = args.split()
441 ranges = args.split()
443 data = ''.join(self.extract_input_slices(ranges,opts_r))
442 data = ''.join(self.extract_input_slices(ranges,opts_r))
444 elif args.endswith('.py'):
443 elif args.endswith('.py'):
445 filename = make_filename(args)
444 filename = make_filename(args)
446 data = ''
445 use_temp = False
447 use_temp = 0
448 elif args:
446 elif args:
449 try:
447 try:
450 # Load the parameter given as a variable. If not a string,
448 # Load the parameter given as a variable. If not a string,
451 # process it as an object instead (below)
449 # process it as an object instead (below)
452
450
453 #print '*** args',args,'type',type(args) # dbg
451 #print '*** args',args,'type',type(args) # dbg
454 data = eval(args,self.shell.user_ns)
452 data = eval(args, self.shell.user_ns)
455 if not type(data) in StringTypes:
453 if not isinstance(data, basestring):
456 raise DataIsObject
454 raise DataIsObject
457
455
458 except (NameError,SyntaxError):
456 except (NameError,SyntaxError):
459 # given argument is not a variable, try as a filename
457 # given argument is not a variable, try as a filename
460 filename = make_filename(args)
458 filename = make_filename(args)
461 if filename is None:
459 if filename is None:
462 warn("Argument given (%s) can't be found as a variable "
460 warn("Argument given (%s) can't be found as a variable "
463 "or as a filename." % args)
461 "or as a filename." % args)
464 return
462 return
465
463 use_temp = False
466 data = ''
464
467 use_temp = 0
468 except DataIsObject:
465 except DataIsObject:
469
470 # macros have a special edit function
466 # macros have a special edit function
471 if isinstance(data,Macro):
467 if isinstance(data, Macro):
472 self._edit_macro(args,data)
468 self._edit_macro(args,data)
473 return
469 return
474
470
475 # For objects, try to edit the file where they are defined
471 # For objects, try to edit the file where they are defined
476 try:
472 try:
477 filename = inspect.getabsfile(data)
473 filename = inspect.getabsfile(data)
478 if 'fakemodule' in filename.lower() and inspect.isclass(data):
474 if 'fakemodule' in filename.lower() and inspect.isclass(data):
479 # class created by %edit? Try to find source
475 # class created by %edit? Try to find source
480 # by looking for method definitions instead, the
476 # by looking for method definitions instead, the
481 # __module__ in those classes is FakeModule.
477 # __module__ in those classes is FakeModule.
482 attrs = [getattr(data, aname) for aname in dir(data)]
478 attrs = [getattr(data, aname) for aname in dir(data)]
483 for attr in attrs:
479 for attr in attrs:
484 if not inspect.ismethod(attr):
480 if not inspect.ismethod(attr):
485 continue
481 continue
486 filename = inspect.getabsfile(attr)
482 filename = inspect.getabsfile(attr)
487 if filename and 'fakemodule' not in filename.lower():
483 if filename and 'fakemodule' not in filename.lower():
488 # change the attribute to be the edit target instead
484 # change the attribute to be the edit target instead
489 data = attr
485 data = attr
490 break
486 break
491
487
492 datafile = 1
488 datafile = 1
493 except TypeError:
489 except TypeError:
494 filename = make_filename(args)
490 filename = make_filename(args)
495 datafile = 1
491 datafile = 1
496 warn('Could not find file where `%s` is defined.\n'
492 warn('Could not find file where `%s` is defined.\n'
497 'Opening a file named `%s`' % (args,filename))
493 'Opening a file named `%s`' % (args,filename))
498 # Now, make sure we can actually read the source (if it was in
494 # Now, make sure we can actually read the source (if it was in
499 # a temp file it's gone by now).
495 # a temp file it's gone by now).
500 if datafile:
496 if datafile:
501 try:
497 try:
502 if lineno is None:
498 if lineno is None:
503 lineno = inspect.getsourcelines(data)[1]
499 lineno = inspect.getsourcelines(data)[1]
504 except IOError:
500 except IOError:
505 filename = make_filename(args)
501 filename = make_filename(args)
506 if filename is None:
502 if filename is None:
507 warn('The file `%s` where `%s` was defined cannot '
503 warn('The file `%s` where `%s` was defined cannot '
508 'be read.' % (filename,data))
504 'be read.' % (filename,data))
509 return
505 return
510 use_temp = 0
506 use_temp = False
511 else:
512 data = ''
513
507
514 if use_temp:
508 if use_temp:
515 filename = self.shell.mktempfile(data)
509 filename = self.shell.mktempfile(data)
516 print('IPython will make a temporary file named:', filename)
510 print('IPython will make a temporary file named:', filename)
517
511
518 # Make sure we send to the client an absolute path, in case the working
512 # Make sure we send to the client an absolute path, in case the working
519 # directory of client and kernel don't match
513 # directory of client and kernel don't match
520 filename = os.path.abspath(filename)
514 filename = os.path.abspath(filename)
521
515
522 payload = {
516 payload = {
523 'source' : 'IPython.zmq.zmqshell.ZMQInteractiveShell.edit_magic',
517 'source' : 'IPython.zmq.zmqshell.ZMQInteractiveShell.edit_magic',
524 'filename' : filename,
518 'filename' : filename,
525 'line_number' : lineno
519 'line_number' : lineno
526 }
520 }
527 self.payload_manager.write_payload(payload)
521 self.payload_manager.write_payload(payload)
528
522
529 def magic_gui(self, *args, **kwargs):
523 def magic_gui(self, *args, **kwargs):
530 raise NotImplementedError(
524 raise NotImplementedError(
531 'GUI support must be enabled in command line options.')
525 'GUI support must be enabled in command line options.')
532
526
533 def magic_pylab(self, *args, **kwargs):
527 def magic_pylab(self, *args, **kwargs):
534 raise NotImplementedError(
528 raise NotImplementedError(
535 'pylab support must be enabled in command line options.')
529 'pylab support must be enabled in command line options.')
536
530
537 # A few magics that are adapted to the specifics of using pexpect and a
531 # A few magics that are adapted to the specifics of using pexpect and a
538 # remote terminal
532 # remote terminal
539
533
540 def magic_clear(self, arg_s):
534 def magic_clear(self, arg_s):
541 """Clear the terminal."""
535 """Clear the terminal."""
542 if os.name == 'posix':
536 if os.name == 'posix':
543 self.shell.system("clear")
537 self.shell.system("clear")
544 else:
538 else:
545 self.shell.system("cls")
539 self.shell.system("cls")
546
540
547 if os.name == 'nt':
541 if os.name == 'nt':
548 # This is the usual name in windows
542 # This is the usual name in windows
549 magic_cls = magic_clear
543 magic_cls = magic_clear
550
544
551 # Terminal pagers won't work over pexpect, but we do have our own pager
545 # Terminal pagers won't work over pexpect, but we do have our own pager
552
546
553 def magic_less(self, arg_s):
547 def magic_less(self, arg_s):
554 """Show a file through the pager.
548 """Show a file through the pager.
555
549
556 Files ending in .py are syntax-highlighted."""
550 Files ending in .py are syntax-highlighted."""
557 cont = open(arg_s).read()
551 cont = open(arg_s).read()
558 if arg_s.endswith('.py'):
552 if arg_s.endswith('.py'):
559 cont = self.shell.pycolorize(cont)
553 cont = self.shell.pycolorize(cont)
560 page.page(cont)
554 page.page(cont)
561
555
562 magic_more = magic_less
556 magic_more = magic_less
563
557
564 # Man calls a pager, so we also need to redefine it
558 # Man calls a pager, so we also need to redefine it
565 if os.name == 'posix':
559 if os.name == 'posix':
566 def magic_man(self, arg_s):
560 def magic_man(self, arg_s):
567 """Find the man page for the given command and display in pager."""
561 """Find the man page for the given command and display in pager."""
568 page.page(self.shell.getoutput('man %s | col -b' % arg_s,
562 page.page(self.shell.getoutput('man %s | col -b' % arg_s,
569 split=False))
563 split=False))
570
564
571 # FIXME: this is specific to the GUI, so we should let the gui app load
565 # FIXME: this is specific to the GUI, so we should let the gui app load
572 # magics at startup that are only for the gui. Once the gui app has proper
566 # magics at startup that are only for the gui. Once the gui app has proper
573 # profile and configuration management, we can have it initialize a kernel
567 # profile and configuration management, we can have it initialize a kernel
574 # with a special config file that provides these.
568 # with a special config file that provides these.
575 def magic_guiref(self, arg_s):
569 def magic_guiref(self, arg_s):
576 """Show a basic reference about the GUI console."""
570 """Show a basic reference about the GUI console."""
577 from IPython.core.usage import gui_reference
571 from IPython.core.usage import gui_reference
578 page.page(gui_reference, auto_html=True)
572 page.page(gui_reference, auto_html=True)
579
573
580 def magic_loadpy(self, arg_s):
574 def magic_loadpy(self, arg_s):
581 """Load a .py python script into the GUI console.
575 """Load a .py python script into the GUI console.
582
576
583 This magic command can either take a local filename or a url::
577 This magic command can either take a local filename or a url::
584
578
585 %loadpy myscript.py
579 %loadpy myscript.py
586 %loadpy http://www.example.com/myscript.py
580 %loadpy http://www.example.com/myscript.py
587 """
581 """
588 if not arg_s.endswith('.py'):
582 if not arg_s.endswith('.py'):
589 raise ValueError('%%load only works with .py files: %s' % arg_s)
583 raise ValueError('%%load only works with .py files: %s' % arg_s)
590 if arg_s.startswith('http'):
584 if arg_s.startswith('http'):
591 import urllib2
585 import urllib2
592 response = urllib2.urlopen(arg_s)
586 response = urllib2.urlopen(arg_s)
593 content = response.read()
587 content = response.read()
594 else:
588 else:
595 content = open(arg_s).read()
589 content = open(arg_s).read()
596 payload = dict(
590 payload = dict(
597 source='IPython.zmq.zmqshell.ZMQInteractiveShell.magic_loadpy',
591 source='IPython.zmq.zmqshell.ZMQInteractiveShell.magic_loadpy',
598 text=content
592 text=content
599 )
593 )
600 self.payload_manager.write_payload(payload)
594 self.payload_manager.write_payload(payload)
601
595
602 def magic_Exit(self, parameter_s=''):
596 def magic_Exit(self, parameter_s=''):
603 """Exit IPython. If the -k option is provided, the kernel will be left
597 """Exit IPython. If the -k option is provided, the kernel will be left
604 running. Otherwise, it will shutdown without prompting.
598 running. Otherwise, it will shutdown without prompting.
605 """
599 """
606 opts,args = self.parse_options(parameter_s,'k')
600 opts,args = self.parse_options(parameter_s,'k')
607 self.shell.keepkernel_on_exit = opts.has_key('k')
601 self.shell.keepkernel_on_exit = opts.has_key('k')
608 self.shell.ask_exit()
602 self.shell.ask_exit()
609
603
610 # Add aliases as magics so all common forms work: exit, quit, Exit, Quit.
604 # Add aliases as magics so all common forms work: exit, quit, Exit, Quit.
611 magic_exit = magic_quit = magic_Quit = magic_Exit
605 magic_exit = magic_quit = magic_Quit = magic_Exit
612
606
613 InteractiveShellABC.register(ZMQInteractiveShell)
607 InteractiveShellABC.register(ZMQInteractiveShell)
General Comments 0
You need to be logged in to leave comments. Login now