##// END OF EJS Templates
Merge with trunk
Gael Varoquaux -
r1823:8e1e827f merge
parent child Browse files
Show More

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

This diff has been collapsed as it changes many lines, (1867 lines changed) Show them Hide them
@@ -0,0 +1,1867 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright � 2006 Steven J. Bethard <steven.bethard@gmail.com>.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted under the terms of the 3-clause BSD
7 # license. No warranty expressed or implied.
8 # For details, see the accompanying file LICENSE.txt.
9
10 """Command-line parsing library
11
12 This module is an optparse-inspired command-line parsing library that:
13
14 * handles both optional and positional arguments
15 * produces highly informative usage messages
16 * supports parsers that dispatch to sub-parsers
17
18 The following is a simple usage example that sums integers from the
19 command-line and writes the result to a file:
20
21 parser = argparse.ArgumentParser(
22 description='sum the integers at the command line')
23 parser.add_argument(
24 'integers', metavar='int', nargs='+', type=int,
25 help='an integer to be summed')
26 parser.add_argument(
27 '--log', default=sys.stdout, type=argparse.FileType('w'),
28 help='the file where the sum should be written')
29 args = parser.parse_args()
30 args.log.write('%s' % sum(args.integers))
31 args.log.close()
32
33 The module contains the following public classes:
34
35 ArgumentParser -- The main entry point for command-line parsing. As the
36 example above shows, the add_argument() method is used to populate
37 the parser with actions for optional and positional arguments. Then
38 the parse_args() method is invoked to convert the args at the
39 command-line into an object with attributes.
40
41 ArgumentError -- The exception raised by ArgumentParser objects when
42 there are errors with the parser's actions. Errors raised while
43 parsing the command-line are caught by ArgumentParser and emitted
44 as command-line messages.
45
46 FileType -- A factory for defining types of files to be created. As the
47 example above shows, instances of FileType are typically passed as
48 the type= argument of add_argument() calls.
49
50 Action -- The base class for parser actions. Typically actions are
51 selected by passing strings like 'store_true' or 'append_const' to
52 the action= argument of add_argument(). However, for greater
53 customization of ArgumentParser actions, subclasses of Action may
54 be defined and passed as the action= argument.
55
56 HelpFormatter, RawDescriptionHelpFormatter -- Formatter classes which
57 may be passed as the formatter_class= argument to the
58 ArgumentParser constructor. HelpFormatter is the default, while
59 RawDescriptionHelpFormatter tells the parser not to perform any
60 line-wrapping on description text.
61
62 All other classes in this module are considered implementation details.
63 (Also note that HelpFormatter and RawDescriptionHelpFormatter are only
64 considered public as object names -- the API of the formatter objects is
65 still considered an implementation detail.)
66 """
67
68 __version__ = '0.8.0'
69
70 import os as _os
71 import re as _re
72 import sys as _sys
73 import textwrap as _textwrap
74
75 from gettext import gettext as _
76
77 SUPPRESS = '==SUPPRESS=='
78
79 OPTIONAL = '?'
80 ZERO_OR_MORE = '*'
81 ONE_OR_MORE = '+'
82 PARSER = '==PARSER=='
83
84 # =============================
85 # Utility functions and classes
86 # =============================
87
88 class _AttributeHolder(object):
89 """Abstract base class that provides __repr__.
90
91 The __repr__ method returns a string in the format:
92 ClassName(attr=name, attr=name, ...)
93 The attributes are determined either by a class-level attribute,
94 '_kwarg_names', or by inspecting the instance __dict__.
95 """
96
97 def __repr__(self):
98 type_name = type(self).__name__
99 arg_strings = []
100 for arg in self._get_args():
101 arg_strings.append(repr(arg))
102 for name, value in self._get_kwargs():
103 arg_strings.append('%s=%r' % (name, value))
104 return '%s(%s)' % (type_name, ', '.join(arg_strings))
105
106 def _get_kwargs(self):
107 return sorted(self.__dict__.items())
108
109 def _get_args(self):
110 return []
111
112 def _ensure_value(namespace, name, value):
113 if getattr(namespace, name, None) is None:
114 setattr(namespace, name, value)
115 return getattr(namespace, name)
116
117
118
119 # ===============
120 # Formatting Help
121 # ===============
122
123 class HelpFormatter(object):
124
125 def __init__(self,
126 prog,
127 indent_increment=2,
128 max_help_position=24,
129 width=None):
130
131 # default setting for width
132 if width is None:
133 try:
134 width = int(_os.environ['COLUMNS'])
135 except (KeyError, ValueError):
136 width = 80
137 width -= 2
138
139 self._prog = prog
140 self._indent_increment = indent_increment
141 self._max_help_position = max_help_position
142 self._width = width
143
144 self._current_indent = 0
145 self._level = 0
146 self._action_max_length = 0
147
148 self._root_section = self._Section(self, None)
149 self._current_section = self._root_section
150
151 self._whitespace_matcher = _re.compile(r'\s+')
152 self._long_break_matcher = _re.compile(r'\n\n\n+')
153
154 # ===============================
155 # Section and indentation methods
156 # ===============================
157
158 def _indent(self):
159 self._current_indent += self._indent_increment
160 self._level += 1
161
162 def _dedent(self):
163 self._current_indent -= self._indent_increment
164 assert self._current_indent >= 0, 'Indent decreased below 0.'
165 self._level -= 1
166
167 class _Section(object):
168 def __init__(self, formatter, parent, heading=None):
169 self.formatter = formatter
170 self.parent = parent
171 self.heading = heading
172 self.items = []
173
174 def format_help(self):
175 # format the indented section
176 if self.parent is not None:
177 self.formatter._indent()
178 join = self.formatter._join_parts
179 for func, args in self.items:
180 func(*args)
181 item_help = join(func(*args) for func, args in self.items)
182 if self.parent is not None:
183 self.formatter._dedent()
184
185 # return nothing if the section was empty
186 if not item_help:
187 return ''
188
189 # add the heading if the section was non-empty
190 if self.heading is not SUPPRESS and self.heading is not None:
191 current_indent = self.formatter._current_indent
192 heading = '%*s%s:\n' % (current_indent, '', self.heading)
193 else:
194 heading = ''
195
196 # join the section-initial newline, the heading and the help
197 return join(['\n', heading, item_help, '\n'])
198
199 def _add_item(self, func, args):
200 self._current_section.items.append((func, args))
201
202 # ========================
203 # Message building methods
204 # ========================
205
206 def start_section(self, heading):
207 self._indent()
208 section = self._Section(self, self._current_section, heading)
209 self._add_item(section.format_help, [])
210 self._current_section = section
211
212 def end_section(self):
213 self._current_section = self._current_section.parent
214 self._dedent()
215
216 def add_text(self, text):
217 if text is not SUPPRESS and text is not None:
218 self._add_item(self._format_text, [text])
219
220 def add_usage(self, usage, optionals, positionals, prefix=None):
221 if usage is not SUPPRESS:
222 args = usage, optionals, positionals, prefix
223 self._add_item(self._format_usage, args)
224
225 def add_argument(self, action):
226 if action.help is not SUPPRESS:
227
228 # find all invocations
229 get_invocation = self._format_action_invocation
230 invocations = [get_invocation(action)]
231 for subaction in self._iter_indented_subactions(action):
232 invocations.append(get_invocation(subaction))
233
234 # update the maximum item length
235 invocation_length = max(len(s) for s in invocations)
236 action_length = invocation_length + self._current_indent
237 self._action_max_length = max(self._action_max_length,
238 action_length)
239
240 # add the item to the list
241 self._add_item(self._format_action, [action])
242
243 def add_arguments(self, actions):
244 for action in actions:
245 self.add_argument(action)
246
247 # =======================
248 # Help-formatting methods
249 # =======================
250
251 def format_help(self):
252 help = self._root_section.format_help() % dict(prog=self._prog)
253 if help:
254 help = self._long_break_matcher.sub('\n\n', help)
255 help = help.strip('\n') + '\n'
256 return help
257
258 def _join_parts(self, part_strings):
259 return ''.join(part
260 for part in part_strings
261 if part and part is not SUPPRESS)
262
263 def _format_usage(self, usage, optionals, positionals, prefix):
264 if prefix is None:
265 prefix = _('usage: ')
266
267 # if no optionals or positionals are available, usage is just prog
268 if usage is None and not optionals and not positionals:
269 usage = '%(prog)s'
270
271 # if optionals and positionals are available, calculate usage
272 elif usage is None:
273 usage = '%(prog)s' % dict(prog=self._prog)
274
275 # determine width of "usage: PROG" and width of text
276 prefix_width = len(prefix) + len(usage) + 1
277 prefix_indent = self._current_indent + prefix_width
278 text_width = self._width - self._current_indent
279
280 # put them on one line if they're short enough
281 format = self._format_actions_usage
282 action_usage = format(optionals + positionals)
283 if prefix_width + len(action_usage) + 1 < text_width:
284 usage = '%s %s' % (usage, action_usage)
285
286 # if they're long, wrap optionals and positionals individually
287 else:
288 optional_usage = format(optionals)
289 positional_usage = format(positionals)
290 indent = ' ' * prefix_indent
291
292 # usage is made of PROG, optionals and positionals
293 parts = [usage, ' ']
294
295 # options always get added right after PROG
296 if optional_usage:
297 parts.append(_textwrap.fill(
298 optional_usage, text_width,
299 initial_indent=indent,
300 subsequent_indent=indent).lstrip())
301
302 # if there were options, put arguments on the next line
303 # otherwise, start them right after PROG
304 if positional_usage:
305 part = _textwrap.fill(
306 positional_usage, text_width,
307 initial_indent=indent,
308 subsequent_indent=indent).lstrip()
309 if optional_usage:
310 part = '\n' + indent + part
311 parts.append(part)
312 usage = ''.join(parts)
313
314 # prefix with 'usage:'
315 return '%s%s\n\n' % (prefix, usage)
316
317 def _format_actions_usage(self, actions):
318 parts = []
319 for action in actions:
320 if action.help is SUPPRESS:
321 continue
322
323 # produce all arg strings
324 if not action.option_strings:
325 parts.append(self._format_args(action, action.dest))
326
327 # produce the first way to invoke the option in brackets
328 else:
329 option_string = action.option_strings[0]
330
331 # if the Optional doesn't take a value, format is:
332 # -s or --long
333 if action.nargs == 0:
334 part = '%s' % option_string
335
336 # if the Optional takes a value, format is:
337 # -s ARGS or --long ARGS
338 else:
339 default = action.dest.upper()
340 args_string = self._format_args(action, default)
341 part = '%s %s' % (option_string, args_string)
342
343 # make it look optional if it's not required
344 if not action.required:
345 part = '[%s]' % part
346 parts.append(part)
347
348 return ' '.join(parts)
349
350 def _format_text(self, text):
351 text_width = self._width - self._current_indent
352 indent = ' ' * self._current_indent
353 return self._fill_text(text, text_width, indent) + '\n\n'
354
355 def _format_action(self, action):
356 # determine the required width and the entry label
357 help_position = min(self._action_max_length + 2,
358 self._max_help_position)
359 help_width = self._width - help_position
360 action_width = help_position - self._current_indent - 2
361 action_header = self._format_action_invocation(action)
362
363 # ho nelp; start on same line and add a final newline
364 if not action.help:
365 tup = self._current_indent, '', action_header
366 action_header = '%*s%s\n' % tup
367
368 # short action name; start on the same line and pad two spaces
369 elif len(action_header) <= action_width:
370 tup = self._current_indent, '', action_width, action_header
371 action_header = '%*s%-*s ' % tup
372 indent_first = 0
373
374 # long action name; start on the next line
375 else:
376 tup = self._current_indent, '', action_header
377 action_header = '%*s%s\n' % tup
378 indent_first = help_position
379
380 # collect the pieces of the action help
381 parts = [action_header]
382
383 # if there was help for the action, add lines of help text
384 if action.help:
385 help_text = self._expand_help(action)
386 help_lines = self._split_lines(help_text, help_width)
387 parts.append('%*s%s\n' % (indent_first, '', help_lines[0]))
388 for line in help_lines[1:]:
389 parts.append('%*s%s\n' % (help_position, '', line))
390
391 # or add a newline if the description doesn't end with one
392 elif not action_header.endswith('\n'):
393 parts.append('\n')
394
395 # if there are any sub-actions, add their help as well
396 for subaction in self._iter_indented_subactions(action):
397 parts.append(self._format_action(subaction))
398
399 # return a single string
400 return self._join_parts(parts)
401
402 def _format_action_invocation(self, action):
403 if not action.option_strings:
404 return self._format_metavar(action, action.dest)
405
406 else:
407 parts = []
408
409 # if the Optional doesn't take a value, format is:
410 # -s, --long
411 if action.nargs == 0:
412 parts.extend(action.option_strings)
413
414 # if the Optional takes a value, format is:
415 # -s ARGS, --long ARGS
416 else:
417 default = action.dest.upper()
418 args_string = self._format_args(action, default)
419 for option_string in action.option_strings:
420 parts.append('%s %s' % (option_string, args_string))
421
422 return ', '.join(parts)
423
424 def _format_metavar(self, action, default_metavar):
425 if action.metavar is not None:
426 name = action.metavar
427 elif action.choices is not None:
428 choice_strs = (str(choice) for choice in action.choices)
429 name = '{%s}' % ','.join(choice_strs)
430 else:
431 name = default_metavar
432 return name
433
434 def _format_args(self, action, default_metavar):
435 name = self._format_metavar(action, default_metavar)
436 if action.nargs is None:
437 result = name
438 elif action.nargs == OPTIONAL:
439 result = '[%s]' % name
440 elif action.nargs == ZERO_OR_MORE:
441 result = '[%s [%s ...]]' % (name, name)
442 elif action.nargs == ONE_OR_MORE:
443 result = '%s [%s ...]' % (name, name)
444 elif action.nargs is PARSER:
445 result = '%s ...' % name
446 else:
447 result = ' '.join([name] * action.nargs)
448 return result
449
450 def _expand_help(self, action):
451 params = dict(vars(action), prog=self._prog)
452 for name, value in params.items():
453 if value is SUPPRESS:
454 del params[name]
455 if params.get('choices') is not None:
456 choices_str = ', '.join(str(c) for c in params['choices'])
457 params['choices'] = choices_str
458 return action.help % params
459
460 def _iter_indented_subactions(self, action):
461 try:
462 get_subactions = action._get_subactions
463 except AttributeError:
464 pass
465 else:
466 self._indent()
467 for subaction in get_subactions():
468 yield subaction
469 self._dedent()
470
471 def _split_lines(self, text, width):
472 text = self._whitespace_matcher.sub(' ', text).strip()
473 return _textwrap.wrap(text, width)
474
475 def _fill_text(self, text, width, indent):
476 text = self._whitespace_matcher.sub(' ', text).strip()
477 return _textwrap.fill(text, width, initial_indent=indent,
478 subsequent_indent=indent)
479
480 class RawDescriptionHelpFormatter(HelpFormatter):
481
482 def _fill_text(self, text, width, indent):
483 return ''.join(indent + line for line in text.splitlines(True))
484
485 class RawTextHelpFormatter(RawDescriptionHelpFormatter):
486
487 def _split_lines(self, text, width):
488 return text.splitlines()
489
490 # =====================
491 # Options and Arguments
492 # =====================
493
494 class ArgumentError(Exception):
495 """ArgumentError(message, argument)
496
497 Raised whenever there was an error creating or using an argument
498 (optional or positional).
499
500 The string value of this exception is the message, augmented with
501 information about the argument that caused it.
502 """
503
504 def __init__(self, argument, message):
505 if argument.option_strings:
506 self.argument_name = '/'.join(argument.option_strings)
507 elif argument.metavar not in (None, SUPPRESS):
508 self.argument_name = argument.metavar
509 elif argument.dest not in (None, SUPPRESS):
510 self.argument_name = argument.dest
511 else:
512 self.argument_name = None
513 self.message = message
514
515 def __str__(self):
516 if self.argument_name is None:
517 format = '%(message)s'
518 else:
519 format = 'argument %(argument_name)s: %(message)s'
520 return format % dict(message=self.message,
521 argument_name=self.argument_name)
522
523 # ==============
524 # Action classes
525 # ==============
526
527 class Action(_AttributeHolder):
528 """Action(*strings, **options)
529
530 Action objects hold the information necessary to convert a
531 set of command-line arguments (possibly including an initial option
532 string) into the desired Python object(s).
533
534 Keyword Arguments:
535
536 option_strings -- A list of command-line option strings which
537 should be associated with this action.
538
539 dest -- The name of the attribute to hold the created object(s)
540
541 nargs -- The number of command-line arguments that should be consumed.
542 By default, one argument will be consumed and a single value will
543 be produced. Other values include:
544 * N (an integer) consumes N arguments (and produces a list)
545 * '?' consumes zero or one arguments
546 * '*' consumes zero or more arguments (and produces a list)
547 * '+' consumes one or more arguments (and produces a list)
548 Note that the difference between the default and nargs=1 is that
549 with the default, a single value will be produced, while with
550 nargs=1, a list containing a single value will be produced.
551
552 const -- The value to be produced if the option is specified and the
553 option uses an action that takes no values.
554
555 default -- The value to be produced if the option is not specified.
556
557 type -- The type which the command-line arguments should be converted
558 to, should be one of 'string', 'int', 'float', 'complex' or a
559 callable object that accepts a single string argument. If None,
560 'string' is assumed.
561
562 choices -- A container of values that should be allowed. If not None,
563 after a command-line argument has been converted to the appropriate
564 type, an exception will be raised if it is not a member of this
565 collection.
566
567 required -- True if the action must always be specified at the command
568 line. This is only meaningful for optional command-line arguments.
569
570 help -- The help string describing the argument.
571
572 metavar -- The name to be used for the option's argument with the help
573 string. If None, the 'dest' value will be used as the name.
574 """
575
576
577 def __init__(self,
578 option_strings,
579 dest,
580 nargs=None,
581 const=None,
582 default=None,
583 type=None,
584 choices=None,
585 required=False,
586 help=None,
587 metavar=None):
588 self.option_strings = option_strings
589 self.dest = dest
590 self.nargs = nargs
591 self.const = const
592 self.default = default
593 self.type = type
594 self.choices = choices
595 self.required = required
596 self.help = help
597 self.metavar = metavar
598
599 def _get_kwargs(self):
600 names = [
601 'option_strings',
602 'dest',
603 'nargs',
604 'const',
605 'default',
606 'type',
607 'choices',
608 'help',
609 'metavar'
610 ]
611 return [(name, getattr(self, name)) for name in names]
612
613 def __call__(self, parser, namespace, values, option_string=None):
614 raise NotImplementedError(_('.__call__() not defined'))
615
616 class _StoreAction(Action):
617 def __init__(self,
618 option_strings,
619 dest,
620 nargs=None,
621 const=None,
622 default=None,
623 type=None,
624 choices=None,
625 required=False,
626 help=None,
627 metavar=None):
628 if nargs == 0:
629 raise ValueError('nargs must be > 0')
630 if const is not None and nargs != OPTIONAL:
631 raise ValueError('nargs must be %r to supply const' % OPTIONAL)
632 super(_StoreAction, self).__init__(
633 option_strings=option_strings,
634 dest=dest,
635 nargs=nargs,
636 const=const,
637 default=default,
638 type=type,
639 choices=choices,
640 required=required,
641 help=help,
642 metavar=metavar)
643
644 def __call__(self, parser, namespace, values, option_string=None):
645 setattr(namespace, self.dest, values)
646
647 class _StoreConstAction(Action):
648 def __init__(self,
649 option_strings,
650 dest,
651 const,
652 default=None,
653 required=False,
654 help=None,
655 metavar=None):
656 super(_StoreConstAction, self).__init__(
657 option_strings=option_strings,
658 dest=dest,
659 nargs=0,
660 const=const,
661 default=default,
662 required=required,
663 help=help)
664
665 def __call__(self, parser, namespace, values, option_string=None):
666 setattr(namespace, self.dest, self.const)
667
668 class _StoreTrueAction(_StoreConstAction):
669 def __init__(self,
670 option_strings,
671 dest,
672 default=False,
673 required=False,
674 help=None):
675 super(_StoreTrueAction, self).__init__(
676 option_strings=option_strings,
677 dest=dest,
678 const=True,
679 default=default,
680 required=required,
681 help=help)
682
683 class _StoreFalseAction(_StoreConstAction):
684 def __init__(self,
685 option_strings,
686 dest,
687 default=True,
688 required=False,
689 help=None):
690 super(_StoreFalseAction, self).__init__(
691 option_strings=option_strings,
692 dest=dest,
693 const=False,
694 default=default,
695 required=required,
696 help=help)
697
698 class _AppendAction(Action):
699 def __init__(self,
700 option_strings,
701 dest,
702 nargs=None,
703 const=None,
704 default=None,
705 type=None,
706 choices=None,
707 required=False,
708 help=None,
709 metavar=None):
710 if nargs == 0:
711 raise ValueError('nargs must be > 0')
712 if const is not None and nargs != OPTIONAL:
713 raise ValueError('nargs must be %r to supply const' % OPTIONAL)
714 super(_AppendAction, self).__init__(
715 option_strings=option_strings,
716 dest=dest,
717 nargs=nargs,
718 const=const,
719 default=default,
720 type=type,
721 choices=choices,
722 required=required,
723 help=help,
724 metavar=metavar)
725
726 def __call__(self, parser, namespace, values, option_string=None):
727 _ensure_value(namespace, self.dest, []).append(values)
728
729 class _AppendConstAction(Action):
730 def __init__(self,
731 option_strings,
732 dest,
733 const,
734 default=None,
735 required=False,
736 help=None,
737 metavar=None):
738 super(_AppendConstAction, self).__init__(
739 option_strings=option_strings,
740 dest=dest,
741 nargs=0,
742 const=const,
743 default=default,
744 required=required,
745 help=help,
746 metavar=metavar)
747
748 def __call__(self, parser, namespace, values, option_string=None):
749 _ensure_value(namespace, self.dest, []).append(self.const)
750
751 class _CountAction(Action):
752 def __init__(self,
753 option_strings,
754 dest,
755 default=None,
756 required=False,
757 help=None):
758 super(_CountAction, self).__init__(
759 option_strings=option_strings,
760 dest=dest,
761 nargs=0,
762 default=default,
763 required=required,
764 help=help)
765
766 def __call__(self, parser, namespace, values, option_string=None):
767 new_count = _ensure_value(namespace, self.dest, 0) + 1
768 setattr(namespace, self.dest, new_count)
769
770 class _HelpAction(Action):
771 def __init__(self,
772 option_strings,
773 dest=SUPPRESS,
774 default=SUPPRESS,
775 help=None):
776 super(_HelpAction, self).__init__(
777 option_strings=option_strings,
778 dest=dest,
779 default=default,
780 nargs=0,
781 help=help)
782
783 def __call__(self, parser, namespace, values, option_string=None):
784 parser.print_help()
785 parser.exit()
786
787 class _VersionAction(Action):
788 def __init__(self,
789 option_strings,
790 dest=SUPPRESS,
791 default=SUPPRESS,
792 help=None):
793 super(_VersionAction, self).__init__(
794 option_strings=option_strings,
795 dest=dest,
796 default=default,
797 nargs=0,
798 help=help)
799
800 def __call__(self, parser, namespace, values, option_string=None):
801 parser.print_version()
802 parser.exit()
803
804 class _SubParsersAction(Action):
805
806 class _ChoicesPseudoAction(Action):
807 def __init__(self, name, help):
808 sup = super(_SubParsersAction._ChoicesPseudoAction, self)
809 sup.__init__(option_strings=[], dest=name, help=help)
810
811
812 def __init__(self,
813 option_strings,
814 prog,
815 parser_class,
816 dest=SUPPRESS,
817 help=None,
818 metavar=None):
819
820 self._prog_prefix = prog
821 self._parser_class = parser_class
822 self._name_parser_map = {}
823 self._choices_actions = []
824
825 super(_SubParsersAction, self).__init__(
826 option_strings=option_strings,
827 dest=dest,
828 nargs=PARSER,
829 choices=self._name_parser_map,
830 help=help,
831 metavar=metavar)
832
833 def add_parser(self, name, **kwargs):
834 # set prog from the existing prefix
835 if kwargs.get('prog') is None:
836 kwargs['prog'] = '%s %s' % (self._prog_prefix, name)
837
838 # create a pseudo-action to hold the choice help
839 if 'help' in kwargs:
840 help = kwargs.pop('help')
841 choice_action = self._ChoicesPseudoAction(name, help)
842 self._choices_actions.append(choice_action)
843
844 # create the parser and add it to the map
845 parser = self._parser_class(**kwargs)
846 self._name_parser_map[name] = parser
847 return parser
848
849 def _get_subactions(self):
850 return self._choices_actions
851
852 def __call__(self, parser, namespace, values, option_string=None):
853 parser_name = values[0]
854 arg_strings = values[1:]
855
856 # set the parser name if requested
857 if self.dest is not SUPPRESS:
858 setattr(namespace, self.dest, parser_name)
859
860 # select the parser
861 try:
862 parser = self._name_parser_map[parser_name]
863 except KeyError:
864 tup = parser_name, ', '.join(self._name_parser_map)
865 msg = _('unknown parser %r (choices: %s)' % tup)
866 raise ArgumentError(self, msg)
867
868 # parse all the remaining options into the namespace
869 parser.parse_args(arg_strings, namespace)
870
871
872 # ==============
873 # Type classes
874 # ==============
875
876 class FileType(object):
877 """Factory for creating file object types
878
879 Instances of FileType are typically passed as type= arguments to the
880 ArgumentParser add_argument() method.
881
882 Keyword Arguments:
883 mode -- A string indicating how the file is to be opened. Accepts the
884 same values as the builtin open() function.
885 bufsize -- The file's desired buffer size. Accepts the same values as
886 the builtin open() function.
887 """
888 def __init__(self, mode='r', bufsize=None):
889 self._mode = mode
890 self._bufsize = bufsize
891
892 def __call__(self, string):
893 # the special argument "-" means sys.std{in,out}
894 if string == '-':
895 if self._mode == 'r':
896 return _sys.stdin
897 elif self._mode == 'w':
898 return _sys.stdout
899 else:
900 msg = _('argument "-" with mode %r' % self._mode)
901 raise ValueError(msg)
902
903 # all other arguments are used as file names
904 if self._bufsize:
905 return open(string, self._mode, self._bufsize)
906 else:
907 return open(string, self._mode)
908
909
910 # ===========================
911 # Optional and Positional Parsing
912 # ===========================
913
914 class Namespace(_AttributeHolder):
915
916 def __init__(self, **kwargs):
917 for name, value in kwargs.iteritems():
918 setattr(self, name, value)
919
920 def __eq__(self, other):
921 return vars(self) == vars(other)
922
923 def __ne__(self, other):
924 return not (self == other)
925
926
927 class _ActionsContainer(object):
928 def __init__(self,
929 description,
930 prefix_chars,
931 argument_default,
932 conflict_handler):
933 super(_ActionsContainer, self).__init__()
934
935 self.description = description
936 self.argument_default = argument_default
937 self.prefix_chars = prefix_chars
938 self.conflict_handler = conflict_handler
939
940 # set up registries
941 self._registries = {}
942
943 # register actions
944 self.register('action', None, _StoreAction)
945 self.register('action', 'store', _StoreAction)
946 self.register('action', 'store_const', _StoreConstAction)
947 self.register('action', 'store_true', _StoreTrueAction)
948 self.register('action', 'store_false', _StoreFalseAction)
949 self.register('action', 'append', _AppendAction)
950 self.register('action', 'append_const', _AppendConstAction)
951 self.register('action', 'count', _CountAction)
952 self.register('action', 'help', _HelpAction)
953 self.register('action', 'version', _VersionAction)
954 self.register('action', 'parsers', _SubParsersAction)
955
956 # raise an exception if the conflict handler is invalid
957 self._get_handler()
958
959 # action storage
960 self._optional_actions_list = []
961 self._positional_actions_list = []
962 self._positional_actions_full_list = []
963 self._option_strings = {}
964
965 # defaults storage
966 self._defaults = {}
967
968 # ====================
969 # Registration methods
970 # ====================
971
972 def register(self, registry_name, value, object):
973 registry = self._registries.setdefault(registry_name, {})
974 registry[value] = object
975
976 def _registry_get(self, registry_name, value, default=None):
977 return self._registries[registry_name].get(value, default)
978
979 # ==================================
980 # Namespace default settings methods
981 # ==================================
982
983 def set_defaults(self, **kwargs):
984 self._defaults.update(kwargs)
985
986 # if these defaults match any existing arguments, replace
987 # the previous default on the object with the new one
988 for action_list in [self._option_strings.values(),
989 self._positional_actions_full_list]:
990 for action in action_list:
991 if action.dest in kwargs:
992 action.default = kwargs[action.dest]
993
994 # =======================
995 # Adding argument actions
996 # =======================
997
998 def add_argument(self, *args, **kwargs):
999 """
1000 add_argument(dest, ..., name=value, ...)
1001 add_argument(option_string, option_string, ..., name=value, ...)
1002 """
1003
1004 # if no positional args are supplied or only one is supplied and
1005 # it doesn't look like an option string, parse a positional
1006 # argument
1007 chars = self.prefix_chars
1008 if not args or len(args) == 1 and args[0][0] not in chars:
1009 kwargs = self._get_positional_kwargs(*args, **kwargs)
1010
1011 # otherwise, we're adding an optional argument
1012 else:
1013 kwargs = self._get_optional_kwargs(*args, **kwargs)
1014
1015 # if no default was supplied, use the parser-level default
1016 if 'default' not in kwargs:
1017 dest = kwargs['dest']
1018 if dest in self._defaults:
1019 kwargs['default'] = self._defaults[dest]
1020 elif self.argument_default is not None:
1021 kwargs['default'] = self.argument_default
1022
1023 # create the action object, and add it to the parser
1024 action_class = self._pop_action_class(kwargs)
1025 action = action_class(**kwargs)
1026 return self._add_action(action)
1027
1028 def _add_action(self, action):
1029 # resolve any conflicts
1030 self._check_conflict(action)
1031
1032 # add to optional or positional list
1033 if action.option_strings:
1034 self._optional_actions_list.append(action)
1035 else:
1036 self._positional_actions_list.append(action)
1037 self._positional_actions_full_list.append(action)
1038 action.container = self
1039
1040 # index the action by any option strings it has
1041 for option_string in action.option_strings:
1042 self._option_strings[option_string] = action
1043
1044 # return the created action
1045 return action
1046
1047 def _add_container_actions(self, container):
1048 for action in container._optional_actions_list:
1049 self._add_action(action)
1050 for action in container._positional_actions_list:
1051 self._add_action(action)
1052
1053 def _get_positional_kwargs(self, dest, **kwargs):
1054 # make sure required is not specified
1055 if 'required' in kwargs:
1056 msg = _("'required' is an invalid argument for positionals")
1057 raise TypeError(msg)
1058
1059 # return the keyword arguments with no option strings
1060 return dict(kwargs, dest=dest, option_strings=[])
1061
1062 def _get_optional_kwargs(self, *args, **kwargs):
1063 # determine short and long option strings
1064 option_strings = []
1065 long_option_strings = []
1066 for option_string in args:
1067 # error on one-or-fewer-character option strings
1068 if len(option_string) < 2:
1069 msg = _('invalid option string %r: '
1070 'must be at least two characters long')
1071 raise ValueError(msg % option_string)
1072
1073 # error on strings that don't start with an appropriate prefix
1074 if not option_string[0] in self.prefix_chars:
1075 msg = _('invalid option string %r: '
1076 'must start with a character %r')
1077 tup = option_string, self.prefix_chars
1078 raise ValueError(msg % tup)
1079
1080 # error on strings that are all prefix characters
1081 if not (set(option_string) - set(self.prefix_chars)):
1082 msg = _('invalid option string %r: '
1083 'must contain characters other than %r')
1084 tup = option_string, self.prefix_chars
1085 raise ValueError(msg % tup)
1086
1087 # strings starting with two prefix characters are long options
1088 option_strings.append(option_string)
1089 if option_string[0] in self.prefix_chars:
1090 if option_string[1] in self.prefix_chars:
1091 long_option_strings.append(option_string)
1092
1093 # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
1094 dest = kwargs.pop('dest', None)
1095 if dest is None:
1096 if long_option_strings:
1097 dest_option_string = long_option_strings[0]
1098 else:
1099 dest_option_string = option_strings[0]
1100 dest = dest_option_string.lstrip(self.prefix_chars)
1101 dest = dest.replace('-', '_')
1102
1103 # return the updated keyword arguments
1104 return dict(kwargs, dest=dest, option_strings=option_strings)
1105
1106 def _pop_action_class(self, kwargs, default=None):
1107 action = kwargs.pop('action', default)
1108 return self._registry_get('action', action, action)
1109
1110 def _get_handler(self):
1111 # determine function from conflict handler string
1112 handler_func_name = '_handle_conflict_%s' % self.conflict_handler
1113 try:
1114 return getattr(self, handler_func_name)
1115 except AttributeError:
1116 msg = _('invalid conflict_resolution value: %r')
1117 raise ValueError(msg % self.conflict_handler)
1118
1119 def _check_conflict(self, action):
1120
1121 # find all options that conflict with this option
1122 confl_optionals = []
1123 for option_string in action.option_strings:
1124 if option_string in self._option_strings:
1125 confl_optional = self._option_strings[option_string]
1126 confl_optionals.append((option_string, confl_optional))
1127
1128 # resolve any conflicts
1129 if confl_optionals:
1130 conflict_handler = self._get_handler()
1131 conflict_handler(action, confl_optionals)
1132
1133 def _handle_conflict_error(self, action, conflicting_actions):
1134 message = _('conflicting option string(s): %s')
1135 conflict_string = ', '.join(option_string
1136 for option_string, action
1137 in conflicting_actions)
1138 raise ArgumentError(action, message % conflict_string)
1139
1140 def _handle_conflict_resolve(self, action, conflicting_actions):
1141
1142 # remove all conflicting options
1143 for option_string, action in conflicting_actions:
1144
1145 # remove the conflicting option
1146 action.option_strings.remove(option_string)
1147 self._option_strings.pop(option_string, None)
1148
1149 # if the option now has no option string, remove it from the
1150 # container holding it
1151 if not action.option_strings:
1152 action.container._optional_actions_list.remove(action)
1153
1154
1155 class _ArgumentGroup(_ActionsContainer):
1156
1157 def __init__(self, container, title=None, description=None, **kwargs):
1158 # add any missing keyword arguments by checking the container
1159 update = kwargs.setdefault
1160 update('conflict_handler', container.conflict_handler)
1161 update('prefix_chars', container.prefix_chars)
1162 update('argument_default', container.argument_default)
1163 super_init = super(_ArgumentGroup, self).__init__
1164 super_init(description=description, **kwargs)
1165
1166 self.title = title
1167 self._registries = container._registries
1168 self._positional_actions_full_list = container._positional_actions_full_list
1169 self._option_strings = container._option_strings
1170 self._defaults = container._defaults
1171
1172
1173 class ArgumentParser(_AttributeHolder, _ActionsContainer):
1174
1175 def __init__(self,
1176 prog=None,
1177 usage=None,
1178 description=None,
1179 epilog=None,
1180 version=None,
1181 parents=[],
1182 formatter_class=HelpFormatter,
1183 prefix_chars='-',
1184 argument_default=None,
1185 conflict_handler='error',
1186 add_help=True):
1187
1188 superinit = super(ArgumentParser, self).__init__
1189 superinit(description=description,
1190 prefix_chars=prefix_chars,
1191 argument_default=argument_default,
1192 conflict_handler=conflict_handler)
1193
1194 # default setting for prog
1195 if prog is None:
1196 prog = _os.path.basename(_sys.argv[0])
1197
1198 self.prog = prog
1199 self.usage = usage
1200 self.epilog = epilog
1201 self.version = version
1202 self.formatter_class = formatter_class
1203 self.add_help = add_help
1204
1205 self._argument_group_class = _ArgumentGroup
1206 self._has_subparsers = False
1207 self._argument_groups = []
1208
1209 # register types
1210 def identity(string):
1211 return string
1212 self.register('type', None, identity)
1213
1214 # add help and version arguments if necessary
1215 # (using explicit default to override global argument_default)
1216 if self.add_help:
1217 self.add_argument(
1218 '-h', '--help', action='help', default=SUPPRESS,
1219 help=_('show this help message and exit'))
1220 if self.version:
1221 self.add_argument(
1222 '-v', '--version', action='version', default=SUPPRESS,
1223 help=_("show program's version number and exit"))
1224
1225 # add parent arguments and defaults
1226 for parent in parents:
1227 self._add_container_actions(parent)
1228 try:
1229 defaults = parent._defaults
1230 except AttributeError:
1231 pass
1232 else:
1233 self._defaults.update(defaults)
1234
1235 # determines whether an "option" looks like a negative number
1236 self._negative_number_matcher = _re.compile(r'^-\d+|-\d*.\d+$')
1237
1238
1239 # =======================
1240 # Pretty __repr__ methods
1241 # =======================
1242
1243 def _get_kwargs(self):
1244 names = [
1245 'prog',
1246 'usage',
1247 'description',
1248 'version',
1249 'formatter_class',
1250 'conflict_handler',
1251 'add_help',
1252 ]
1253 return [(name, getattr(self, name)) for name in names]
1254
1255 # ==================================
1256 # Optional/Positional adding methods
1257 # ==================================
1258
1259 def add_argument_group(self, *args, **kwargs):
1260 group = self._argument_group_class(self, *args, **kwargs)
1261 self._argument_groups.append(group)
1262 return group
1263
1264 def add_subparsers(self, **kwargs):
1265 if self._has_subparsers:
1266 self.error(_('cannot have multiple subparser arguments'))
1267
1268 # add the parser class to the arguments if it's not present
1269 kwargs.setdefault('parser_class', type(self))
1270
1271 # prog defaults to the usage message of this parser, skipping
1272 # optional arguments and with no "usage:" prefix
1273 if kwargs.get('prog') is None:
1274 formatter = self._get_formatter()
1275 formatter.add_usage(self.usage, [],
1276 self._get_positional_actions(), '')
1277 kwargs['prog'] = formatter.format_help().strip()
1278
1279 # create the parsers action and add it to the positionals list
1280 parsers_class = self._pop_action_class(kwargs, 'parsers')
1281 action = parsers_class(option_strings=[], **kwargs)
1282 self._positional_actions_list.append(action)
1283 self._positional_actions_full_list.append(action)
1284 self._has_subparsers = True
1285
1286 # return the created parsers action
1287 return action
1288
1289 def _add_container_actions(self, container):
1290 super(ArgumentParser, self)._add_container_actions(container)
1291 try:
1292 groups = container._argument_groups
1293 except AttributeError:
1294 pass
1295 else:
1296 for group in groups:
1297 new_group = self.add_argument_group(
1298 title=group.title,
1299 description=group.description,
1300 conflict_handler=group.conflict_handler)
1301 new_group._add_container_actions(group)
1302
1303 def _get_optional_actions(self):
1304 actions = []
1305 actions.extend(self._optional_actions_list)
1306 for argument_group in self._argument_groups:
1307 actions.extend(argument_group._optional_actions_list)
1308 return actions
1309
1310 def _get_positional_actions(self):
1311 return list(self._positional_actions_full_list)
1312
1313
1314 # =====================================
1315 # Command line argument parsing methods
1316 # =====================================
1317
1318 def parse_args(self, args=None, namespace=None):
1319 # args default to the system args
1320 if args is None:
1321 args = _sys.argv[1:]
1322
1323 # default Namespace built from parser defaults
1324 if namespace is None:
1325 namespace = Namespace()
1326
1327 # add any action defaults that aren't present
1328 optional_actions = self._get_optional_actions()
1329 positional_actions = self._get_positional_actions()
1330 for action in optional_actions + positional_actions:
1331 if action.dest is not SUPPRESS:
1332 if not hasattr(namespace, action.dest):
1333 if action.default is not SUPPRESS:
1334 default = action.default
1335 if isinstance(action.default, basestring):
1336 default = self._get_value(action, default)
1337 setattr(namespace, action.dest, default)
1338
1339 # add any parser defaults that aren't present
1340 for dest, value in self._defaults.iteritems():
1341 if not hasattr(namespace, dest):
1342 setattr(namespace, dest, value)
1343
1344 # parse the arguments and exit if there are any errors
1345 try:
1346 result = self._parse_args(args, namespace)
1347 except ArgumentError, err:
1348 self.error(str(err))
1349
1350 # make sure all required optionals are present
1351 for action in self._get_optional_actions():
1352 if action.required:
1353 if getattr(result, action.dest, None) is None:
1354 opt_strs = '/'.join(action.option_strings)
1355 msg = _('option %s is required' % opt_strs)
1356 self.error(msg)
1357
1358 # return the parsed arguments
1359 return result
1360
1361 def _parse_args(self, arg_strings, namespace):
1362
1363 # find all option indices, and determine the arg_string_pattern
1364 # which has an 'O' if there is an option at an index,
1365 # an 'A' if there is an argument, or a '-' if there is a '--'
1366 option_string_indices = {}
1367 arg_string_pattern_parts = []
1368 arg_strings_iter = iter(arg_strings)
1369 for i, arg_string in enumerate(arg_strings_iter):
1370
1371 # all args after -- are non-options
1372 if arg_string == '--':
1373 arg_string_pattern_parts.append('-')
1374 for arg_string in arg_strings_iter:
1375 arg_string_pattern_parts.append('A')
1376
1377 # otherwise, add the arg to the arg strings
1378 # and note the index if it was an option
1379 else:
1380 option_tuple = self._parse_optional(arg_string)
1381 if option_tuple is None:
1382 pattern = 'A'
1383 else:
1384 option_string_indices[i] = option_tuple
1385 pattern = 'O'
1386 arg_string_pattern_parts.append(pattern)
1387
1388 # join the pieces together to form the pattern
1389 arg_strings_pattern = ''.join(arg_string_pattern_parts)
1390
1391 # converts arg strings to the appropriate and then takes the action
1392 def take_action(action, argument_strings, option_string=None):
1393 argument_values = self._get_values(action, argument_strings)
1394 # take the action if we didn't receive a SUPPRESS value
1395 # (e.g. from a default)
1396 if argument_values is not SUPPRESS:
1397 action(self, namespace, argument_values, option_string)
1398
1399 # function to convert arg_strings into an optional action
1400 def consume_optional(start_index):
1401
1402 # determine the optional action and parse any explicit
1403 # argument out of the option string
1404 option_tuple = option_string_indices[start_index]
1405 action, option_string, explicit_arg = option_tuple
1406
1407 # loop because single-dash options can be chained
1408 # (e.g. -xyz is the same as -x -y -z if no args are required)
1409 match_argument = self._match_argument
1410 action_tuples = []
1411 while True:
1412
1413 # if we found no optional action, raise an error
1414 if action is None:
1415 self.error(_('no such option: %s') % option_string)
1416
1417 # if there is an explicit argument, try to match the
1418 # optional's string arguments to only this
1419 if explicit_arg is not None:
1420 arg_count = match_argument(action, 'A')
1421
1422 # if the action is a single-dash option and takes no
1423 # arguments, try to parse more single-dash options out
1424 # of the tail of the option string
1425 chars = self.prefix_chars
1426 if arg_count == 0 and option_string[1] not in chars:
1427 action_tuples.append((action, [], option_string))
1428 parse_optional = self._parse_optional
1429 for char in self.prefix_chars:
1430 option_string = char + explicit_arg
1431 option_tuple = parse_optional(option_string)
1432 if option_tuple[0] is not None:
1433 break
1434 else:
1435 msg = _('ignored explicit argument %r')
1436 raise ArgumentError(action, msg % explicit_arg)
1437
1438 # set the action, etc. for the next loop iteration
1439 action, option_string, explicit_arg = option_tuple
1440
1441 # if the action expect exactly one argument, we've
1442 # successfully matched the option; exit the loop
1443 elif arg_count == 1:
1444 stop = start_index + 1
1445 args = [explicit_arg]
1446 action_tuples.append((action, args, option_string))
1447 break
1448
1449 # error if a double-dash option did not use the
1450 # explicit argument
1451 else:
1452 msg = _('ignored explicit argument %r')
1453 raise ArgumentError(action, msg % explicit_arg)
1454
1455 # if there is no explicit argument, try to match the
1456 # optional's string arguments with the following strings
1457 # if successful, exit the loop
1458 else:
1459 start = start_index + 1
1460 selected_patterns = arg_strings_pattern[start:]
1461 arg_count = match_argument(action, selected_patterns)
1462 stop = start + arg_count
1463 args = arg_strings[start:stop]
1464 action_tuples.append((action, args, option_string))
1465 break
1466
1467 # add the Optional to the list and return the index at which
1468 # the Optional's string args stopped
1469 assert action_tuples
1470 for action, args, option_string in action_tuples:
1471 take_action(action, args, option_string)
1472 return stop
1473
1474 # the list of Positionals left to be parsed; this is modified
1475 # by consume_positionals()
1476 positionals = self._get_positional_actions()
1477
1478 # function to convert arg_strings into positional actions
1479 def consume_positionals(start_index):
1480 # match as many Positionals as possible
1481 match_partial = self._match_arguments_partial
1482 selected_pattern = arg_strings_pattern[start_index:]
1483 arg_counts = match_partial(positionals, selected_pattern)
1484
1485 # slice off the appropriate arg strings for each Positional
1486 # and add the Positional and its args to the list
1487 for action, arg_count in zip(positionals, arg_counts):
1488 args = arg_strings[start_index: start_index + arg_count]
1489 start_index += arg_count
1490 take_action(action, args)
1491
1492 # slice off the Positionals that we just parsed and return the
1493 # index at which the Positionals' string args stopped
1494 positionals[:] = positionals[len(arg_counts):]
1495 return start_index
1496
1497 # consume Positionals and Optionals alternately, until we have
1498 # passed the last option string
1499 start_index = 0
1500 if option_string_indices:
1501 max_option_string_index = max(option_string_indices)
1502 else:
1503 max_option_string_index = -1
1504 while start_index <= max_option_string_index:
1505
1506 # consume any Positionals preceding the next option
1507 next_option_string_index = min(
1508 index
1509 for index in option_string_indices
1510 if index >= start_index)
1511 if start_index != next_option_string_index:
1512 positionals_end_index = consume_positionals(start_index)
1513
1514 # only try to parse the next optional if we didn't consume
1515 # the option string during the positionals parsing
1516 if positionals_end_index > start_index:
1517 start_index = positionals_end_index
1518 continue
1519 else:
1520 start_index = positionals_end_index
1521
1522 # if we consumed all the positionals we could and we're not
1523 # at the index of an option string, there were unparseable
1524 # arguments
1525 if start_index not in option_string_indices:
1526 msg = _('extra arguments found: %s')
1527 extras = arg_strings[start_index:next_option_string_index]
1528 self.error(msg % ' '.join(extras))
1529
1530 # consume the next optional and any arguments for it
1531 start_index = consume_optional(start_index)
1532
1533 # consume any positionals following the last Optional
1534 stop_index = consume_positionals(start_index)
1535
1536 # if we didn't consume all the argument strings, there were too
1537 # many supplied
1538 if stop_index != len(arg_strings):
1539 extras = arg_strings[stop_index:]
1540 self.error(_('extra arguments found: %s') % ' '.join(extras))
1541
1542 # if we didn't use all the Positional objects, there were too few
1543 # arg strings supplied.
1544 if positionals:
1545 self.error(_('too few arguments'))
1546
1547 # return the updated namespace
1548 return namespace
1549
1550 def _match_argument(self, action, arg_strings_pattern):
1551 # match the pattern for this action to the arg strings
1552 nargs_pattern = self._get_nargs_pattern(action)
1553 match = _re.match(nargs_pattern, arg_strings_pattern)
1554
1555 # raise an exception if we weren't able to find a match
1556 if match is None:
1557 nargs_errors = {
1558 None:_('expected one argument'),
1559 OPTIONAL:_('expected at most one argument'),
1560 ONE_OR_MORE:_('expected at least one argument')
1561 }
1562 default = _('expected %s argument(s)') % action.nargs
1563 msg = nargs_errors.get(action.nargs, default)
1564 raise ArgumentError(action, msg)
1565
1566 # return the number of arguments matched
1567 return len(match.group(1))
1568
1569 def _match_arguments_partial(self, actions, arg_strings_pattern):
1570 # progressively shorten the actions list by slicing off the
1571 # final actions until we find a match
1572 result = []
1573 for i in xrange(len(actions), 0, -1):
1574 actions_slice = actions[:i]
1575 pattern = ''.join(self._get_nargs_pattern(action)
1576 for action in actions_slice)
1577 match = _re.match(pattern, arg_strings_pattern)
1578 if match is not None:
1579 result.extend(len(string) for string in match.groups())
1580 break
1581
1582 # return the list of arg string counts
1583 return result
1584
1585 def _parse_optional(self, arg_string):
1586 # if it doesn't start with a prefix, it was meant to be positional
1587 if not arg_string[0] in self.prefix_chars:
1588 return None
1589
1590 # if it's just dashes, it was meant to be positional
1591 if not arg_string.strip('-'):
1592 return None
1593
1594 # if the option string is present in the parser, return the action
1595 if arg_string in self._option_strings:
1596 action = self._option_strings[arg_string]
1597 return action, arg_string, None
1598
1599 # search through all possible prefixes of the option string
1600 # and all actions in the parser for possible interpretations
1601 option_tuples = []
1602 prefix_tuples = self._get_option_prefix_tuples(arg_string)
1603 for option_string in self._option_strings:
1604 for option_prefix, explicit_arg in prefix_tuples:
1605 if option_string.startswith(option_prefix):
1606 action = self._option_strings[option_string]
1607 tup = action, option_string, explicit_arg
1608 option_tuples.append(tup)
1609 break
1610
1611 # if multiple actions match, the option string was ambiguous
1612 if len(option_tuples) > 1:
1613 options = ', '.join(opt_str for _, opt_str, _ in option_tuples)
1614 tup = arg_string, options
1615 self.error(_('ambiguous option: %s could match %s') % tup)
1616
1617 # if exactly one action matched, this segmentation is good,
1618 # so return the parsed action
1619 elif len(option_tuples) == 1:
1620 option_tuple, = option_tuples
1621 return option_tuple
1622
1623 # if it was not found as an option, but it looks like a negative
1624 # number, it was meant to be positional
1625 if self._negative_number_matcher.match(arg_string):
1626 return None
1627
1628 # it was meant to be an optional but there is no such option
1629 # in this parser (though it might be a valid option in a subparser)
1630 return None, arg_string, None
1631
1632 def _get_option_prefix_tuples(self, option_string):
1633 result = []
1634
1635 # option strings starting with two prefix characters are only
1636 # split at the '='
1637 chars = self.prefix_chars
1638 if option_string[0] in chars and option_string[1] in chars:
1639 if '=' in option_string:
1640 option_prefix, explicit_arg = option_string.split('=', 1)
1641 else:
1642 option_prefix = option_string
1643 explicit_arg = None
1644 tup = option_prefix, explicit_arg
1645 result.append(tup)
1646
1647 # option strings starting with a single prefix character are
1648 # split at all indices
1649 else:
1650 for first_index, char in enumerate(option_string):
1651 if char not in self.prefix_chars:
1652 break
1653 for i in xrange(len(option_string), first_index, -1):
1654 tup = option_string[:i], option_string[i:] or None
1655 result.append(tup)
1656
1657 # return the collected prefix tuples
1658 return result
1659
1660 def _get_nargs_pattern(self, action):
1661 # in all examples below, we have to allow for '--' args
1662 # which are represented as '-' in the pattern
1663 nargs = action.nargs
1664
1665 # the default (None) is assumed to be a single argument
1666 if nargs is None:
1667 nargs_pattern = '(-*A-*)'
1668
1669 # allow zero or one arguments
1670 elif nargs == OPTIONAL:
1671 nargs_pattern = '(-*A?-*)'
1672
1673 # allow zero or more arguments
1674 elif nargs == ZERO_OR_MORE:
1675 nargs_pattern = '(-*[A-]*)'
1676
1677 # allow one or more arguments
1678 elif nargs == ONE_OR_MORE:
1679 nargs_pattern = '(-*A[A-]*)'
1680
1681 # allow one argument followed by any number of options or arguments
1682 elif nargs is PARSER:
1683 nargs_pattern = '(-*A[-AO]*)'
1684
1685 # all others should be integers
1686 else:
1687 nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
1688
1689 # if this is an optional action, -- is not allowed
1690 if action.option_strings:
1691 nargs_pattern = nargs_pattern.replace('-*', '')
1692 nargs_pattern = nargs_pattern.replace('-', '')
1693
1694 # return the pattern
1695 return nargs_pattern
1696
1697 # ========================
1698 # Value conversion methods
1699 # ========================
1700
1701 def _get_values(self, action, arg_strings):
1702 # for everything but PARSER args, strip out '--'
1703 if action.nargs is not PARSER:
1704 arg_strings = [s for s in arg_strings if s != '--']
1705
1706 # optional argument produces a default when not present
1707 if not arg_strings and action.nargs == OPTIONAL:
1708 if action.option_strings:
1709 value = action.const
1710 else:
1711 value = action.default
1712 if isinstance(value, basestring):
1713 value = self._get_value(action, value)
1714 self._check_value(action, value)
1715
1716 # when nargs='*' on a positional, if there were no command-line
1717 # args, use the default if it is anything other than None
1718 elif (not arg_strings and action.nargs == ZERO_OR_MORE and
1719 not action.option_strings):
1720 if action.default is not None:
1721 value = action.default
1722 else:
1723 value = arg_strings
1724 self._check_value(action, value)
1725
1726 # single argument or optional argument produces a single value
1727 elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
1728 arg_string, = arg_strings
1729 value = self._get_value(action, arg_string)
1730 self._check_value(action, value)
1731
1732 # PARSER arguments convert all values, but check only the first
1733 elif action.nargs is PARSER:
1734 value = list(self._get_value(action, v) for v in arg_strings)
1735 self._check_value(action, value[0])
1736
1737 # all other types of nargs produce a list
1738 else:
1739 value = list(self._get_value(action, v) for v in arg_strings)
1740 for v in value:
1741 self._check_value(action, v)
1742
1743 # return the converted value
1744 return value
1745
1746 def _get_value(self, action, arg_string):
1747 type_func = self._registry_get('type', action.type, action.type)
1748 if not callable(type_func):
1749 msg = _('%r is not callable')
1750 raise ArgumentError(action, msg % type_func)
1751
1752 # convert the value to the appropriate type
1753 try:
1754 result = type_func(arg_string)
1755
1756 # TypeErrors or ValueErrors indicate errors
1757 except (TypeError, ValueError):
1758 name = getattr(action.type, '__name__', repr(action.type))
1759 msg = _('invalid %s value: %r')
1760 raise ArgumentError(action, msg % (name, arg_string))
1761
1762 # return the converted value
1763 return result
1764
1765 def _check_value(self, action, value):
1766 # converted value must be one of the choices (if specified)
1767 if action.choices is not None and value not in action.choices:
1768 tup = value, ', '.join(map(repr, action.choices))
1769 msg = _('invalid choice: %r (choose from %s)') % tup
1770 raise ArgumentError(action, msg)
1771
1772
1773
1774 # =======================
1775 # Help-formatting methods
1776 # =======================
1777
1778 def format_usage(self):
1779 formatter = self._get_formatter()
1780 formatter.add_usage(self.usage,
1781 self._get_optional_actions(),
1782 self._get_positional_actions())
1783 return formatter.format_help()
1784
1785 def format_help(self):
1786 formatter = self._get_formatter()
1787
1788 # usage
1789 formatter.add_usage(self.usage,
1790 self._get_optional_actions(),
1791 self._get_positional_actions())
1792
1793 # description
1794 formatter.add_text(self.description)
1795
1796 # positionals
1797 formatter.start_section(_('positional arguments'))
1798 formatter.add_arguments(self._positional_actions_list)
1799 formatter.end_section()
1800
1801 # optionals
1802 formatter.start_section(_('optional arguments'))
1803 formatter.add_arguments(self._optional_actions_list)
1804 formatter.end_section()
1805
1806 # user-defined groups
1807 for argument_group in self._argument_groups:
1808 formatter.start_section(argument_group.title)
1809 formatter.add_text(argument_group.description)
1810 formatter.add_arguments(argument_group._positional_actions_list)
1811 formatter.add_arguments(argument_group._optional_actions_list)
1812 formatter.end_section()
1813
1814 # epilog
1815 formatter.add_text(self.epilog)
1816
1817 # determine help from format above
1818 return formatter.format_help()
1819
1820 def format_version(self):
1821 formatter = self._get_formatter()
1822 formatter.add_text(self.version)
1823 return formatter.format_help()
1824
1825 def _get_formatter(self):
1826 return self.formatter_class(prog=self.prog)
1827
1828 # =====================
1829 # Help-printing methods
1830 # =====================
1831
1832 def print_usage(self, file=None):
1833 self._print_message(self.format_usage(), file)
1834
1835 def print_help(self, file=None):
1836 self._print_message(self.format_help(), file)
1837
1838 def print_version(self, file=None):
1839 self._print_message(self.format_version(), file)
1840
1841 def _print_message(self, message, file=None):
1842 if message:
1843 if file is None:
1844 file = _sys.stderr
1845 file.write(message)
1846
1847
1848 # ===============
1849 # Exiting methods
1850 # ===============
1851
1852 def exit(self, status=0, message=None):
1853 if message:
1854 _sys.stderr.write(message)
1855 _sys.exit(status)
1856
1857 def error(self, message):
1858 """error(message: string)
1859
1860 Prints a usage message incorporating the message to stderr and
1861 exits.
1862
1863 If you override this in a subclass, it should not return -- it
1864 should either exit or raise an exception.
1865 """
1866 self.print_usage(_sys.stderr)
1867 self.exit(2, _('%s: error: %s\n') % (self.prog, message))
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,394 +1,400 b''
1
1
2 """ Implementations for various useful completers
2 """ Implementations for various useful completers
3
3
4 See Extensions/ipy_stock_completers.py on examples of how to enable a completer,
4 See Extensions/ipy_stock_completers.py on examples of how to enable a completer,
5 but the basic idea is to do:
5 but the basic idea is to do:
6
6
7 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
7 ip.set_hook('complete_command', svn_completer, str_key = 'svn')
8
8
9 """
9 """
10 import IPython.ipapi
10 import IPython.ipapi
11 import glob,os,shlex,sys
11 import glob,os,shlex,sys
12 import inspect
12 import inspect
13 from time import time
13 from time import time
14 from zipimport import zipimporter
14 from zipimport import zipimporter
15 ip = IPython.ipapi.get()
15 ip = IPython.ipapi.get()
16
16
17 try:
17 try:
18 set
18 set
19 except:
19 except:
20 from sets import Set as set
20 from sets import Set as set
21
21
22 TIMEOUT_STORAGE = 3 #Time in seconds after which the rootmodules will be stored
22 TIMEOUT_STORAGE = 3 #Time in seconds after which the rootmodules will be stored
23 TIMEOUT_GIVEUP = 20 #Time in seconds after which we give up
23 TIMEOUT_GIVEUP = 20 #Time in seconds after which we give up
24
24
25 def quick_completer(cmd, completions):
25 def quick_completer(cmd, completions):
26 """ Easily create a trivial completer for a command.
26 """ Easily create a trivial completer for a command.
27
27
28 Takes either a list of completions, or all completions in string
28 Takes either a list of completions, or all completions in string
29 (that will be split on whitespace)
29 (that will be split on whitespace)
30
30
31 Example::
31 Example::
32
32
33 [d:\ipython]|1> import ipy_completers
33 [d:\ipython]|1> import ipy_completers
34 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
34 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
35 [d:\ipython]|3> foo b<TAB>
35 [d:\ipython]|3> foo b<TAB>
36 bar baz
36 bar baz
37 [d:\ipython]|3> foo ba
37 [d:\ipython]|3> foo ba
38 """
38 """
39 if isinstance(completions, basestring):
39 if isinstance(completions, basestring):
40
40
41 completions = completions.split()
41 completions = completions.split()
42 def do_complete(self,event):
42 def do_complete(self,event):
43 return completions
43 return completions
44
44
45 ip.set_hook('complete_command',do_complete, str_key = cmd)
45 ip.set_hook('complete_command',do_complete, str_key = cmd)
46
46
47 def getRootModules():
47 def getRootModules():
48 """
48 """
49 Returns a list containing the names of all the modules available in the
49 Returns a list containing the names of all the modules available in the
50 folders of the pythonpath.
50 folders of the pythonpath.
51 """
51 """
52 modules = []
52 modules = []
53 if ip.db.has_key('rootmodules'):
53 if ip.db.has_key('rootmodules'):
54 return ip.db['rootmodules']
54 return ip.db['rootmodules']
55 t = time()
55 t = time()
56 store = False
56 store = False
57 for path in sys.path:
57 for path in sys.path:
58 modules += moduleList(path)
58 modules += moduleList(path)
59 if time() - t >= TIMEOUT_STORAGE and not store:
59 if time() - t >= TIMEOUT_STORAGE and not store:
60 store = True
60 store = True
61 print "\nCaching the list of root modules, please wait!"
61 print "\nCaching the list of root modules, please wait!"
62 print "(This will only be done once - type '%rehashx' to " + \
62 print "(This will only be done once - type '%rehashx' to " + \
63 "reset cache!)"
63 "reset cache!)"
64 print
64 print
65 if time() - t > TIMEOUT_GIVEUP:
65 if time() - t > TIMEOUT_GIVEUP:
66 print "This is taking too long, we give up."
66 print "This is taking too long, we give up."
67 print
67 print
68 ip.db['rootmodules'] = []
68 ip.db['rootmodules'] = []
69 return []
69 return []
70
70
71 modules += sys.builtin_module_names
71 modules += sys.builtin_module_names
72
72
73 modules = list(set(modules))
73 modules = list(set(modules))
74 if '__init__' in modules:
74 if '__init__' in modules:
75 modules.remove('__init__')
75 modules.remove('__init__')
76 modules = list(set(modules))
76 modules = list(set(modules))
77 if store:
77 if store:
78 ip.db['rootmodules'] = modules
78 ip.db['rootmodules'] = modules
79 return modules
79 return modules
80
80
81 def moduleList(path):
81 def moduleList(path):
82 """
82 """
83 Return the list containing the names of the modules available in the given
83 Return the list containing the names of the modules available in the given
84 folder.
84 folder.
85 """
85 """
86
86
87 if os.path.isdir(path):
87 if os.path.isdir(path):
88 folder_list = os.listdir(path)
88 folder_list = os.listdir(path)
89 elif path.endswith('.egg'):
89 elif path.endswith('.egg'):
90 try:
90 try:
91 folder_list = [f for f in zipimporter(path)._files]
91 folder_list = [f for f in zipimporter(path)._files]
92 except:
92 except:
93 folder_list = []
93 folder_list = []
94 else:
94 else:
95 folder_list = []
95 folder_list = []
96 #folder_list = glob.glob(os.path.join(path,'*'))
96 #folder_list = glob.glob(os.path.join(path,'*'))
97 folder_list = [p for p in folder_list \
97 folder_list = [p for p in folder_list \
98 if os.path.exists(os.path.join(path, p,'__init__.py'))\
98 if os.path.exists(os.path.join(path, p,'__init__.py'))\
99 or p[-3:] in ('.py','.so')\
99 or p[-3:] in ('.py','.so')\
100 or p[-4:] in ('.pyc','.pyo','.pyd')]
100 or p[-4:] in ('.pyc','.pyo','.pyd')]
101
101
102 folder_list = [os.path.basename(p).split('.')[0] for p in folder_list]
102 folder_list = [os.path.basename(p).split('.')[0] for p in folder_list]
103 return folder_list
103 return folder_list
104
104
105 def moduleCompletion(line):
105 def moduleCompletion(line):
106 """
106 """
107 Returns a list containing the completion possibilities for an import line.
107 Returns a list containing the completion possibilities for an import line.
108 The line looks like this :
108 The line looks like this :
109 'import xml.d'
109 'import xml.d'
110 'from xml.dom import'
110 'from xml.dom import'
111 """
111 """
112 def tryImport(mod, only_modules=False):
112 def tryImport(mod, only_modules=False):
113 def isImportable(module, attr):
113 def isImportable(module, attr):
114 if only_modules:
114 if only_modules:
115 return inspect.ismodule(getattr(module, attr))
115 return inspect.ismodule(getattr(module, attr))
116 else:
116 else:
117 return not(attr[:2] == '__' and attr[-2:] == '__')
117 return not(attr[:2] == '__' and attr[-2:] == '__')
118 try:
118 try:
119 m = __import__(mod)
119 m = __import__(mod)
120 except:
120 except:
121 return []
121 return []
122 mods = mod.split('.')
122 mods = mod.split('.')
123 for module in mods[1:]:
123 for module in mods[1:]:
124 m = getattr(m,module)
124 m = getattr(m,module)
125 if (not hasattr(m, '__file__')) or (not only_modules) or\
125 if (not hasattr(m, '__file__')) or (not only_modules) or\
126 (hasattr(m, '__file__') and '__init__' in m.__file__):
126 (hasattr(m, '__file__') and '__init__' in m.__file__):
127 completion_list = [attr for attr in dir(m) if isImportable(m, attr)]
127 completion_list = [attr for attr in dir(m) if isImportable(m, attr)]
128 completion_list.extend(getattr(m,'__all__',[]))
128 completion_list.extend(getattr(m,'__all__',[]))
129 if hasattr(m, '__file__') and '__init__' in m.__file__:
129 if hasattr(m, '__file__') and '__init__' in m.__file__:
130 completion_list.extend(moduleList(os.path.dirname(m.__file__)))
130 completion_list.extend(moduleList(os.path.dirname(m.__file__)))
131 completion_list = list(set(completion_list))
131 completion_list = list(set(completion_list))
132 if '__init__' in completion_list:
132 if '__init__' in completion_list:
133 completion_list.remove('__init__')
133 completion_list.remove('__init__')
134 return completion_list
134 return completion_list
135
135
136 words = line.split(' ')
136 words = line.split(' ')
137 if len(words) == 3 and words[0] == 'from':
137 if len(words) == 3 and words[0] == 'from':
138 return ['import ']
138 return ['import ']
139 if len(words) < 3 and (words[0] in ['import','from']) :
139 if len(words) < 3 and (words[0] in ['import','from']) :
140 if len(words) == 1:
140 if len(words) == 1:
141 return getRootModules()
141 return getRootModules()
142 mod = words[1].split('.')
142 mod = words[1].split('.')
143 if len(mod) < 2:
143 if len(mod) < 2:
144 return getRootModules()
144 return getRootModules()
145 completion_list = tryImport('.'.join(mod[:-1]), True)
145 completion_list = tryImport('.'.join(mod[:-1]), True)
146 completion_list = ['.'.join(mod[:-1] + [el]) for el in completion_list]
146 completion_list = ['.'.join(mod[:-1] + [el]) for el in completion_list]
147 return completion_list
147 return completion_list
148 if len(words) >= 3 and words[0] == 'from':
148 if len(words) >= 3 and words[0] == 'from':
149 mod = words[1]
149 mod = words[1]
150 return tryImport(mod)
150 return tryImport(mod)
151
151
152 def vcs_completer(commands, event):
152 def vcs_completer(commands, event):
153 """ utility to make writing typical version control app completers easier
153 """ utility to make writing typical version control app completers easier
154
154
155 VCS command line apps typically have the format:
155 VCS command line apps typically have the format:
156
156
157 [sudo ]PROGNAME [help] [command] file file...
157 [sudo ]PROGNAME [help] [command] file file...
158
158
159 """
159 """
160
160
161
161
162 cmd_param = event.line.split()
162 cmd_param = event.line.split()
163 if event.line.endswith(' '):
163 if event.line.endswith(' '):
164 cmd_param.append('')
164 cmd_param.append('')
165
165
166 if cmd_param[0] == 'sudo':
166 if cmd_param[0] == 'sudo':
167 cmd_param = cmd_param[1:]
167 cmd_param = cmd_param[1:]
168
168
169 if len(cmd_param) == 2 or 'help' in cmd_param:
169 if len(cmd_param) == 2 or 'help' in cmd_param:
170 return commands.split()
170 return commands.split()
171
171
172 return ip.IP.Completer.file_matches(event.symbol)
172 return ip.IP.Completer.file_matches(event.symbol)
173
173
174
174
175 pkg_cache = None
175 pkg_cache = None
176
176
177 def module_completer(self,event):
177 def module_completer(self,event):
178 """ Give completions after user has typed 'import ...' or 'from ...'"""
178 """ Give completions after user has typed 'import ...' or 'from ...'"""
179
179
180 # This works in all versions of python. While 2.5 has
180 # This works in all versions of python. While 2.5 has
181 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
181 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
182 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
182 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
183 # of possibly problematic side effects.
183 # of possibly problematic side effects.
184 # This search the folders in the sys.path for available modules.
184 # This search the folders in the sys.path for available modules.
185
185
186 return moduleCompletion(event.line)
186 return moduleCompletion(event.line)
187
187
188
188
189 svn_commands = """\
189 svn_commands = """\
190 add blame praise annotate ann cat checkout co cleanup commit ci copy
190 add blame praise annotate ann cat checkout co cleanup commit ci copy
191 cp delete del remove rm diff di export help ? h import info list ls
191 cp delete del remove rm diff di export help ? h import info list ls
192 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
192 lock log merge mkdir move mv rename ren propdel pdel pd propedit pedit
193 pe propget pget pg proplist plist pl propset pset ps resolved revert
193 pe propget pget pg proplist plist pl propset pset ps resolved revert
194 status stat st switch sw unlock update
194 status stat st switch sw unlock update
195 """
195 """
196
196
197 def svn_completer(self,event):
197 def svn_completer(self,event):
198 return vcs_completer(svn_commands, event)
198 return vcs_completer(svn_commands, event)
199
199
200
200
201 hg_commands = """
201 hg_commands = """
202 add addremove annotate archive backout branch branches bundle cat
202 add addremove annotate archive backout branch branches bundle cat
203 clone commit copy diff export grep heads help identify import incoming
203 clone commit copy diff export grep heads help identify import incoming
204 init locate log manifest merge outgoing parents paths pull push
204 init locate log manifest merge outgoing parents paths pull push
205 qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
205 qapplied qclone qcommit qdelete qdiff qfold qguard qheader qimport
206 qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
206 qinit qnew qnext qpop qprev qpush qrefresh qrename qrestore qsave
207 qselect qseries qtop qunapplied recover remove rename revert rollback
207 qselect qseries qtop qunapplied recover remove rename revert rollback
208 root serve showconfig status strip tag tags tip unbundle update verify
208 root serve showconfig status strip tag tags tip unbundle update verify
209 version
209 version
210 """
210 """
211
211
212 def hg_completer(self,event):
212 def hg_completer(self,event):
213 """ Completer for mercurial commands """
213 """ Completer for mercurial commands """
214
214
215 return vcs_completer(hg_commands, event)
215 return vcs_completer(hg_commands, event)
216
216
217
217
218
218
219 __bzr_commands = None
219 __bzr_commands = None
220
220
221 def bzr_commands():
221 def bzr_commands():
222 global __bzr_commands
222 global __bzr_commands
223 if __bzr_commands is not None:
223 if __bzr_commands is not None:
224 return __bzr_commands
224 return __bzr_commands
225 out = os.popen('bzr help commands')
225 out = os.popen('bzr help commands')
226 __bzr_commands = [l.split()[0] for l in out]
226 __bzr_commands = [l.split()[0] for l in out]
227 return __bzr_commands
227 return __bzr_commands
228
228
229 def bzr_completer(self,event):
229 def bzr_completer(self,event):
230 """ Completer for bazaar commands """
230 """ Completer for bazaar commands """
231 cmd_param = event.line.split()
231 cmd_param = event.line.split()
232 if event.line.endswith(' '):
232 if event.line.endswith(' '):
233 cmd_param.append('')
233 cmd_param.append('')
234
234
235 if len(cmd_param) > 2:
235 if len(cmd_param) > 2:
236 cmd = cmd_param[1]
236 cmd = cmd_param[1]
237 param = cmd_param[-1]
237 param = cmd_param[-1]
238 output_file = (param == '--output=')
238 output_file = (param == '--output=')
239 if cmd == 'help':
239 if cmd == 'help':
240 return bzr_commands()
240 return bzr_commands()
241 elif cmd in ['bundle-revisions','conflicts',
241 elif cmd in ['bundle-revisions','conflicts',
242 'deleted','nick','register-branch',
242 'deleted','nick','register-branch',
243 'serve','unbind','upgrade','version',
243 'serve','unbind','upgrade','version',
244 'whoami'] and not output_file:
244 'whoami'] and not output_file:
245 return []
245 return []
246 else:
246 else:
247 # the rest are probably file names
247 # the rest are probably file names
248 return ip.IP.Completer.file_matches(event.symbol)
248 return ip.IP.Completer.file_matches(event.symbol)
249
249
250 return bzr_commands()
250 return bzr_commands()
251
251
252
252
253 def shlex_split(x):
253 def shlex_split(x):
254 """Helper function to split lines into segments."""
254 """Helper function to split lines into segments."""
255 #shlex.split raise exception if syntax error in sh syntax
255 #shlex.split raise exception if syntax error in sh syntax
256 #for example if no closing " is found. This function keeps dropping
256 #for example if no closing " is found. This function keeps dropping
257 #the last character of the line until shlex.split does not raise
257 #the last character of the line until shlex.split does not raise
258 #exception. Adds end of the line to the result of shlex.split
258 #exception. Adds end of the line to the result of shlex.split
259 #example: %run "c:/python -> ['%run','"c:/python']
259 #example: %run "c:/python -> ['%run','"c:/python']
260 endofline=[]
260 endofline=[]
261 while x!="":
261 while x!="":
262 try:
262 try:
263 comps=shlex.split(x)
263 comps=shlex.split(x)
264 if len(endofline)>=1:
264 if len(endofline)>=1:
265 comps.append("".join(endofline))
265 comps.append("".join(endofline))
266 return comps
266 return comps
267 except ValueError:
267 except ValueError:
268 endofline=[x[-1:]]+endofline
268 endofline=[x[-1:]]+endofline
269 x=x[:-1]
269 x=x[:-1]
270 return ["".join(endofline)]
270 return ["".join(endofline)]
271
271
272 def runlistpy(self, event):
272 def runlistpy(self, event):
273 comps = shlex_split(event.line)
273 comps = shlex_split(event.line)
274 relpath = (len(comps) > 1 and comps[-1] or '').strip("'\"")
274 relpath = (len(comps) > 1 and comps[-1] or '').strip("'\"")
275
275
276 #print "\nev=",event # dbg
276 #print "\nev=",event # dbg
277 #print "rp=",relpath # dbg
277 #print "rp=",relpath # dbg
278 #print 'comps=',comps # dbg
278 #print 'comps=',comps # dbg
279
279
280 lglob = glob.glob
280 lglob = glob.glob
281 isdir = os.path.isdir
281 isdir = os.path.isdir
282 if relpath.startswith('~'):
282 if relpath.startswith('~'):
283 relpath = os.path.expanduser(relpath)
283 relpath = os.path.expanduser(relpath)
284 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
284 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*')
285 if isdir(f)]
285 if isdir(f)]
286
286
287 # Find if the user has already typed the first filename, after which we
287 # Find if the user has already typed the first filename, after which we
288 # should complete on all files, since after the first one other files may
288 # should complete on all files, since after the first one other files may
289 # be arguments to the input script.
289 # be arguments to the input script.
290 #filter(
290 #filter(
291 if filter(lambda f: f.endswith('.py') or f.endswith('.ipy') or
291 if filter(lambda f: f.endswith('.py') or f.endswith('.ipy') or
292 f.endswith('.pyw'),comps):
292 f.endswith('.pyw'),comps):
293 pys = [f.replace('\\','/') for f in lglob('*')]
293 pys = [f.replace('\\','/') for f in lglob('*')]
294 else:
294 else:
295 pys = [f.replace('\\','/')
295 pys = [f.replace('\\','/')
296 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
296 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
297 lglob(relpath + '*.pyw')]
297 lglob(relpath + '*.pyw')]
298 return dirs + pys
298 return dirs + pys
299
299
300
300
301 greedy_cd_completer = False
301 greedy_cd_completer = False
302
302
303 def cd_completer(self, event):
303 def cd_completer(self, event):
304 relpath = event.symbol
304 relpath = event.symbol
305 #print event # dbg
305 #print event # dbg
306 if '-b' in event.line:
306 if '-b' in event.line:
307 # return only bookmark completions
307 # return only bookmark completions
308 bkms = self.db.get('bookmarks',{})
308 bkms = self.db.get('bookmarks',{})
309 return bkms.keys()
309 return bkms.keys()
310
310
311
311
312 if event.symbol == '-':
312 if event.symbol == '-':
313 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
313 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
314 # jump in directory history by number
314 # jump in directory history by number
315 fmt = '-%0' + width_dh +'d [%s]'
315 fmt = '-%0' + width_dh +'d [%s]'
316 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
316 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
317 if len(ents) > 1:
317 if len(ents) > 1:
318 return ents
318 return ents
319 return []
319 return []
320
320
321 if event.symbol.startswith('--'):
321 if event.symbol.startswith('--'):
322 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
322 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
323
323
324 if relpath.startswith('~'):
324 if relpath.startswith('~'):
325 relpath = os.path.expanduser(relpath).replace('\\','/')
325 relpath = os.path.expanduser(relpath).replace('\\','/')
326 found = []
326 found = []
327 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
327 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
328 if os.path.isdir(f)]:
328 if os.path.isdir(f)]:
329 if ' ' in d:
329 if ' ' in d:
330 # we don't want to deal with any of that, complex code
330 # we don't want to deal with any of that, complex code
331 # for this is elsewhere
331 # for this is elsewhere
332 raise IPython.ipapi.TryNext
332 raise IPython.ipapi.TryNext
333 found.append( d )
333 found.append( d )
334
334
335 if not found:
335 if not found:
336 if os.path.isdir(relpath):
336 if os.path.isdir(relpath):
337 return [relpath]
337 return [relpath]
338 # if no completions so far, try bookmarks
339 bks = self.db.get('bookmarks',{}).keys()
340 bkmatches = [s for s in bks if s.startswith(event.symbol)]
341 if bkmatches:
342 return bkmatches
343
338 raise IPython.ipapi.TryNext
344 raise IPython.ipapi.TryNext
339
345
340
346
341 def single_dir_expand(matches):
347 def single_dir_expand(matches):
342 "Recursively expand match lists containing a single dir."
348 "Recursively expand match lists containing a single dir."
343
349
344 if len(matches) == 1 and os.path.isdir(matches[0]):
350 if len(matches) == 1 and os.path.isdir(matches[0]):
345 # Takes care of links to directories also. Use '/'
351 # Takes care of links to directories also. Use '/'
346 # explicitly, even under Windows, so that name completions
352 # explicitly, even under Windows, so that name completions
347 # don't end up escaped.
353 # don't end up escaped.
348 d = matches[0]
354 d = matches[0]
349 if d[-1] in ['/','\\']:
355 if d[-1] in ['/','\\']:
350 d = d[:-1]
356 d = d[:-1]
351
357
352 subdirs = [p for p in os.listdir(d) if os.path.isdir( d + '/' + p) and not p.startswith('.')]
358 subdirs = [p for p in os.listdir(d) if os.path.isdir( d + '/' + p) and not p.startswith('.')]
353 if subdirs:
359 if subdirs:
354 matches = [ (d + '/' + p) for p in subdirs ]
360 matches = [ (d + '/' + p) for p in subdirs ]
355 return single_dir_expand(matches)
361 return single_dir_expand(matches)
356 else:
362 else:
357 return matches
363 return matches
358 else:
364 else:
359 return matches
365 return matches
360
366
361 if greedy_cd_completer:
367 if greedy_cd_completer:
362 return single_dir_expand(found)
368 return single_dir_expand(found)
363 else:
369 else:
364 return found
370 return found
365
371
366 def apt_get_packages(prefix):
372 def apt_get_packages(prefix):
367 out = os.popen('apt-cache pkgnames')
373 out = os.popen('apt-cache pkgnames')
368 for p in out:
374 for p in out:
369 if p.startswith(prefix):
375 if p.startswith(prefix):
370 yield p.rstrip()
376 yield p.rstrip()
371
377
372
378
373 apt_commands = """\
379 apt_commands = """\
374 update upgrade install remove purge source build-dep dist-upgrade
380 update upgrade install remove purge source build-dep dist-upgrade
375 dselect-upgrade clean autoclean check"""
381 dselect-upgrade clean autoclean check"""
376
382
377 def apt_completer(self, event):
383 def apt_completer(self, event):
378 """ Completer for apt-get (uses apt-cache internally)
384 """ Completer for apt-get (uses apt-cache internally)
379
385
380 """
386 """
381
387
382
388
383 cmd_param = event.line.split()
389 cmd_param = event.line.split()
384 if event.line.endswith(' '):
390 if event.line.endswith(' '):
385 cmd_param.append('')
391 cmd_param.append('')
386
392
387 if cmd_param[0] == 'sudo':
393 if cmd_param[0] == 'sudo':
388 cmd_param = cmd_param[1:]
394 cmd_param = cmd_param[1:]
389
395
390 if len(cmd_param) == 2 or 'help' in cmd_param:
396 if len(cmd_param) == 2 or 'help' in cmd_param:
391 return apt_commands.split()
397 return apt_commands.split()
392
398
393 return list(apt_get_packages(event.symbol))
399 return list(apt_get_packages(event.symbol))
394
400
@@ -1,84 +1,88 b''
1 """ 'editor' hooks for common editors that work well with ipython
1 """ 'editor' hooks for common editors that work well with ipython
2
2
3 They should honor the line number argument, at least.
3 They should honor the line number argument, at least.
4
4
5 Contributions are *very* welcome.
5 Contributions are *very* welcome.
6 """
6 """
7
7
8 import IPython.ipapi
8 import IPython.ipapi
9 ip = IPython.ipapi.get()
9 ip = IPython.ipapi.get()
10
10
11 from IPython.Itpl import itplns
11 from IPython.Itpl import itplns
12 import os
12 import os
13
13
14 def install_editor(run_template, wait = False):
14 def install_editor(run_template, wait = False):
15 """ Gets a template in format "myeditor bah bah $file bah bah $line"
15 """ Gets a template in format "myeditor bah bah $file bah bah $line"
16
16
17 $file will be replaced by file name, $line by line number (or 0).
17 $file will be replaced by file name, $line by line number (or 0).
18 Installs the editor that is called by IPython, instead of the default
18 Installs the editor that is called by IPython, instead of the default
19 notepad or vi.
19 notepad or vi.
20
20
21 If wait is true, wait until the user presses enter before returning,
21 If wait is true, wait until the user presses enter before returning,
22 to facilitate non-blocking editors that exit immediately after
22 to facilitate non-blocking editors that exit immediately after
23 the call.
23 the call.
24 """
24 """
25
25
26 def call_editor(self, file, line=0):
26 def call_editor(self, file, line=0):
27 if line is None:
27 if line is None:
28 line = 0
28 line = 0
29 cmd = itplns(run_template, locals())
29 cmd = itplns(run_template, locals())
30 print ">",cmd
30 print ">",cmd
31 os.system(cmd)
31 if os.system(cmd) != 0:
32 raise IPython.ipapi.TryNext()
32 if wait:
33 if wait:
33 raw_input("Press Enter when done editing:")
34 raw_input("Press Enter when done editing:")
34
35
35 ip.set_hook('editor',call_editor)
36 ip.set_hook('editor',call_editor)
36
37
37
38
38 # in these, exe is always the path/name of the executable. Useful
39 # in these, exe is always the path/name of the executable. Useful
39 # if you don't have the editor directory in your path
40 # if you don't have the editor directory in your path
40
41
41 def komodo(exe = 'komodo'):
42 def komodo(exe = 'komodo'):
42 """ Activestate Komodo [Edit] """
43 """ Activestate Komodo [Edit] """
43 install_editor(exe + ' -l $line "$file"', wait = True)
44 install_editor(exe + ' -l $line "$file"', wait = True)
44
45
45 def scite(exe = "scite"):
46 def scite(exe = "scite"):
46 """ SciTE or Sc1 """
47 """ SciTE or Sc1 """
47 install_editor(exe + ' "$file" -goto:$line')
48 install_editor(exe + ' "$file" -goto:$line')
48
49
49 def notepadplusplus(exe = 'notepad++'):
50 def notepadplusplus(exe = 'notepad++'):
50 """ Notepad++ http://notepad-plus.sourceforge.net """
51 """ Notepad++ http://notepad-plus.sourceforge.net """
51 install_editor(exe + ' -n$line "$file"')
52 install_editor(exe + ' -n$line "$file"')
52
53
53 def jed(exe = 'jed'):
54 def jed(exe = 'jed'):
54 """ JED, the lightweight emacsish editor """
55 """ JED, the lightweight emacsish editor """
55 install_editor(exe + ' +$line "$file"')
56 install_editor(exe + ' +$line "$file"')
56
57
57 def idle(exe = None):
58 def idle(exe = None):
58 """ Idle, the editor bundled with python
59 """ Idle, the editor bundled with python
59
60
60 Should be pretty smart about finding the executable.
61 Should be pretty smart about finding the executable.
61 """
62 """
62 if exe is None:
63 if exe is None:
63 import idlelib
64 import idlelib
64 p = os.path.dirname(idlelib.__file__)
65 p = os.path.dirname(idlelib.__file__)
65 exe = p + '/idle.py'
66 exe = p + '/idle.py'
66 install_editor(exe + ' "$file"')
67 install_editor(exe + ' "$file"')
67
68
69 def mate(exe = 'mate'):
70 """ TextMate, the missing editor"""
71 install_editor(exe + ' -w -l $line "$file"')
68
72
69 # these are untested, report any problems
73 # these are untested, report any problems
70
74
71 def emacs(exe = 'emacs'):
75 def emacs(exe = 'emacs'):
72 install_editor(exe + ' +$line "$file"')
76 install_editor(exe + ' +$line "$file"')
73
77
74 def gnuclient(exe= 'gnuclient'):
78 def gnuclient(exe= 'gnuclient'):
75 install_editor(exe + ' -nw +$line "$file"')
79 install_editor(exe + ' -nw +$line "$file"')
76
80
77 def crimson_editor(exe = 'cedt.exe'):
81 def crimson_editor(exe = 'cedt.exe'):
78 install_editor(exe + ' /L:$line "$file"')
82 install_editor(exe + ' /L:$line "$file"')
79
83
80 def kate(exe = 'kate'):
84 def kate(exe = 'kate'):
81 install_editor(exe + ' -u -l $line "$file"')
85 install_editor(exe + ' -u -l $line "$file"')
82
86
83
87
84 No newline at end of file
88
@@ -1,258 +1,270 b''
1 """Shell mode for IPython.
1 """Shell mode for IPython.
2
2
3 Start ipython in shell mode by invoking "ipython -p sh"
3 Start ipython in shell mode by invoking "ipython -p sh"
4
4
5 (the old version, "ipython -p pysh" still works but this is the more "modern"
5 (the old version, "ipython -p pysh" still works but this is the more "modern"
6 shell mode and is recommended for users who don't care about pysh-mode
6 shell mode and is recommended for users who don't care about pysh-mode
7 compatibility)
7 compatibility)
8 """
8 """
9
9
10 from IPython import ipapi
10 from IPython import ipapi
11 import os,textwrap
11 import os,re,textwrap
12
12
13 # The import below effectively obsoletes your old-style ipythonrc[.ini],
13 # The import below effectively obsoletes your old-style ipythonrc[.ini],
14 # so consider yourself warned!
14 # so consider yourself warned!
15
15
16 import ipy_defaults
16 import ipy_defaults
17
17
18 def main():
18 def main():
19 ip = ipapi.get()
19 ip = ipapi.get()
20 o = ip.options
20 o = ip.options
21 # autocall to "full" mode (smart mode is default, I like full mode)
21 # autocall to "full" mode (smart mode is default, I like full mode)
22
22
23 o.autocall = 2
23 o.autocall = 2
24
24
25 # Jason Orendorff's path class is handy to have in user namespace
25 # Jason Orendorff's path class is handy to have in user namespace
26 # if you are doing shell-like stuff
26 # if you are doing shell-like stuff
27 try:
27 try:
28 ip.ex("from IPython.external.path import path" )
28 ip.ex("from IPython.external.path import path" )
29 except ImportError:
29 except ImportError:
30 pass
30 pass
31
31
32 # beefed up %env is handy in shell mode
32 # beefed up %env is handy in shell mode
33 import envpersist
33 import envpersist
34
34
35 # To see where mycmd resides (in path/aliases), do %which mycmd
35 # To see where mycmd resides (in path/aliases), do %which mycmd
36 import ipy_which
36 import ipy_which
37
37
38 # tab completers for hg, svn, ...
38 # tab completers for hg, svn, ...
39 import ipy_app_completers
39 import ipy_app_completers
40
40
41 # To make executables foo and bar in mybin usable without PATH change, do:
41 # To make executables foo and bar in mybin usable without PATH change, do:
42 # %rehashdir c:/mybin
42 # %rehashdir c:/mybin
43 # %store foo
43 # %store foo
44 # %store bar
44 # %store bar
45 import ipy_rehashdir
45 import ipy_rehashdir
46
46
47 # does not work without subprocess module!
47 # does not work without subprocess module!
48 #import ipy_signals
48 #import ipy_signals
49
49
50 ip.ex('import os')
50 ip.ex('import os')
51 ip.ex("def up(): os.chdir('..')")
51 ip.ex("def up(): os.chdir('..')")
52 ip.user_ns['LA'] = LastArgFinder()
52 ip.user_ns['LA'] = LastArgFinder()
53 # Nice prompt
54
53
55 o.prompt_in1= r'\C_LightBlue[\C_LightCyan\Y2\C_LightBlue]\C_Green|\#> '
54 # You can assign to _prompt_title variable
55 # to provide some extra information for prompt
56 # (e.g. the current mode, host/username...)
57
58 ip.user_ns['_prompt_title'] = ''
59
60 # Nice prompt
61 o.prompt_in1= r'\C_Green${_prompt_title}\C_LightBlue[\C_LightCyan\Y2\C_LightBlue]\C_Green|\#> '
56 o.prompt_in2= r'\C_Green|\C_LightGreen\D\C_Green> '
62 o.prompt_in2= r'\C_Green|\C_LightGreen\D\C_Green> '
57 o.prompt_out= '<\#> '
63 o.prompt_out= '<\#> '
58
64
59 from IPython import Release
65 from IPython import Release
60
66
61 import sys
67 import sys
62 # Non-chatty banner
68 # Non-chatty banner
63 o.banner = "IPython %s [on Py %s]\n" % (Release.version,sys.version.split(None,1)[0])
69 o.banner = "IPython %s [on Py %s]\n" % (Release.version,sys.version.split(None,1)[0])
64
70
65
71
66 ip.IP.default_option('cd','-q')
72 ip.IP.default_option('cd','-q')
67 ip.IP.default_option('macro', '-r')
73 ip.IP.default_option('macro', '-r')
68 # If you only rarely want to execute the things you %edit...
74 # If you only rarely want to execute the things you %edit...
69 #ip.IP.default_option('edit','-x')
75 #ip.IP.default_option('edit','-x')
70
76
71
77
72 o.prompts_pad_left="1"
78 o.prompts_pad_left="1"
73 # Remove all blank lines in between prompts, like a normal shell.
79 # Remove all blank lines in between prompts, like a normal shell.
74 o.separate_in="0"
80 o.separate_in="0"
75 o.separate_out="0"
81 o.separate_out="0"
76 o.separate_out2="0"
82 o.separate_out2="0"
77
83
78 # now alias all syscommands
84 # now alias all syscommands
79
85
80 db = ip.db
86 db = ip.db
81
87
82 syscmds = db.get("syscmdlist",[] )
88 syscmds = db.get("syscmdlist",[] )
83 if not syscmds:
89 if not syscmds:
84 print textwrap.dedent("""
90 print textwrap.dedent("""
85 System command list not initialized, probably the first run...
91 System command list not initialized, probably the first run...
86 running %rehashx to refresh the command list. Run %rehashx
92 running %rehashx to refresh the command list. Run %rehashx
87 again to refresh command list (after installing new software etc.)
93 again to refresh command list (after installing new software etc.)
88 """)
94 """)
89 ip.magic('rehashx')
95 ip.magic('rehashx')
90 syscmds = db.get("syscmdlist")
96 syscmds = db.get("syscmdlist")
91
97
92 # lowcase aliases on win32 only
98 # lowcase aliases on win32 only
93 if os.name == 'posix':
99 if os.name == 'posix':
94 mapper = lambda s:s
100 mapper = lambda s:s
95 else:
101 else:
96 def mapper(s): return s.lower()
102 def mapper(s): return s.lower()
97
103
98 for cmd in syscmds:
104 for cmd in syscmds:
99 # print "sys",cmd #dbg
105 # print "sys",cmd #dbg
100 noext, ext = os.path.splitext(cmd)
106 noext, ext = os.path.splitext(cmd)
101 key = mapper(noext)
107 if ext.lower() == '.exe':
108 cmd = noext
109
110 key = mapper(cmd)
102 if key not in ip.IP.alias_table:
111 if key not in ip.IP.alias_table:
103 ip.defalias(key, cmd)
112 # Dots will be removed from alias names, since ipython
113 # assumes names with dots to be python code
114
115 ip.defalias(key.replace('.',''), cmd)
104
116
105 # mglob combines 'find', recursion, exclusion... '%mglob?' to learn more
117 # mglob combines 'find', recursion, exclusion... '%mglob?' to learn more
106 ip.load("IPython.external.mglob")
118 ip.load("IPython.external.mglob")
107
119
108 # win32 is crippled w/o cygwin, try to help it a little bit
120 # win32 is crippled w/o cygwin, try to help it a little bit
109 if sys.platform == 'win32':
121 if sys.platform == 'win32':
110 if 'cygwin' in os.environ['PATH'].lower():
122 if 'cygwin' in os.environ['PATH'].lower():
111 # use the colors of cygwin ls (recommended)
123 # use the colors of cygwin ls (recommended)
112 ip.defalias('d', 'ls -F --color=auto')
124 ip.defalias('d', 'ls -F --color=auto')
113 else:
125 else:
114 # get icp, imv, imkdir, igrep, irm,...
126 # get icp, imv, imkdir, igrep, irm,...
115 ip.load('ipy_fsops')
127 ip.load('ipy_fsops')
116
128
117 # and the next best thing to real 'ls -F'
129 # and the next best thing to real 'ls -F'
118 ip.defalias('d','dir /w /og /on')
130 ip.defalias('d','dir /w /og /on')
119
131
120 ip.set_hook('input_prefilter', dotslash_prefilter_f)
132 ip.set_hook('input_prefilter', slash_prefilter_f)
121 extend_shell_behavior(ip)
133 extend_shell_behavior(ip)
122
134
123 class LastArgFinder:
135 class LastArgFinder:
124 """ Allow $LA to work as "last argument of previous command", like $! in bash
136 """ Allow $LA to work as "last argument of previous command", like $! in bash
125
137
126 To call this in normal IPython code, do LA()
138 To call this in normal IPython code, do LA()
127 """
139 """
128 def __call__(self, hist_idx = None):
140 def __call__(self, hist_idx = None):
129 ip = ipapi.get()
141 ip = ipapi.get()
130 if hist_idx is None:
142 if hist_idx is None:
131 return str(self)
143 return str(self)
132 return ip.IP.input_hist_raw[hist_idx].strip().split()[-1]
144 return ip.IP.input_hist_raw[hist_idx].strip().split()[-1]
133 def __str__(self):
145 def __str__(self):
134 ip = ipapi.get()
146 ip = ipapi.get()
135 for cmd in reversed(ip.IP.input_hist_raw):
147 for cmd in reversed(ip.IP.input_hist_raw):
136 parts = cmd.strip().split()
148 parts = cmd.strip().split()
137 if len(parts) < 2 or parts[-1] in ['$LA', 'LA()']:
149 if len(parts) < 2 or parts[-1] in ['$LA', 'LA()']:
138 continue
150 continue
139 return parts[-1]
151 return parts[-1]
140 return ""
152 return ""
141
153
142 def dotslash_prefilter_f(self,line):
154 def slash_prefilter_f(self,line):
143 """ ./foo now runs foo as system command
155 """ ./foo, ~/foo and /bin/foo now run foo as system command
144
156
145 Removes the need for doing !./foo
157 Removes the need for doing !./foo, !~/foo or !/bin/foo
146 """
158 """
147 import IPython.genutils
159 import IPython.genutils
148 if line.startswith("./"):
160 if re.match('(?:[.~]|/[a-zA-Z_0-9]+)/', line):
149 return "_ip.system(" + IPython.genutils.make_quoted_expr(line)+")"
161 return "_ip.system(" + IPython.genutils.make_quoted_expr(line)+")"
150 raise ipapi.TryNext
162 raise ipapi.TryNext
151
163
152 # XXX You do not need to understand the next function!
164 # XXX You do not need to understand the next function!
153 # This should probably be moved out of profile
165 # This should probably be moved out of profile
154
166
155 def extend_shell_behavior(ip):
167 def extend_shell_behavior(ip):
156
168
157 # Instead of making signature a global variable tie it to IPSHELL.
169 # Instead of making signature a global variable tie it to IPSHELL.
158 # In future if it is required to distinguish between different
170 # In future if it is required to distinguish between different
159 # shells we can assign a signature per shell basis
171 # shells we can assign a signature per shell basis
160 ip.IP.__sig__ = 0xa005
172 ip.IP.__sig__ = 0xa005
161 # mark the IPSHELL with this signature
173 # mark the IPSHELL with this signature
162 ip.IP.user_ns['__builtins__'].__dict__['__sig__'] = ip.IP.__sig__
174 ip.IP.user_ns['__builtins__'].__dict__['__sig__'] = ip.IP.__sig__
163
175
164 from IPython.Itpl import ItplNS
176 from IPython.Itpl import ItplNS
165 from IPython.genutils import shell
177 from IPython.genutils import shell
166 # utility to expand user variables via Itpl
178 # utility to expand user variables via Itpl
167 # xxx do something sensible with depth?
179 # xxx do something sensible with depth?
168 ip.IP.var_expand = lambda cmd, lvars=None, depth=2: \
180 ip.IP.var_expand = lambda cmd, lvars=None, depth=2: \
169 str(ItplNS(cmd, ip.IP.user_ns, get_locals()))
181 str(ItplNS(cmd, ip.IP.user_ns, get_locals()))
170
182
171 def get_locals():
183 def get_locals():
172 """ Substituting a variable through Itpl deep inside the IPSHELL stack
184 """ Substituting a variable through Itpl deep inside the IPSHELL stack
173 requires the knowledge of all the variables in scope upto the last
185 requires the knowledge of all the variables in scope upto the last
174 IPSHELL frame. This routine simply merges all the local variables
186 IPSHELL frame. This routine simply merges all the local variables
175 on the IPSHELL stack without worrying about their scope rules
187 on the IPSHELL stack without worrying about their scope rules
176 """
188 """
177 import sys
189 import sys
178 # note lambda expression constitues a function call
190 # note lambda expression constitues a function call
179 # hence fno should be incremented by one
191 # hence fno should be incremented by one
180 getsig = lambda fno: sys._getframe(fno+1).f_globals \
192 getsig = lambda fno: sys._getframe(fno+1).f_globals \
181 ['__builtins__'].__dict__['__sig__']
193 ['__builtins__'].__dict__['__sig__']
182 getlvars = lambda fno: sys._getframe(fno+1).f_locals
194 getlvars = lambda fno: sys._getframe(fno+1).f_locals
183 # trackback until we enter the IPSHELL
195 # trackback until we enter the IPSHELL
184 frame_no = 1
196 frame_no = 1
185 sig = ip.IP.__sig__
197 sig = ip.IP.__sig__
186 fsig = ~sig
198 fsig = ~sig
187 while fsig != sig :
199 while fsig != sig :
188 try:
200 try:
189 fsig = getsig(frame_no)
201 fsig = getsig(frame_no)
190 except (AttributeError, KeyError):
202 except (AttributeError, KeyError):
191 frame_no += 1
203 frame_no += 1
192 except ValueError:
204 except ValueError:
193 # stack is depleted
205 # stack is depleted
194 # call did not originate from IPSHELL
206 # call did not originate from IPSHELL
195 return {}
207 return {}
196 first_frame = frame_no
208 first_frame = frame_no
197 # walk further back until we exit from IPSHELL or deplete stack
209 # walk further back until we exit from IPSHELL or deplete stack
198 try:
210 try:
199 while(sig == getsig(frame_no+1)):
211 while(sig == getsig(frame_no+1)):
200 frame_no += 1
212 frame_no += 1
201 except (AttributeError, KeyError, ValueError):
213 except (AttributeError, KeyError, ValueError):
202 pass
214 pass
203 # merge the locals from top down hence overriding
215 # merge the locals from top down hence overriding
204 # any re-definitions of variables, functions etc.
216 # any re-definitions of variables, functions etc.
205 lvars = {}
217 lvars = {}
206 for fno in range(frame_no, first_frame-1, -1):
218 for fno in range(frame_no, first_frame-1, -1):
207 lvars.update(getlvars(fno))
219 lvars.update(getlvars(fno))
208 #print '\n'*5, first_frame, frame_no, '\n', lvars, '\n'*5 #dbg
220 #print '\n'*5, first_frame, frame_no, '\n', lvars, '\n'*5 #dbg
209 return lvars
221 return lvars
210
222
211 def _runlines(lines):
223 def _runlines(lines):
212 """Run a string of one or more lines of source.
224 """Run a string of one or more lines of source.
213
225
214 This method is capable of running a string containing multiple source
226 This method is capable of running a string containing multiple source
215 lines, as if they had been entered at the IPython prompt. Since it
227 lines, as if they had been entered at the IPython prompt. Since it
216 exposes IPython's processing machinery, the given strings can contain
228 exposes IPython's processing machinery, the given strings can contain
217 magic calls (%magic), special shell access (!cmd), etc."""
229 magic calls (%magic), special shell access (!cmd), etc."""
218
230
219 # We must start with a clean buffer, in case this is run from an
231 # We must start with a clean buffer, in case this is run from an
220 # interactive IPython session (via a magic, for example).
232 # interactive IPython session (via a magic, for example).
221 ip.IP.resetbuffer()
233 ip.IP.resetbuffer()
222 lines = lines.split('\n')
234 lines = lines.split('\n')
223 more = 0
235 more = 0
224 command = ''
236 command = ''
225 for line in lines:
237 for line in lines:
226 # skip blank lines so we don't mess up the prompt counter, but do
238 # skip blank lines so we don't mess up the prompt counter, but do
227 # NOT skip even a blank line if we are in a code block (more is
239 # NOT skip even a blank line if we are in a code block (more is
228 # true)
240 # true)
229 # if command is not empty trim the line
241 # if command is not empty trim the line
230 if command != '' :
242 if command != '' :
231 line = line.strip()
243 line = line.strip()
232 # add the broken line to the command
244 # add the broken line to the command
233 if line and line[-1] == '\\' :
245 if line and line[-1] == '\\' :
234 command += line[0:-1] + ' '
246 command += line[0:-1] + ' '
235 more = True
247 more = True
236 continue
248 continue
237 else :
249 else :
238 # add the last (current) line to the command
250 # add the last (current) line to the command
239 command += line
251 command += line
240 if command or more:
252 if command or more:
241 # push to raw history, so hist line numbers stay in sync
253 # push to raw history, so hist line numbers stay in sync
242 ip.IP.input_hist_raw.append("# " + command + "\n")
254 ip.IP.input_hist_raw.append("# " + command + "\n")
243
255
244 more = ip.IP.push(ip.IP.prefilter(command,more))
256 more = ip.IP.push(ip.IP.prefilter(command,more))
245 command = ''
257 command = ''
246 # IPython's runsource returns None if there was an error
258 # IPython's runsource returns None if there was an error
247 # compiling the code. This allows us to stop processing right
259 # compiling the code. This allows us to stop processing right
248 # away, so the user gets the error message at the right place.
260 # away, so the user gets the error message at the right place.
249 if more is None:
261 if more is None:
250 break
262 break
251 # final newline in case the input didn't have it, so that the code
263 # final newline in case the input didn't have it, so that the code
252 # actually does get executed
264 # actually does get executed
253 if more:
265 if more:
254 ip.IP.push('\n')
266 ip.IP.push('\n')
255
267
256 ip.IP.runlines = _runlines
268 ip.IP.runlines = _runlines
257
269
258 main()
270 main()
@@ -1,3377 +1,3405 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3
3
4 $Id: Magic.py 2996 2008-01-30 06:31:39Z fperez $"""
4 $Id: Magic.py 2996 2008-01-30 06:31:39Z fperez $"""
5
5
6 #*****************************************************************************
6 #*****************************************************************************
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
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 # Modules and globals
15 # Modules and globals
16
16
17 from IPython import Release
17 from IPython import Release
18 __author__ = '%s <%s>\n%s <%s>' % \
18 __author__ = '%s <%s>\n%s <%s>' % \
19 ( Release.authors['Janko'] + Release.authors['Fernando'] )
19 ( Release.authors['Janko'] + Release.authors['Fernando'] )
20 __license__ = Release.license
20 __license__ = Release.license
21
21
22 # Python standard modules
22 # Python standard modules
23 import __builtin__
23 import __builtin__
24 import bdb
24 import bdb
25 import inspect
25 import inspect
26 import os
26 import os
27 import pdb
27 import pdb
28 import pydoc
28 import pydoc
29 import sys
29 import sys
30 import re
30 import re
31 import tempfile
31 import tempfile
32 import time
32 import time
33 import cPickle as pickle
33 import cPickle as pickle
34 import textwrap
34 import textwrap
35 from cStringIO import StringIO
35 from cStringIO import StringIO
36 from getopt import getopt,GetoptError
36 from getopt import getopt,GetoptError
37 from pprint import pprint, pformat
37 from pprint import pprint, pformat
38 from sets import Set
38 from sets import Set
39
39
40 # cProfile was added in Python2.5
40 # cProfile was added in Python2.5
41 try:
41 try:
42 import cProfile as profile
42 import cProfile as profile
43 import pstats
43 import pstats
44 except ImportError:
44 except ImportError:
45 # profile isn't bundled by default in Debian for license reasons
45 # profile isn't bundled by default in Debian for license reasons
46 try:
46 try:
47 import profile,pstats
47 import profile,pstats
48 except ImportError:
48 except ImportError:
49 profile = pstats = None
49 profile = pstats = None
50
50
51 # Homebrewed
51 # Homebrewed
52 import IPython
52 import IPython
53 from IPython import Debugger, OInspect, wildcard
53 from IPython import Debugger, OInspect, wildcard
54 from IPython.FakeModule import FakeModule
54 from IPython.FakeModule import FakeModule
55 from IPython.Itpl import Itpl, itpl, printpl,itplns
55 from IPython.Itpl import Itpl, itpl, printpl,itplns
56 from IPython.PyColorize import Parser
56 from IPython.PyColorize import Parser
57 from IPython.ipstruct import Struct
57 from IPython.ipstruct import Struct
58 from IPython.macro import Macro
58 from IPython.macro import Macro
59 from IPython.genutils import *
59 from IPython.genutils import *
60 from IPython import platutils
60 from IPython import platutils
61 import IPython.generics
61 import IPython.generics
62 import IPython.ipapi
62 import IPython.ipapi
63 from IPython.ipapi import UsageError
63 from IPython.ipapi import UsageError
64 from IPython.testing import decorators as testdec
64 from IPython.testing import decorators as testdec
65
65
66 #***************************************************************************
66 #***************************************************************************
67 # Utility functions
67 # Utility functions
68 def on_off(tag):
68 def on_off(tag):
69 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
69 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
70 return ['OFF','ON'][tag]
70 return ['OFF','ON'][tag]
71
71
72 class Bunch: pass
72 class Bunch: pass
73
73
74 def compress_dhist(dh):
74 def compress_dhist(dh):
75 head, tail = dh[:-10], dh[-10:]
75 head, tail = dh[:-10], dh[-10:]
76
76
77 newhead = []
77 newhead = []
78 done = Set()
78 done = Set()
79 for h in head:
79 for h in head:
80 if h in done:
80 if h in done:
81 continue
81 continue
82 newhead.append(h)
82 newhead.append(h)
83 done.add(h)
83 done.add(h)
84
84
85 return newhead + tail
85 return newhead + tail
86
86
87
87
88 #***************************************************************************
88 #***************************************************************************
89 # Main class implementing Magic functionality
89 # Main class implementing Magic functionality
90 class Magic:
90 class Magic:
91 """Magic functions for InteractiveShell.
91 """Magic functions for InteractiveShell.
92
92
93 Shell functions which can be reached as %function_name. All magic
93 Shell functions which can be reached as %function_name. All magic
94 functions should accept a string, which they can parse for their own
94 functions should accept a string, which they can parse for their own
95 needs. This can make some functions easier to type, eg `%cd ../`
95 needs. This can make some functions easier to type, eg `%cd ../`
96 vs. `%cd("../")`
96 vs. `%cd("../")`
97
97
98 ALL definitions MUST begin with the prefix magic_. The user won't need it
98 ALL definitions MUST begin with the prefix magic_. The user won't need it
99 at the command line, but it is is needed in the definition. """
99 at the command line, but it is is needed in the definition. """
100
100
101 # class globals
101 # class globals
102 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
102 auto_status = ['Automagic is OFF, % prefix IS needed for magic functions.',
103 'Automagic is ON, % prefix NOT needed for magic functions.']
103 'Automagic is ON, % prefix NOT needed for magic functions.']
104
104
105 #......................................................................
105 #......................................................................
106 # some utility functions
106 # some utility functions
107
107
108 def __init__(self,shell):
108 def __init__(self,shell):
109
109
110 self.options_table = {}
110 self.options_table = {}
111 if profile is None:
111 if profile is None:
112 self.magic_prun = self.profile_missing_notice
112 self.magic_prun = self.profile_missing_notice
113 self.shell = shell
113 self.shell = shell
114
114
115 # namespace for holding state we may need
115 # namespace for holding state we may need
116 self._magic_state = Bunch()
116 self._magic_state = Bunch()
117
117
118 def profile_missing_notice(self, *args, **kwargs):
118 def profile_missing_notice(self, *args, **kwargs):
119 error("""\
119 error("""\
120 The profile module could not be found. It has been removed from the standard
120 The profile module could not be found. It has been removed from the standard
121 python packages because of its non-free license. To use profiling, install the
121 python packages because of its non-free license. To use profiling, install the
122 python-profiler package from non-free.""")
122 python-profiler package from non-free.""")
123
123
124 def default_option(self,fn,optstr):
124 def default_option(self,fn,optstr):
125 """Make an entry in the options_table for fn, with value optstr"""
125 """Make an entry in the options_table for fn, with value optstr"""
126
126
127 if fn not in self.lsmagic():
127 if fn not in self.lsmagic():
128 error("%s is not a magic function" % fn)
128 error("%s is not a magic function" % fn)
129 self.options_table[fn] = optstr
129 self.options_table[fn] = optstr
130
130
131 def lsmagic(self):
131 def lsmagic(self):
132 """Return a list of currently available magic functions.
132 """Return a list of currently available magic functions.
133
133
134 Gives a list of the bare names after mangling (['ls','cd', ...], not
134 Gives a list of the bare names after mangling (['ls','cd', ...], not
135 ['magic_ls','magic_cd',...]"""
135 ['magic_ls','magic_cd',...]"""
136
136
137 # FIXME. This needs a cleanup, in the way the magics list is built.
137 # FIXME. This needs a cleanup, in the way the magics list is built.
138
138
139 # magics in class definition
139 # magics in class definition
140 class_magic = lambda fn: fn.startswith('magic_') and \
140 class_magic = lambda fn: fn.startswith('magic_') and \
141 callable(Magic.__dict__[fn])
141 callable(Magic.__dict__[fn])
142 # in instance namespace (run-time user additions)
142 # in instance namespace (run-time user additions)
143 inst_magic = lambda fn: fn.startswith('magic_') and \
143 inst_magic = lambda fn: fn.startswith('magic_') and \
144 callable(self.__dict__[fn])
144 callable(self.__dict__[fn])
145 # and bound magics by user (so they can access self):
145 # and bound magics by user (so they can access self):
146 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
146 inst_bound_magic = lambda fn: fn.startswith('magic_') and \
147 callable(self.__class__.__dict__[fn])
147 callable(self.__class__.__dict__[fn])
148 magics = filter(class_magic,Magic.__dict__.keys()) + \
148 magics = filter(class_magic,Magic.__dict__.keys()) + \
149 filter(inst_magic,self.__dict__.keys()) + \
149 filter(inst_magic,self.__dict__.keys()) + \
150 filter(inst_bound_magic,self.__class__.__dict__.keys())
150 filter(inst_bound_magic,self.__class__.__dict__.keys())
151 out = []
151 out = []
152 for fn in Set(magics):
152 for fn in Set(magics):
153 out.append(fn.replace('magic_','',1))
153 out.append(fn.replace('magic_','',1))
154 out.sort()
154 out.sort()
155 return out
155 return out
156
156
157 def extract_input_slices(self,slices,raw=False):
157 def extract_input_slices(self,slices,raw=False):
158 """Return as a string a set of input history slices.
158 """Return as a string a set of input history slices.
159
159
160 Inputs:
160 Inputs:
161
161
162 - slices: the set of slices is given as a list of strings (like
162 - slices: the set of slices is given as a list of strings (like
163 ['1','4:8','9'], since this function is for use by magic functions
163 ['1','4:8','9'], since this function is for use by magic functions
164 which get their arguments as strings.
164 which get their arguments as strings.
165
165
166 Optional inputs:
166 Optional inputs:
167
167
168 - raw(False): by default, the processed input is used. If this is
168 - raw(False): by default, the processed input is used. If this is
169 true, the raw input history is used instead.
169 true, the raw input history is used instead.
170
170
171 Note that slices can be called with two notations:
171 Note that slices can be called with two notations:
172
172
173 N:M -> standard python form, means including items N...(M-1).
173 N:M -> standard python form, means including items N...(M-1).
174
174
175 N-M -> include items N..M (closed endpoint)."""
175 N-M -> include items N..M (closed endpoint)."""
176
176
177 if raw:
177 if raw:
178 hist = self.shell.input_hist_raw
178 hist = self.shell.input_hist_raw
179 else:
179 else:
180 hist = self.shell.input_hist
180 hist = self.shell.input_hist
181
181
182 cmds = []
182 cmds = []
183 for chunk in slices:
183 for chunk in slices:
184 if ':' in chunk:
184 if ':' in chunk:
185 ini,fin = map(int,chunk.split(':'))
185 ini,fin = map(int,chunk.split(':'))
186 elif '-' in chunk:
186 elif '-' in chunk:
187 ini,fin = map(int,chunk.split('-'))
187 ini,fin = map(int,chunk.split('-'))
188 fin += 1
188 fin += 1
189 else:
189 else:
190 ini = int(chunk)
190 ini = int(chunk)
191 fin = ini+1
191 fin = ini+1
192 cmds.append(hist[ini:fin])
192 cmds.append(hist[ini:fin])
193 return cmds
193 return cmds
194
194
195 def _ofind(self, oname, namespaces=None):
195 def _ofind(self, oname, namespaces=None):
196 """Find an object in the available namespaces.
196 """Find an object in the available namespaces.
197
197
198 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
198 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
199
199
200 Has special code to detect magic functions.
200 Has special code to detect magic functions.
201 """
201 """
202
202
203 oname = oname.strip()
203 oname = oname.strip()
204
204
205 alias_ns = None
205 alias_ns = None
206 if namespaces is None:
206 if namespaces is None:
207 # Namespaces to search in:
207 # Namespaces to search in:
208 # Put them in a list. The order is important so that we
208 # Put them in a list. The order is important so that we
209 # find things in the same order that Python finds them.
209 # find things in the same order that Python finds them.
210 namespaces = [ ('Interactive', self.shell.user_ns),
210 namespaces = [ ('Interactive', self.shell.user_ns),
211 ('IPython internal', self.shell.internal_ns),
211 ('IPython internal', self.shell.internal_ns),
212 ('Python builtin', __builtin__.__dict__),
212 ('Python builtin', __builtin__.__dict__),
213 ('Alias', self.shell.alias_table),
213 ('Alias', self.shell.alias_table),
214 ]
214 ]
215 alias_ns = self.shell.alias_table
215 alias_ns = self.shell.alias_table
216
216
217 # initialize results to 'null'
217 # initialize results to 'null'
218 found = 0; obj = None; ospace = None; ds = None;
218 found = 0; obj = None; ospace = None; ds = None;
219 ismagic = 0; isalias = 0; parent = None
219 ismagic = 0; isalias = 0; parent = None
220
220
221 # Look for the given name by splitting it in parts. If the head is
221 # Look for the given name by splitting it in parts. If the head is
222 # found, then we look for all the remaining parts as members, and only
222 # found, then we look for all the remaining parts as members, and only
223 # declare success if we can find them all.
223 # declare success if we can find them all.
224 oname_parts = oname.split('.')
224 oname_parts = oname.split('.')
225 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
225 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
226 for nsname,ns in namespaces:
226 for nsname,ns in namespaces:
227 try:
227 try:
228 obj = ns[oname_head]
228 obj = ns[oname_head]
229 except KeyError:
229 except KeyError:
230 continue
230 continue
231 else:
231 else:
232 #print 'oname_rest:', oname_rest # dbg
232 #print 'oname_rest:', oname_rest # dbg
233 for part in oname_rest:
233 for part in oname_rest:
234 try:
234 try:
235 parent = obj
235 parent = obj
236 obj = getattr(obj,part)
236 obj = getattr(obj,part)
237 except:
237 except:
238 # Blanket except b/c some badly implemented objects
238 # Blanket except b/c some badly implemented objects
239 # allow __getattr__ to raise exceptions other than
239 # allow __getattr__ to raise exceptions other than
240 # AttributeError, which then crashes IPython.
240 # AttributeError, which then crashes IPython.
241 break
241 break
242 else:
242 else:
243 # If we finish the for loop (no break), we got all members
243 # If we finish the for loop (no break), we got all members
244 found = 1
244 found = 1
245 ospace = nsname
245 ospace = nsname
246 if ns == alias_ns:
246 if ns == alias_ns:
247 isalias = 1
247 isalias = 1
248 break # namespace loop
248 break # namespace loop
249
249
250 # Try to see if it's magic
250 # Try to see if it's magic
251 if not found:
251 if not found:
252 if oname.startswith(self.shell.ESC_MAGIC):
252 if oname.startswith(self.shell.ESC_MAGIC):
253 oname = oname[1:]
253 oname = oname[1:]
254 obj = getattr(self,'magic_'+oname,None)
254 obj = getattr(self,'magic_'+oname,None)
255 if obj is not None:
255 if obj is not None:
256 found = 1
256 found = 1
257 ospace = 'IPython internal'
257 ospace = 'IPython internal'
258 ismagic = 1
258 ismagic = 1
259
259
260 # Last try: special-case some literals like '', [], {}, etc:
260 # Last try: special-case some literals like '', [], {}, etc:
261 if not found and oname_head in ["''",'""','[]','{}','()']:
261 if not found and oname_head in ["''",'""','[]','{}','()']:
262 obj = eval(oname_head)
262 obj = eval(oname_head)
263 found = 1
263 found = 1
264 ospace = 'Interactive'
264 ospace = 'Interactive'
265
265
266 return {'found':found, 'obj':obj, 'namespace':ospace,
266 return {'found':found, 'obj':obj, 'namespace':ospace,
267 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
267 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
268
268
269 def arg_err(self,func):
269 def arg_err(self,func):
270 """Print docstring if incorrect arguments were passed"""
270 """Print docstring if incorrect arguments were passed"""
271 print 'Error in arguments:'
271 print 'Error in arguments:'
272 print OInspect.getdoc(func)
272 print OInspect.getdoc(func)
273
273
274 def format_latex(self,strng):
274 def format_latex(self,strng):
275 """Format a string for latex inclusion."""
275 """Format a string for latex inclusion."""
276
276
277 # Characters that need to be escaped for latex:
277 # Characters that need to be escaped for latex:
278 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
278 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
279 # Magic command names as headers:
279 # Magic command names as headers:
280 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
280 cmd_name_re = re.compile(r'^(%s.*?):' % self.shell.ESC_MAGIC,
281 re.MULTILINE)
281 re.MULTILINE)
282 # Magic commands
282 # Magic commands
283 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
283 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % self.shell.ESC_MAGIC,
284 re.MULTILINE)
284 re.MULTILINE)
285 # Paragraph continue
285 # Paragraph continue
286 par_re = re.compile(r'\\$',re.MULTILINE)
286 par_re = re.compile(r'\\$',re.MULTILINE)
287
287
288 # The "\n" symbol
288 # The "\n" symbol
289 newline_re = re.compile(r'\\n')
289 newline_re = re.compile(r'\\n')
290
290
291 # Now build the string for output:
291 # Now build the string for output:
292 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
292 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
293 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
293 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
294 strng)
294 strng)
295 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
295 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
296 strng = par_re.sub(r'\\\\',strng)
296 strng = par_re.sub(r'\\\\',strng)
297 strng = escape_re.sub(r'\\\1',strng)
297 strng = escape_re.sub(r'\\\1',strng)
298 strng = newline_re.sub(r'\\textbackslash{}n',strng)
298 strng = newline_re.sub(r'\\textbackslash{}n',strng)
299 return strng
299 return strng
300
300
301 def format_screen(self,strng):
301 def format_screen(self,strng):
302 """Format a string for screen printing.
302 """Format a string for screen printing.
303
303
304 This removes some latex-type format codes."""
304 This removes some latex-type format codes."""
305 # Paragraph continue
305 # Paragraph continue
306 par_re = re.compile(r'\\$',re.MULTILINE)
306 par_re = re.compile(r'\\$',re.MULTILINE)
307 strng = par_re.sub('',strng)
307 strng = par_re.sub('',strng)
308 return strng
308 return strng
309
309
310 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
310 def parse_options(self,arg_str,opt_str,*long_opts,**kw):
311 """Parse options passed to an argument string.
311 """Parse options passed to an argument string.
312
312
313 The interface is similar to that of getopt(), but it returns back a
313 The interface is similar to that of getopt(), but it returns back a
314 Struct with the options as keys and the stripped argument string still
314 Struct with the options as keys and the stripped argument string still
315 as a string.
315 as a string.
316
316
317 arg_str is quoted as a true sys.argv vector by using shlex.split.
317 arg_str is quoted as a true sys.argv vector by using shlex.split.
318 This allows us to easily expand variables, glob files, quote
318 This allows us to easily expand variables, glob files, quote
319 arguments, etc.
319 arguments, etc.
320
320
321 Options:
321 Options:
322 -mode: default 'string'. If given as 'list', the argument string is
322 -mode: default 'string'. If given as 'list', the argument string is
323 returned as a list (split on whitespace) instead of a string.
323 returned as a list (split on whitespace) instead of a string.
324
324
325 -list_all: put all option values in lists. Normally only options
325 -list_all: put all option values in lists. Normally only options
326 appearing more than once are put in a list.
326 appearing more than once are put in a list.
327
327
328 -posix (True): whether to split the input line in POSIX mode or not,
328 -posix (True): whether to split the input line in POSIX mode or not,
329 as per the conventions outlined in the shlex module from the
329 as per the conventions outlined in the shlex module from the
330 standard library."""
330 standard library."""
331
331
332 # inject default options at the beginning of the input line
332 # inject default options at the beginning of the input line
333 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
333 caller = sys._getframe(1).f_code.co_name.replace('magic_','')
334 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
334 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
335
335
336 mode = kw.get('mode','string')
336 mode = kw.get('mode','string')
337 if mode not in ['string','list']:
337 if mode not in ['string','list']:
338 raise ValueError,'incorrect mode given: %s' % mode
338 raise ValueError,'incorrect mode given: %s' % mode
339 # Get options
339 # Get options
340 list_all = kw.get('list_all',0)
340 list_all = kw.get('list_all',0)
341 posix = kw.get('posix',True)
341 posix = kw.get('posix',True)
342
342
343 # Check if we have more than one argument to warrant extra processing:
343 # Check if we have more than one argument to warrant extra processing:
344 odict = {} # Dictionary with options
344 odict = {} # Dictionary with options
345 args = arg_str.split()
345 args = arg_str.split()
346 if len(args) >= 1:
346 if len(args) >= 1:
347 # If the list of inputs only has 0 or 1 thing in it, there's no
347 # If the list of inputs only has 0 or 1 thing in it, there's no
348 # need to look for options
348 # need to look for options
349 argv = arg_split(arg_str,posix)
349 argv = arg_split(arg_str,posix)
350 # Do regular option processing
350 # Do regular option processing
351 try:
351 try:
352 opts,args = getopt(argv,opt_str,*long_opts)
352 opts,args = getopt(argv,opt_str,*long_opts)
353 except GetoptError,e:
353 except GetoptError,e:
354 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
354 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
355 " ".join(long_opts)))
355 " ".join(long_opts)))
356 for o,a in opts:
356 for o,a in opts:
357 if o.startswith('--'):
357 if o.startswith('--'):
358 o = o[2:]
358 o = o[2:]
359 else:
359 else:
360 o = o[1:]
360 o = o[1:]
361 try:
361 try:
362 odict[o].append(a)
362 odict[o].append(a)
363 except AttributeError:
363 except AttributeError:
364 odict[o] = [odict[o],a]
364 odict[o] = [odict[o],a]
365 except KeyError:
365 except KeyError:
366 if list_all:
366 if list_all:
367 odict[o] = [a]
367 odict[o] = [a]
368 else:
368 else:
369 odict[o] = a
369 odict[o] = a
370
370
371 # Prepare opts,args for return
371 # Prepare opts,args for return
372 opts = Struct(odict)
372 opts = Struct(odict)
373 if mode == 'string':
373 if mode == 'string':
374 args = ' '.join(args)
374 args = ' '.join(args)
375
375
376 return opts,args
376 return opts,args
377
377
378 #......................................................................
378 #......................................................................
379 # And now the actual magic functions
379 # And now the actual magic functions
380
380
381 # Functions for IPython shell work (vars,funcs, config, etc)
381 # Functions for IPython shell work (vars,funcs, config, etc)
382 def magic_lsmagic(self, parameter_s = ''):
382 def magic_lsmagic(self, parameter_s = ''):
383 """List currently available magic functions."""
383 """List currently available magic functions."""
384 mesc = self.shell.ESC_MAGIC
384 mesc = self.shell.ESC_MAGIC
385 print 'Available magic functions:\n'+mesc+\
385 print 'Available magic functions:\n'+mesc+\
386 (' '+mesc).join(self.lsmagic())
386 (' '+mesc).join(self.lsmagic())
387 print '\n' + Magic.auto_status[self.shell.rc.automagic]
387 print '\n' + Magic.auto_status[self.shell.rc.automagic]
388 return None
388 return None
389
389
390 def magic_magic(self, parameter_s = ''):
390 def magic_magic(self, parameter_s = ''):
391 """Print information about the magic function system.
391 """Print information about the magic function system.
392
392
393 Supported formats: -latex, -brief, -rest
393 Supported formats: -latex, -brief, -rest
394 """
394 """
395
395
396 mode = ''
396 mode = ''
397 try:
397 try:
398 if parameter_s.split()[0] == '-latex':
398 if parameter_s.split()[0] == '-latex':
399 mode = 'latex'
399 mode = 'latex'
400 if parameter_s.split()[0] == '-brief':
400 if parameter_s.split()[0] == '-brief':
401 mode = 'brief'
401 mode = 'brief'
402 if parameter_s.split()[0] == '-rest':
402 if parameter_s.split()[0] == '-rest':
403 mode = 'rest'
403 mode = 'rest'
404 rest_docs = []
404 rest_docs = []
405 except:
405 except:
406 pass
406 pass
407
407
408 magic_docs = []
408 magic_docs = []
409 for fname in self.lsmagic():
409 for fname in self.lsmagic():
410 mname = 'magic_' + fname
410 mname = 'magic_' + fname
411 for space in (Magic,self,self.__class__):
411 for space in (Magic,self,self.__class__):
412 try:
412 try:
413 fn = space.__dict__[mname]
413 fn = space.__dict__[mname]
414 except KeyError:
414 except KeyError:
415 pass
415 pass
416 else:
416 else:
417 break
417 break
418 if mode == 'brief':
418 if mode == 'brief':
419 # only first line
419 # only first line
420 if fn.__doc__:
420 if fn.__doc__:
421 fndoc = fn.__doc__.split('\n',1)[0]
421 fndoc = fn.__doc__.split('\n',1)[0]
422 else:
422 else:
423 fndoc = 'No documentation'
423 fndoc = 'No documentation'
424 else:
424 else:
425 if fn.__doc__:
425 fndoc = fn.__doc__.rstrip()
426 fndoc = fn.__doc__.rstrip()
427 else:
428 fndoc = 'No documentation'
429
426
430
427 if mode == 'rest':
431 if mode == 'rest':
428 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(self.shell.ESC_MAGIC,
432 rest_docs.append('**%s%s**::\n\n\t%s\n\n' %(self.shell.ESC_MAGIC,
429 fname,fndoc))
433 fname,fndoc))
430
434
431 else:
435 else:
432 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
436 magic_docs.append('%s%s:\n\t%s\n' %(self.shell.ESC_MAGIC,
433 fname,fndoc))
437 fname,fndoc))
434
438
435 magic_docs = ''.join(magic_docs)
439 magic_docs = ''.join(magic_docs)
436
440
437 if mode == 'rest':
441 if mode == 'rest':
438 return "".join(rest_docs)
442 return "".join(rest_docs)
439
443
440 if mode == 'latex':
444 if mode == 'latex':
441 print self.format_latex(magic_docs)
445 print self.format_latex(magic_docs)
442 return
446 return
443 else:
447 else:
444 magic_docs = self.format_screen(magic_docs)
448 magic_docs = self.format_screen(magic_docs)
445 if mode == 'brief':
449 if mode == 'brief':
446 return magic_docs
450 return magic_docs
447
451
448 outmsg = """
452 outmsg = """
449 IPython's 'magic' functions
453 IPython's 'magic' functions
450 ===========================
454 ===========================
451
455
452 The magic function system provides a series of functions which allow you to
456 The magic function system provides a series of functions which allow you to
453 control the behavior of IPython itself, plus a lot of system-type
457 control the behavior of IPython itself, plus a lot of system-type
454 features. All these functions are prefixed with a % character, but parameters
458 features. All these functions are prefixed with a % character, but parameters
455 are given without parentheses or quotes.
459 are given without parentheses or quotes.
456
460
457 NOTE: If you have 'automagic' enabled (via the command line option or with the
461 NOTE: If you have 'automagic' enabled (via the command line option or with the
458 %automagic function), you don't need to type in the % explicitly. By default,
462 %automagic function), you don't need to type in the % explicitly. By default,
459 IPython ships with automagic on, so you should only rarely need the % escape.
463 IPython ships with automagic on, so you should only rarely need the % escape.
460
464
461 Example: typing '%cd mydir' (without the quotes) changes you working directory
465 Example: typing '%cd mydir' (without the quotes) changes you working directory
462 to 'mydir', if it exists.
466 to 'mydir', if it exists.
463
467
464 You can define your own magic functions to extend the system. See the supplied
468 You can define your own magic functions to extend the system. See the supplied
465 ipythonrc and example-magic.py files for details (in your ipython
469 ipythonrc and example-magic.py files for details (in your ipython
466 configuration directory, typically $HOME/.ipython/).
470 configuration directory, typically $HOME/.ipython/).
467
471
468 You can also define your own aliased names for magic functions. In your
472 You can also define your own aliased names for magic functions. In your
469 ipythonrc file, placing a line like:
473 ipythonrc file, placing a line like:
470
474
471 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
475 execute __IPYTHON__.magic_pf = __IPYTHON__.magic_profile
472
476
473 will define %pf as a new name for %profile.
477 will define %pf as a new name for %profile.
474
478
475 You can also call magics in code using the ipmagic() function, which IPython
479 You can also call magics in code using the ipmagic() function, which IPython
476 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
480 automatically adds to the builtin namespace. Type 'ipmagic?' for details.
477
481
478 For a list of the available magic functions, use %lsmagic. For a description
482 For a list of the available magic functions, use %lsmagic. For a description
479 of any of them, type %magic_name?, e.g. '%cd?'.
483 of any of them, type %magic_name?, e.g. '%cd?'.
480
484
481 Currently the magic system has the following functions:\n"""
485 Currently the magic system has the following functions:\n"""
482
486
483 mesc = self.shell.ESC_MAGIC
487 mesc = self.shell.ESC_MAGIC
484 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
488 outmsg = ("%s\n%s\n\nSummary of magic functions (from %slsmagic):"
485 "\n\n%s%s\n\n%s" % (outmsg,
489 "\n\n%s%s\n\n%s" % (outmsg,
486 magic_docs,mesc,mesc,
490 magic_docs,mesc,mesc,
487 (' '+mesc).join(self.lsmagic()),
491 (' '+mesc).join(self.lsmagic()),
488 Magic.auto_status[self.shell.rc.automagic] ) )
492 Magic.auto_status[self.shell.rc.automagic] ) )
489
493
490 page(outmsg,screen_lines=self.shell.rc.screen_length)
494 page(outmsg,screen_lines=self.shell.rc.screen_length)
491
495
492
496
493 def magic_autoindent(self, parameter_s = ''):
497 def magic_autoindent(self, parameter_s = ''):
494 """Toggle autoindent on/off (if available)."""
498 """Toggle autoindent on/off (if available)."""
495
499
496 self.shell.set_autoindent()
500 self.shell.set_autoindent()
497 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
501 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
498
502
499
503
500 def magic_automagic(self, parameter_s = ''):
504 def magic_automagic(self, parameter_s = ''):
501 """Make magic functions callable without having to type the initial %.
505 """Make magic functions callable without having to type the initial %.
502
506
503 Without argumentsl toggles on/off (when off, you must call it as
507 Without argumentsl toggles on/off (when off, you must call it as
504 %automagic, of course). With arguments it sets the value, and you can
508 %automagic, of course). With arguments it sets the value, and you can
505 use any of (case insensitive):
509 use any of (case insensitive):
506
510
507 - on,1,True: to activate
511 - on,1,True: to activate
508
512
509 - off,0,False: to deactivate.
513 - off,0,False: to deactivate.
510
514
511 Note that magic functions have lowest priority, so if there's a
515 Note that magic functions have lowest priority, so if there's a
512 variable whose name collides with that of a magic fn, automagic won't
516 variable whose name collides with that of a magic fn, automagic won't
513 work for that function (you get the variable instead). However, if you
517 work for that function (you get the variable instead). However, if you
514 delete the variable (del var), the previously shadowed magic function
518 delete the variable (del var), the previously shadowed magic function
515 becomes visible to automagic again."""
519 becomes visible to automagic again."""
516
520
517 rc = self.shell.rc
521 rc = self.shell.rc
518 arg = parameter_s.lower()
522 arg = parameter_s.lower()
519 if parameter_s in ('on','1','true'):
523 if parameter_s in ('on','1','true'):
520 rc.automagic = True
524 rc.automagic = True
521 elif parameter_s in ('off','0','false'):
525 elif parameter_s in ('off','0','false'):
522 rc.automagic = False
526 rc.automagic = False
523 else:
527 else:
524 rc.automagic = not rc.automagic
528 rc.automagic = not rc.automagic
525 print '\n' + Magic.auto_status[rc.automagic]
529 print '\n' + Magic.auto_status[rc.automagic]
526
530
527 @testdec.skip_doctest
531 @testdec.skip_doctest
528 def magic_autocall(self, parameter_s = ''):
532 def magic_autocall(self, parameter_s = ''):
529 """Make functions callable without having to type parentheses.
533 """Make functions callable without having to type parentheses.
530
534
531 Usage:
535 Usage:
532
536
533 %autocall [mode]
537 %autocall [mode]
534
538
535 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
539 The mode can be one of: 0->Off, 1->Smart, 2->Full. If not given, the
536 value is toggled on and off (remembering the previous state).
540 value is toggled on and off (remembering the previous state).
537
541
538 In more detail, these values mean:
542 In more detail, these values mean:
539
543
540 0 -> fully disabled
544 0 -> fully disabled
541
545
542 1 -> active, but do not apply if there are no arguments on the line.
546 1 -> active, but do not apply if there are no arguments on the line.
543
547
544 In this mode, you get:
548 In this mode, you get:
545
549
546 In [1]: callable
550 In [1]: callable
547 Out[1]: <built-in function callable>
551 Out[1]: <built-in function callable>
548
552
549 In [2]: callable 'hello'
553 In [2]: callable 'hello'
550 ------> callable('hello')
554 ------> callable('hello')
551 Out[2]: False
555 Out[2]: False
552
556
553 2 -> Active always. Even if no arguments are present, the callable
557 2 -> Active always. Even if no arguments are present, the callable
554 object is called:
558 object is called:
555
559
556 In [2]: float
560 In [2]: float
557 ------> float()
561 ------> float()
558 Out[2]: 0.0
562 Out[2]: 0.0
559
563
560 Note that even with autocall off, you can still use '/' at the start of
564 Note that even with autocall off, you can still use '/' at the start of
561 a line to treat the first argument on the command line as a function
565 a line to treat the first argument on the command line as a function
562 and add parentheses to it:
566 and add parentheses to it:
563
567
564 In [8]: /str 43
568 In [8]: /str 43
565 ------> str(43)
569 ------> str(43)
566 Out[8]: '43'
570 Out[8]: '43'
567
571
568 # all-random (note for auto-testing)
572 # all-random (note for auto-testing)
569 """
573 """
570
574
571 rc = self.shell.rc
575 rc = self.shell.rc
572
576
573 if parameter_s:
577 if parameter_s:
574 arg = int(parameter_s)
578 arg = int(parameter_s)
575 else:
579 else:
576 arg = 'toggle'
580 arg = 'toggle'
577
581
578 if not arg in (0,1,2,'toggle'):
582 if not arg in (0,1,2,'toggle'):
579 error('Valid modes: (0->Off, 1->Smart, 2->Full')
583 error('Valid modes: (0->Off, 1->Smart, 2->Full')
580 return
584 return
581
585
582 if arg in (0,1,2):
586 if arg in (0,1,2):
583 rc.autocall = arg
587 rc.autocall = arg
584 else: # toggle
588 else: # toggle
585 if rc.autocall:
589 if rc.autocall:
586 self._magic_state.autocall_save = rc.autocall
590 self._magic_state.autocall_save = rc.autocall
587 rc.autocall = 0
591 rc.autocall = 0
588 else:
592 else:
589 try:
593 try:
590 rc.autocall = self._magic_state.autocall_save
594 rc.autocall = self._magic_state.autocall_save
591 except AttributeError:
595 except AttributeError:
592 rc.autocall = self._magic_state.autocall_save = 1
596 rc.autocall = self._magic_state.autocall_save = 1
593
597
594 print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
598 print "Automatic calling is:",['OFF','Smart','Full'][rc.autocall]
595
599
596 def magic_system_verbose(self, parameter_s = ''):
600 def magic_system_verbose(self, parameter_s = ''):
597 """Set verbose printing of system calls.
601 """Set verbose printing of system calls.
598
602
599 If called without an argument, act as a toggle"""
603 If called without an argument, act as a toggle"""
600
604
601 if parameter_s:
605 if parameter_s:
602 val = bool(eval(parameter_s))
606 val = bool(eval(parameter_s))
603 else:
607 else:
604 val = None
608 val = None
605
609
606 self.shell.rc_set_toggle('system_verbose',val)
610 self.shell.rc_set_toggle('system_verbose',val)
607 print "System verbose printing is:",\
611 print "System verbose printing is:",\
608 ['OFF','ON'][self.shell.rc.system_verbose]
612 ['OFF','ON'][self.shell.rc.system_verbose]
609
613
610
614
611 def magic_page(self, parameter_s=''):
615 def magic_page(self, parameter_s=''):
612 """Pretty print the object and display it through a pager.
616 """Pretty print the object and display it through a pager.
613
617
614 %page [options] OBJECT
618 %page [options] OBJECT
615
619
616 If no object is given, use _ (last output).
620 If no object is given, use _ (last output).
617
621
618 Options:
622 Options:
619
623
620 -r: page str(object), don't pretty-print it."""
624 -r: page str(object), don't pretty-print it."""
621
625
622 # After a function contributed by Olivier Aubert, slightly modified.
626 # After a function contributed by Olivier Aubert, slightly modified.
623
627
624 # Process options/args
628 # Process options/args
625 opts,args = self.parse_options(parameter_s,'r')
629 opts,args = self.parse_options(parameter_s,'r')
626 raw = 'r' in opts
630 raw = 'r' in opts
627
631
628 oname = args and args or '_'
632 oname = args and args or '_'
629 info = self._ofind(oname)
633 info = self._ofind(oname)
630 if info['found']:
634 if info['found']:
631 txt = (raw and str or pformat)( info['obj'] )
635 txt = (raw and str or pformat)( info['obj'] )
632 page(txt)
636 page(txt)
633 else:
637 else:
634 print 'Object `%s` not found' % oname
638 print 'Object `%s` not found' % oname
635
639
636 def magic_profile(self, parameter_s=''):
640 def magic_profile(self, parameter_s=''):
637 """Print your currently active IPyhton profile."""
641 """Print your currently active IPyhton profile."""
638 if self.shell.rc.profile:
642 if self.shell.rc.profile:
639 printpl('Current IPython profile: $self.shell.rc.profile.')
643 printpl('Current IPython profile: $self.shell.rc.profile.')
640 else:
644 else:
641 print 'No profile active.'
645 print 'No profile active.'
642
646
643 def magic_pinfo(self, parameter_s='', namespaces=None):
647 def magic_pinfo(self, parameter_s='', namespaces=None):
644 """Provide detailed information about an object.
648 """Provide detailed information about an object.
645
649
646 '%pinfo object' is just a synonym for object? or ?object."""
650 '%pinfo object' is just a synonym for object? or ?object."""
647
651
648 #print 'pinfo par: <%s>' % parameter_s # dbg
652 #print 'pinfo par: <%s>' % parameter_s # dbg
649
653
650
654
651 # detail_level: 0 -> obj? , 1 -> obj??
655 # detail_level: 0 -> obj? , 1 -> obj??
652 detail_level = 0
656 detail_level = 0
653 # We need to detect if we got called as 'pinfo pinfo foo', which can
657 # We need to detect if we got called as 'pinfo pinfo foo', which can
654 # happen if the user types 'pinfo foo?' at the cmd line.
658 # happen if the user types 'pinfo foo?' at the cmd line.
655 pinfo,qmark1,oname,qmark2 = \
659 pinfo,qmark1,oname,qmark2 = \
656 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
660 re.match('(pinfo )?(\?*)(.*?)(\??$)',parameter_s).groups()
657 if pinfo or qmark1 or qmark2:
661 if pinfo or qmark1 or qmark2:
658 detail_level = 1
662 detail_level = 1
659 if "*" in oname:
663 if "*" in oname:
660 self.magic_psearch(oname)
664 self.magic_psearch(oname)
661 else:
665 else:
662 self._inspect('pinfo', oname, detail_level=detail_level,
666 self._inspect('pinfo', oname, detail_level=detail_level,
663 namespaces=namespaces)
667 namespaces=namespaces)
664
668
665 def magic_pdef(self, parameter_s='', namespaces=None):
669 def magic_pdef(self, parameter_s='', namespaces=None):
666 """Print the definition header for any callable object.
670 """Print the definition header for any callable object.
667
671
668 If the object is a class, print the constructor information."""
672 If the object is a class, print the constructor information."""
669 self._inspect('pdef',parameter_s, namespaces)
673 self._inspect('pdef',parameter_s, namespaces)
670
674
671 def magic_pdoc(self, parameter_s='', namespaces=None):
675 def magic_pdoc(self, parameter_s='', namespaces=None):
672 """Print the docstring for an object.
676 """Print the docstring for an object.
673
677
674 If the given object is a class, it will print both the class and the
678 If the given object is a class, it will print both the class and the
675 constructor docstrings."""
679 constructor docstrings."""
676 self._inspect('pdoc',parameter_s, namespaces)
680 self._inspect('pdoc',parameter_s, namespaces)
677
681
678 def magic_psource(self, parameter_s='', namespaces=None):
682 def magic_psource(self, parameter_s='', namespaces=None):
679 """Print (or run through pager) the source code for an object."""
683 """Print (or run through pager) the source code for an object."""
680 self._inspect('psource',parameter_s, namespaces)
684 self._inspect('psource',parameter_s, namespaces)
681
685
682 def magic_pfile(self, parameter_s=''):
686 def magic_pfile(self, parameter_s=''):
683 """Print (or run through pager) the file where an object is defined.
687 """Print (or run through pager) the file where an object is defined.
684
688
685 The file opens at the line where the object definition begins. IPython
689 The file opens at the line where the object definition begins. IPython
686 will honor the environment variable PAGER if set, and otherwise will
690 will honor the environment variable PAGER if set, and otherwise will
687 do its best to print the file in a convenient form.
691 do its best to print the file in a convenient form.
688
692
689 If the given argument is not an object currently defined, IPython will
693 If the given argument is not an object currently defined, IPython will
690 try to interpret it as a filename (automatically adding a .py extension
694 try to interpret it as a filename (automatically adding a .py extension
691 if needed). You can thus use %pfile as a syntax highlighting code
695 if needed). You can thus use %pfile as a syntax highlighting code
692 viewer."""
696 viewer."""
693
697
694 # first interpret argument as an object name
698 # first interpret argument as an object name
695 out = self._inspect('pfile',parameter_s)
699 out = self._inspect('pfile',parameter_s)
696 # if not, try the input as a filename
700 # if not, try the input as a filename
697 if out == 'not found':
701 if out == 'not found':
698 try:
702 try:
699 filename = get_py_filename(parameter_s)
703 filename = get_py_filename(parameter_s)
700 except IOError,msg:
704 except IOError,msg:
701 print msg
705 print msg
702 return
706 return
703 page(self.shell.inspector.format(file(filename).read()))
707 page(self.shell.inspector.format(file(filename).read()))
704
708
705 def _inspect(self,meth,oname,namespaces=None,**kw):
709 def _inspect(self,meth,oname,namespaces=None,**kw):
706 """Generic interface to the inspector system.
710 """Generic interface to the inspector system.
707
711
708 This function is meant to be called by pdef, pdoc & friends."""
712 This function is meant to be called by pdef, pdoc & friends."""
709
713
710 #oname = oname.strip()
714 #oname = oname.strip()
711 #print '1- oname: <%r>' % oname # dbg
715 #print '1- oname: <%r>' % oname # dbg
712 try:
716 try:
713 oname = oname.strip().encode('ascii')
717 oname = oname.strip().encode('ascii')
714 #print '2- oname: <%r>' % oname # dbg
718 #print '2- oname: <%r>' % oname # dbg
715 except UnicodeEncodeError:
719 except UnicodeEncodeError:
716 print 'Python identifiers can only contain ascii characters.'
720 print 'Python identifiers can only contain ascii characters.'
717 return 'not found'
721 return 'not found'
718
722
719 info = Struct(self._ofind(oname, namespaces))
723 info = Struct(self._ofind(oname, namespaces))
720
724
721 if info.found:
725 if info.found:
722 try:
726 try:
723 IPython.generics.inspect_object(info.obj)
727 IPython.generics.inspect_object(info.obj)
724 return
728 return
725 except IPython.ipapi.TryNext:
729 except IPython.ipapi.TryNext:
726 pass
730 pass
727 # Get the docstring of the class property if it exists.
731 # Get the docstring of the class property if it exists.
728 path = oname.split('.')
732 path = oname.split('.')
729 root = '.'.join(path[:-1])
733 root = '.'.join(path[:-1])
730 if info.parent is not None:
734 if info.parent is not None:
731 try:
735 try:
732 target = getattr(info.parent, '__class__')
736 target = getattr(info.parent, '__class__')
733 # The object belongs to a class instance.
737 # The object belongs to a class instance.
734 try:
738 try:
735 target = getattr(target, path[-1])
739 target = getattr(target, path[-1])
736 # The class defines the object.
740 # The class defines the object.
737 if isinstance(target, property):
741 if isinstance(target, property):
738 oname = root + '.__class__.' + path[-1]
742 oname = root + '.__class__.' + path[-1]
739 info = Struct(self._ofind(oname))
743 info = Struct(self._ofind(oname))
740 except AttributeError: pass
744 except AttributeError: pass
741 except AttributeError: pass
745 except AttributeError: pass
742
746
743 pmethod = getattr(self.shell.inspector,meth)
747 pmethod = getattr(self.shell.inspector,meth)
744 formatter = info.ismagic and self.format_screen or None
748 formatter = info.ismagic and self.format_screen or None
745 if meth == 'pdoc':
749 if meth == 'pdoc':
746 pmethod(info.obj,oname,formatter)
750 pmethod(info.obj,oname,formatter)
747 elif meth == 'pinfo':
751 elif meth == 'pinfo':
748 pmethod(info.obj,oname,formatter,info,**kw)
752 pmethod(info.obj,oname,formatter,info,**kw)
749 else:
753 else:
750 pmethod(info.obj,oname)
754 pmethod(info.obj,oname)
751 else:
755 else:
752 print 'Object `%s` not found.' % oname
756 print 'Object `%s` not found.' % oname
753 return 'not found' # so callers can take other action
757 return 'not found' # so callers can take other action
754
758
755 def magic_psearch(self, parameter_s=''):
759 def magic_psearch(self, parameter_s=''):
756 """Search for object in namespaces by wildcard.
760 """Search for object in namespaces by wildcard.
757
761
758 %psearch [options] PATTERN [OBJECT TYPE]
762 %psearch [options] PATTERN [OBJECT TYPE]
759
763
760 Note: ? can be used as a synonym for %psearch, at the beginning or at
764 Note: ? can be used as a synonym for %psearch, at the beginning or at
761 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
765 the end: both a*? and ?a* are equivalent to '%psearch a*'. Still, the
762 rest of the command line must be unchanged (options come first), so
766 rest of the command line must be unchanged (options come first), so
763 for example the following forms are equivalent
767 for example the following forms are equivalent
764
768
765 %psearch -i a* function
769 %psearch -i a* function
766 -i a* function?
770 -i a* function?
767 ?-i a* function
771 ?-i a* function
768
772
769 Arguments:
773 Arguments:
770
774
771 PATTERN
775 PATTERN
772
776
773 where PATTERN is a string containing * as a wildcard similar to its
777 where PATTERN is a string containing * as a wildcard similar to its
774 use in a shell. The pattern is matched in all namespaces on the
778 use in a shell. The pattern is matched in all namespaces on the
775 search path. By default objects starting with a single _ are not
779 search path. By default objects starting with a single _ are not
776 matched, many IPython generated objects have a single
780 matched, many IPython generated objects have a single
777 underscore. The default is case insensitive matching. Matching is
781 underscore. The default is case insensitive matching. Matching is
778 also done on the attributes of objects and not only on the objects
782 also done on the attributes of objects and not only on the objects
779 in a module.
783 in a module.
780
784
781 [OBJECT TYPE]
785 [OBJECT TYPE]
782
786
783 Is the name of a python type from the types module. The name is
787 Is the name of a python type from the types module. The name is
784 given in lowercase without the ending type, ex. StringType is
788 given in lowercase without the ending type, ex. StringType is
785 written string. By adding a type here only objects matching the
789 written string. By adding a type here only objects matching the
786 given type are matched. Using all here makes the pattern match all
790 given type are matched. Using all here makes the pattern match all
787 types (this is the default).
791 types (this is the default).
788
792
789 Options:
793 Options:
790
794
791 -a: makes the pattern match even objects whose names start with a
795 -a: makes the pattern match even objects whose names start with a
792 single underscore. These names are normally ommitted from the
796 single underscore. These names are normally ommitted from the
793 search.
797 search.
794
798
795 -i/-c: make the pattern case insensitive/sensitive. If neither of
799 -i/-c: make the pattern case insensitive/sensitive. If neither of
796 these options is given, the default is read from your ipythonrc
800 these options is given, the default is read from your ipythonrc
797 file. The option name which sets this value is
801 file. The option name which sets this value is
798 'wildcards_case_sensitive'. If this option is not specified in your
802 'wildcards_case_sensitive'. If this option is not specified in your
799 ipythonrc file, IPython's internal default is to do a case sensitive
803 ipythonrc file, IPython's internal default is to do a case sensitive
800 search.
804 search.
801
805
802 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
806 -e/-s NAMESPACE: exclude/search a given namespace. The pattern you
803 specifiy can be searched in any of the following namespaces:
807 specifiy can be searched in any of the following namespaces:
804 'builtin', 'user', 'user_global','internal', 'alias', where
808 'builtin', 'user', 'user_global','internal', 'alias', where
805 'builtin' and 'user' are the search defaults. Note that you should
809 'builtin' and 'user' are the search defaults. Note that you should
806 not use quotes when specifying namespaces.
810 not use quotes when specifying namespaces.
807
811
808 'Builtin' contains the python module builtin, 'user' contains all
812 'Builtin' contains the python module builtin, 'user' contains all
809 user data, 'alias' only contain the shell aliases and no python
813 user data, 'alias' only contain the shell aliases and no python
810 objects, 'internal' contains objects used by IPython. The
814 objects, 'internal' contains objects used by IPython. The
811 'user_global' namespace is only used by embedded IPython instances,
815 'user_global' namespace is only used by embedded IPython instances,
812 and it contains module-level globals. You can add namespaces to the
816 and it contains module-level globals. You can add namespaces to the
813 search with -s or exclude them with -e (these options can be given
817 search with -s or exclude them with -e (these options can be given
814 more than once).
818 more than once).
815
819
816 Examples:
820 Examples:
817
821
818 %psearch a* -> objects beginning with an a
822 %psearch a* -> objects beginning with an a
819 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
823 %psearch -e builtin a* -> objects NOT in the builtin space starting in a
820 %psearch a* function -> all functions beginning with an a
824 %psearch a* function -> all functions beginning with an a
821 %psearch re.e* -> objects beginning with an e in module re
825 %psearch re.e* -> objects beginning with an e in module re
822 %psearch r*.e* -> objects that start with e in modules starting in r
826 %psearch r*.e* -> objects that start with e in modules starting in r
823 %psearch r*.* string -> all strings in modules beginning with r
827 %psearch r*.* string -> all strings in modules beginning with r
824
828
825 Case sensitve search:
829 Case sensitve search:
826
830
827 %psearch -c a* list all object beginning with lower case a
831 %psearch -c a* list all object beginning with lower case a
828
832
829 Show objects beginning with a single _:
833 Show objects beginning with a single _:
830
834
831 %psearch -a _* list objects beginning with a single underscore"""
835 %psearch -a _* list objects beginning with a single underscore"""
832 try:
836 try:
833 parameter_s = parameter_s.encode('ascii')
837 parameter_s = parameter_s.encode('ascii')
834 except UnicodeEncodeError:
838 except UnicodeEncodeError:
835 print 'Python identifiers can only contain ascii characters.'
839 print 'Python identifiers can only contain ascii characters.'
836 return
840 return
837
841
838 # default namespaces to be searched
842 # default namespaces to be searched
839 def_search = ['user','builtin']
843 def_search = ['user','builtin']
840
844
841 # Process options/args
845 # Process options/args
842 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
846 opts,args = self.parse_options(parameter_s,'cias:e:',list_all=True)
843 opt = opts.get
847 opt = opts.get
844 shell = self.shell
848 shell = self.shell
845 psearch = shell.inspector.psearch
849 psearch = shell.inspector.psearch
846
850
847 # select case options
851 # select case options
848 if opts.has_key('i'):
852 if opts.has_key('i'):
849 ignore_case = True
853 ignore_case = True
850 elif opts.has_key('c'):
854 elif opts.has_key('c'):
851 ignore_case = False
855 ignore_case = False
852 else:
856 else:
853 ignore_case = not shell.rc.wildcards_case_sensitive
857 ignore_case = not shell.rc.wildcards_case_sensitive
854
858
855 # Build list of namespaces to search from user options
859 # Build list of namespaces to search from user options
856 def_search.extend(opt('s',[]))
860 def_search.extend(opt('s',[]))
857 ns_exclude = ns_exclude=opt('e',[])
861 ns_exclude = ns_exclude=opt('e',[])
858 ns_search = [nm for nm in def_search if nm not in ns_exclude]
862 ns_search = [nm for nm in def_search if nm not in ns_exclude]
859
863
860 # Call the actual search
864 # Call the actual search
861 try:
865 try:
862 psearch(args,shell.ns_table,ns_search,
866 psearch(args,shell.ns_table,ns_search,
863 show_all=opt('a'),ignore_case=ignore_case)
867 show_all=opt('a'),ignore_case=ignore_case)
864 except:
868 except:
865 shell.showtraceback()
869 shell.showtraceback()
866
870
867 def magic_who_ls(self, parameter_s=''):
871 def magic_who_ls(self, parameter_s=''):
868 """Return a sorted list of all interactive variables.
872 """Return a sorted list of all interactive variables.
869
873
870 If arguments are given, only variables of types matching these
874 If arguments are given, only variables of types matching these
871 arguments are returned."""
875 arguments are returned."""
872
876
873 user_ns = self.shell.user_ns
877 user_ns = self.shell.user_ns
874 internal_ns = self.shell.internal_ns
878 internal_ns = self.shell.internal_ns
875 user_config_ns = self.shell.user_config_ns
879 user_config_ns = self.shell.user_config_ns
876 out = []
880 out = []
877 typelist = parameter_s.split()
881 typelist = parameter_s.split()
878
882
879 for i in user_ns:
883 for i in user_ns:
880 if not (i.startswith('_') or i.startswith('_i')) \
884 if not (i.startswith('_') or i.startswith('_i')) \
881 and not (i in internal_ns or i in user_config_ns):
885 and not (i in internal_ns or i in user_config_ns):
882 if typelist:
886 if typelist:
883 if type(user_ns[i]).__name__ in typelist:
887 if type(user_ns[i]).__name__ in typelist:
884 out.append(i)
888 out.append(i)
885 else:
889 else:
886 out.append(i)
890 out.append(i)
887 out.sort()
891 out.sort()
888 return out
892 return out
889
893
890 def magic_who(self, parameter_s=''):
894 def magic_who(self, parameter_s=''):
891 """Print all interactive variables, with some minimal formatting.
895 """Print all interactive variables, with some minimal formatting.
892
896
893 If any arguments are given, only variables whose type matches one of
897 If any arguments are given, only variables whose type matches one of
894 these are printed. For example:
898 these are printed. For example:
895
899
896 %who function str
900 %who function str
897
901
898 will only list functions and strings, excluding all other types of
902 will only list functions and strings, excluding all other types of
899 variables. To find the proper type names, simply use type(var) at a
903 variables. To find the proper type names, simply use type(var) at a
900 command line to see how python prints type names. For example:
904 command line to see how python prints type names. For example:
901
905
902 In [1]: type('hello')\\
906 In [1]: type('hello')\\
903 Out[1]: <type 'str'>
907 Out[1]: <type 'str'>
904
908
905 indicates that the type name for strings is 'str'.
909 indicates that the type name for strings is 'str'.
906
910
907 %who always excludes executed names loaded through your configuration
911 %who always excludes executed names loaded through your configuration
908 file and things which are internal to IPython.
912 file and things which are internal to IPython.
909
913
910 This is deliberate, as typically you may load many modules and the
914 This is deliberate, as typically you may load many modules and the
911 purpose of %who is to show you only what you've manually defined."""
915 purpose of %who is to show you only what you've manually defined."""
912
916
913 varlist = self.magic_who_ls(parameter_s)
917 varlist = self.magic_who_ls(parameter_s)
914 if not varlist:
918 if not varlist:
915 if parameter_s:
919 if parameter_s:
916 print 'No variables match your requested type.'
920 print 'No variables match your requested type.'
917 else:
921 else:
918 print 'Interactive namespace is empty.'
922 print 'Interactive namespace is empty.'
919 return
923 return
920
924
921 # if we have variables, move on...
925 # if we have variables, move on...
922 count = 0
926 count = 0
923 for i in varlist:
927 for i in varlist:
924 print i+'\t',
928 print i+'\t',
925 count += 1
929 count += 1
926 if count > 8:
930 if count > 8:
927 count = 0
931 count = 0
928 print
932 print
929 print
933 print
930
934
931 def magic_whos(self, parameter_s=''):
935 def magic_whos(self, parameter_s=''):
932 """Like %who, but gives some extra information about each variable.
936 """Like %who, but gives some extra information about each variable.
933
937
934 The same type filtering of %who can be applied here.
938 The same type filtering of %who can be applied here.
935
939
936 For all variables, the type is printed. Additionally it prints:
940 For all variables, the type is printed. Additionally it prints:
937
941
938 - For {},[],(): their length.
942 - For {},[],(): their length.
939
943
940 - For numpy and Numeric arrays, a summary with shape, number of
944 - For numpy and Numeric arrays, a summary with shape, number of
941 elements, typecode and size in memory.
945 elements, typecode and size in memory.
942
946
943 - Everything else: a string representation, snipping their middle if
947 - Everything else: a string representation, snipping their middle if
944 too long."""
948 too long."""
945
949
946 varnames = self.magic_who_ls(parameter_s)
950 varnames = self.magic_who_ls(parameter_s)
947 if not varnames:
951 if not varnames:
948 if parameter_s:
952 if parameter_s:
949 print 'No variables match your requested type.'
953 print 'No variables match your requested type.'
950 else:
954 else:
951 print 'Interactive namespace is empty.'
955 print 'Interactive namespace is empty.'
952 return
956 return
953
957
954 # if we have variables, move on...
958 # if we have variables, move on...
955
959
956 # for these types, show len() instead of data:
960 # for these types, show len() instead of data:
957 seq_types = [types.DictType,types.ListType,types.TupleType]
961 seq_types = [types.DictType,types.ListType,types.TupleType]
958
962
959 # for numpy/Numeric arrays, display summary info
963 # for numpy/Numeric arrays, display summary info
960 try:
964 try:
961 import numpy
965 import numpy
962 except ImportError:
966 except ImportError:
963 ndarray_type = None
967 ndarray_type = None
964 else:
968 else:
965 ndarray_type = numpy.ndarray.__name__
969 ndarray_type = numpy.ndarray.__name__
966 try:
970 try:
967 import Numeric
971 import Numeric
968 except ImportError:
972 except ImportError:
969 array_type = None
973 array_type = None
970 else:
974 else:
971 array_type = Numeric.ArrayType.__name__
975 array_type = Numeric.ArrayType.__name__
972
976
973 # Find all variable names and types so we can figure out column sizes
977 # Find all variable names and types so we can figure out column sizes
974 def get_vars(i):
978 def get_vars(i):
975 return self.shell.user_ns[i]
979 return self.shell.user_ns[i]
976
980
977 # some types are well known and can be shorter
981 # some types are well known and can be shorter
978 abbrevs = {'IPython.macro.Macro' : 'Macro'}
982 abbrevs = {'IPython.macro.Macro' : 'Macro'}
979 def type_name(v):
983 def type_name(v):
980 tn = type(v).__name__
984 tn = type(v).__name__
981 return abbrevs.get(tn,tn)
985 return abbrevs.get(tn,tn)
982
986
983 varlist = map(get_vars,varnames)
987 varlist = map(get_vars,varnames)
984
988
985 typelist = []
989 typelist = []
986 for vv in varlist:
990 for vv in varlist:
987 tt = type_name(vv)
991 tt = type_name(vv)
988
992
989 if tt=='instance':
993 if tt=='instance':
990 typelist.append( abbrevs.get(str(vv.__class__),
994 typelist.append( abbrevs.get(str(vv.__class__),
991 str(vv.__class__)))
995 str(vv.__class__)))
992 else:
996 else:
993 typelist.append(tt)
997 typelist.append(tt)
994
998
995 # column labels and # of spaces as separator
999 # column labels and # of spaces as separator
996 varlabel = 'Variable'
1000 varlabel = 'Variable'
997 typelabel = 'Type'
1001 typelabel = 'Type'
998 datalabel = 'Data/Info'
1002 datalabel = 'Data/Info'
999 colsep = 3
1003 colsep = 3
1000 # variable format strings
1004 # variable format strings
1001 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1005 vformat = "$vname.ljust(varwidth)$vtype.ljust(typewidth)"
1002 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1006 vfmt_short = '$vstr[:25]<...>$vstr[-25:]'
1003 aformat = "%s: %s elems, type `%s`, %s bytes"
1007 aformat = "%s: %s elems, type `%s`, %s bytes"
1004 # find the size of the columns to format the output nicely
1008 # find the size of the columns to format the output nicely
1005 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1009 varwidth = max(max(map(len,varnames)), len(varlabel)) + colsep
1006 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1010 typewidth = max(max(map(len,typelist)), len(typelabel)) + colsep
1007 # table header
1011 # table header
1008 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1012 print varlabel.ljust(varwidth) + typelabel.ljust(typewidth) + \
1009 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1013 ' '+datalabel+'\n' + '-'*(varwidth+typewidth+len(datalabel)+1)
1010 # and the table itself
1014 # and the table itself
1011 kb = 1024
1015 kb = 1024
1012 Mb = 1048576 # kb**2
1016 Mb = 1048576 # kb**2
1013 for vname,var,vtype in zip(varnames,varlist,typelist):
1017 for vname,var,vtype in zip(varnames,varlist,typelist):
1014 print itpl(vformat),
1018 print itpl(vformat),
1015 if vtype in seq_types:
1019 if vtype in seq_types:
1016 print len(var)
1020 print len(var)
1017 elif vtype in [array_type,ndarray_type]:
1021 elif vtype in [array_type,ndarray_type]:
1018 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1022 vshape = str(var.shape).replace(',','').replace(' ','x')[1:-1]
1019 if vtype==ndarray_type:
1023 if vtype==ndarray_type:
1020 # numpy
1024 # numpy
1021 vsize = var.size
1025 vsize = var.size
1022 vbytes = vsize*var.itemsize
1026 vbytes = vsize*var.itemsize
1023 vdtype = var.dtype
1027 vdtype = var.dtype
1024 else:
1028 else:
1025 # Numeric
1029 # Numeric
1026 vsize = Numeric.size(var)
1030 vsize = Numeric.size(var)
1027 vbytes = vsize*var.itemsize()
1031 vbytes = vsize*var.itemsize()
1028 vdtype = var.typecode()
1032 vdtype = var.typecode()
1029
1033
1030 if vbytes < 100000:
1034 if vbytes < 100000:
1031 print aformat % (vshape,vsize,vdtype,vbytes)
1035 print aformat % (vshape,vsize,vdtype,vbytes)
1032 else:
1036 else:
1033 print aformat % (vshape,vsize,vdtype,vbytes),
1037 print aformat % (vshape,vsize,vdtype,vbytes),
1034 if vbytes < Mb:
1038 if vbytes < Mb:
1035 print '(%s kb)' % (vbytes/kb,)
1039 print '(%s kb)' % (vbytes/kb,)
1036 else:
1040 else:
1037 print '(%s Mb)' % (vbytes/Mb,)
1041 print '(%s Mb)' % (vbytes/Mb,)
1038 else:
1042 else:
1039 try:
1043 try:
1040 vstr = str(var)
1044 vstr = str(var)
1041 except UnicodeEncodeError:
1045 except UnicodeEncodeError:
1042 vstr = unicode(var).encode(sys.getdefaultencoding(),
1046 vstr = unicode(var).encode(sys.getdefaultencoding(),
1043 'backslashreplace')
1047 'backslashreplace')
1044 vstr = vstr.replace('\n','\\n')
1048 vstr = vstr.replace('\n','\\n')
1045 if len(vstr) < 50:
1049 if len(vstr) < 50:
1046 print vstr
1050 print vstr
1047 else:
1051 else:
1048 printpl(vfmt_short)
1052 printpl(vfmt_short)
1049
1053
1050 def magic_reset(self, parameter_s=''):
1054 def magic_reset(self, parameter_s=''):
1051 """Resets the namespace by removing all names defined by the user.
1055 """Resets the namespace by removing all names defined by the user.
1052
1056
1053 Input/Output history are left around in case you need them."""
1057 Input/Output history are left around in case you need them."""
1054
1058
1055 ans = self.shell.ask_yes_no(
1059 ans = self.shell.ask_yes_no(
1056 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1060 "Once deleted, variables cannot be recovered. Proceed (y/[n])? ")
1057 if not ans:
1061 if not ans:
1058 print 'Nothing done.'
1062 print 'Nothing done.'
1059 return
1063 return
1060 user_ns = self.shell.user_ns
1064 user_ns = self.shell.user_ns
1061 for i in self.magic_who_ls():
1065 for i in self.magic_who_ls():
1062 del(user_ns[i])
1066 del(user_ns[i])
1063
1067
1064 # Also flush the private list of module references kept for script
1068 # Also flush the private list of module references kept for script
1065 # execution protection
1069 # execution protection
1066 self.shell._user_main_modules[:] = []
1070 self.shell._user_main_modules[:] = []
1067
1071
1068 def magic_logstart(self,parameter_s=''):
1072 def magic_logstart(self,parameter_s=''):
1069 """Start logging anywhere in a session.
1073 """Start logging anywhere in a session.
1070
1074
1071 %logstart [-o|-r|-t] [log_name [log_mode]]
1075 %logstart [-o|-r|-t] [log_name [log_mode]]
1072
1076
1073 If no name is given, it defaults to a file named 'ipython_log.py' in your
1077 If no name is given, it defaults to a file named 'ipython_log.py' in your
1074 current directory, in 'rotate' mode (see below).
1078 current directory, in 'rotate' mode (see below).
1075
1079
1076 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1080 '%logstart name' saves to file 'name' in 'backup' mode. It saves your
1077 history up to that point and then continues logging.
1081 history up to that point and then continues logging.
1078
1082
1079 %logstart takes a second optional parameter: logging mode. This can be one
1083 %logstart takes a second optional parameter: logging mode. This can be one
1080 of (note that the modes are given unquoted):\\
1084 of (note that the modes are given unquoted):\\
1081 append: well, that says it.\\
1085 append: well, that says it.\\
1082 backup: rename (if exists) to name~ and start name.\\
1086 backup: rename (if exists) to name~ and start name.\\
1083 global: single logfile in your home dir, appended to.\\
1087 global: single logfile in your home dir, appended to.\\
1084 over : overwrite existing log.\\
1088 over : overwrite existing log.\\
1085 rotate: create rotating logs name.1~, name.2~, etc.
1089 rotate: create rotating logs name.1~, name.2~, etc.
1086
1090
1087 Options:
1091 Options:
1088
1092
1089 -o: log also IPython's output. In this mode, all commands which
1093 -o: log also IPython's output. In this mode, all commands which
1090 generate an Out[NN] prompt are recorded to the logfile, right after
1094 generate an Out[NN] prompt are recorded to the logfile, right after
1091 their corresponding input line. The output lines are always
1095 their corresponding input line. The output lines are always
1092 prepended with a '#[Out]# ' marker, so that the log remains valid
1096 prepended with a '#[Out]# ' marker, so that the log remains valid
1093 Python code.
1097 Python code.
1094
1098
1095 Since this marker is always the same, filtering only the output from
1099 Since this marker is always the same, filtering only the output from
1096 a log is very easy, using for example a simple awk call:
1100 a log is very easy, using for example a simple awk call:
1097
1101
1098 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1102 awk -F'#\\[Out\\]# ' '{if($2) {print $2}}' ipython_log.py
1099
1103
1100 -r: log 'raw' input. Normally, IPython's logs contain the processed
1104 -r: log 'raw' input. Normally, IPython's logs contain the processed
1101 input, so that user lines are logged in their final form, converted
1105 input, so that user lines are logged in their final form, converted
1102 into valid Python. For example, %Exit is logged as
1106 into valid Python. For example, %Exit is logged as
1103 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1107 '_ip.magic("Exit"). If the -r flag is given, all input is logged
1104 exactly as typed, with no transformations applied.
1108 exactly as typed, with no transformations applied.
1105
1109
1106 -t: put timestamps before each input line logged (these are put in
1110 -t: put timestamps before each input line logged (these are put in
1107 comments)."""
1111 comments)."""
1108
1112
1109 opts,par = self.parse_options(parameter_s,'ort')
1113 opts,par = self.parse_options(parameter_s,'ort')
1110 log_output = 'o' in opts
1114 log_output = 'o' in opts
1111 log_raw_input = 'r' in opts
1115 log_raw_input = 'r' in opts
1112 timestamp = 't' in opts
1116 timestamp = 't' in opts
1113
1117
1114 rc = self.shell.rc
1118 rc = self.shell.rc
1115 logger = self.shell.logger
1119 logger = self.shell.logger
1116
1120
1117 # if no args are given, the defaults set in the logger constructor by
1121 # if no args are given, the defaults set in the logger constructor by
1118 # ipytohn remain valid
1122 # ipytohn remain valid
1119 if par:
1123 if par:
1120 try:
1124 try:
1121 logfname,logmode = par.split()
1125 logfname,logmode = par.split()
1122 except:
1126 except:
1123 logfname = par
1127 logfname = par
1124 logmode = 'backup'
1128 logmode = 'backup'
1125 else:
1129 else:
1126 logfname = logger.logfname
1130 logfname = logger.logfname
1127 logmode = logger.logmode
1131 logmode = logger.logmode
1128 # put logfname into rc struct as if it had been called on the command
1132 # put logfname into rc struct as if it had been called on the command
1129 # line, so it ends up saved in the log header Save it in case we need
1133 # line, so it ends up saved in the log header Save it in case we need
1130 # to restore it...
1134 # to restore it...
1131 old_logfile = rc.opts.get('logfile','')
1135 old_logfile = rc.opts.get('logfile','')
1132 if logfname:
1136 if logfname:
1133 logfname = os.path.expanduser(logfname)
1137 logfname = os.path.expanduser(logfname)
1134 rc.opts.logfile = logfname
1138 rc.opts.logfile = logfname
1135 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
1139 loghead = self.shell.loghead_tpl % (rc.opts,rc.args)
1136 try:
1140 try:
1137 started = logger.logstart(logfname,loghead,logmode,
1141 started = logger.logstart(logfname,loghead,logmode,
1138 log_output,timestamp,log_raw_input)
1142 log_output,timestamp,log_raw_input)
1139 except:
1143 except:
1140 rc.opts.logfile = old_logfile
1144 rc.opts.logfile = old_logfile
1141 warn("Couldn't start log: %s" % sys.exc_info()[1])
1145 warn("Couldn't start log: %s" % sys.exc_info()[1])
1142 else:
1146 else:
1143 # log input history up to this point, optionally interleaving
1147 # log input history up to this point, optionally interleaving
1144 # output if requested
1148 # output if requested
1145
1149
1146 if timestamp:
1150 if timestamp:
1147 # disable timestamping for the previous history, since we've
1151 # disable timestamping for the previous history, since we've
1148 # lost those already (no time machine here).
1152 # lost those already (no time machine here).
1149 logger.timestamp = False
1153 logger.timestamp = False
1150
1154
1151 if log_raw_input:
1155 if log_raw_input:
1152 input_hist = self.shell.input_hist_raw
1156 input_hist = self.shell.input_hist_raw
1153 else:
1157 else:
1154 input_hist = self.shell.input_hist
1158 input_hist = self.shell.input_hist
1155
1159
1156 if log_output:
1160 if log_output:
1157 log_write = logger.log_write
1161 log_write = logger.log_write
1158 output_hist = self.shell.output_hist
1162 output_hist = self.shell.output_hist
1159 for n in range(1,len(input_hist)-1):
1163 for n in range(1,len(input_hist)-1):
1160 log_write(input_hist[n].rstrip())
1164 log_write(input_hist[n].rstrip())
1161 if n in output_hist:
1165 if n in output_hist:
1162 log_write(repr(output_hist[n]),'output')
1166 log_write(repr(output_hist[n]),'output')
1163 else:
1167 else:
1164 logger.log_write(input_hist[1:])
1168 logger.log_write(input_hist[1:])
1165 if timestamp:
1169 if timestamp:
1166 # re-enable timestamping
1170 # re-enable timestamping
1167 logger.timestamp = True
1171 logger.timestamp = True
1168
1172
1169 print ('Activating auto-logging. '
1173 print ('Activating auto-logging. '
1170 'Current session state plus future input saved.')
1174 'Current session state plus future input saved.')
1171 logger.logstate()
1175 logger.logstate()
1172
1176
1173 def magic_logstop(self,parameter_s=''):
1177 def magic_logstop(self,parameter_s=''):
1174 """Fully stop logging and close log file.
1178 """Fully stop logging and close log file.
1175
1179
1176 In order to start logging again, a new %logstart call needs to be made,
1180 In order to start logging again, a new %logstart call needs to be made,
1177 possibly (though not necessarily) with a new filename, mode and other
1181 possibly (though not necessarily) with a new filename, mode and other
1178 options."""
1182 options."""
1179 self.logger.logstop()
1183 self.logger.logstop()
1180
1184
1181 def magic_logoff(self,parameter_s=''):
1185 def magic_logoff(self,parameter_s=''):
1182 """Temporarily stop logging.
1186 """Temporarily stop logging.
1183
1187
1184 You must have previously started logging."""
1188 You must have previously started logging."""
1185 self.shell.logger.switch_log(0)
1189 self.shell.logger.switch_log(0)
1186
1190
1187 def magic_logon(self,parameter_s=''):
1191 def magic_logon(self,parameter_s=''):
1188 """Restart logging.
1192 """Restart logging.
1189
1193
1190 This function is for restarting logging which you've temporarily
1194 This function is for restarting logging which you've temporarily
1191 stopped with %logoff. For starting logging for the first time, you
1195 stopped with %logoff. For starting logging for the first time, you
1192 must use the %logstart function, which allows you to specify an
1196 must use the %logstart function, which allows you to specify an
1193 optional log filename."""
1197 optional log filename."""
1194
1198
1195 self.shell.logger.switch_log(1)
1199 self.shell.logger.switch_log(1)
1196
1200
1197 def magic_logstate(self,parameter_s=''):
1201 def magic_logstate(self,parameter_s=''):
1198 """Print the status of the logging system."""
1202 """Print the status of the logging system."""
1199
1203
1200 self.shell.logger.logstate()
1204 self.shell.logger.logstate()
1201
1205
1202 def magic_pdb(self, parameter_s=''):
1206 def magic_pdb(self, parameter_s=''):
1203 """Control the automatic calling of the pdb interactive debugger.
1207 """Control the automatic calling of the pdb interactive debugger.
1204
1208
1205 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1209 Call as '%pdb on', '%pdb 1', '%pdb off' or '%pdb 0'. If called without
1206 argument it works as a toggle.
1210 argument it works as a toggle.
1207
1211
1208 When an exception is triggered, IPython can optionally call the
1212 When an exception is triggered, IPython can optionally call the
1209 interactive pdb debugger after the traceback printout. %pdb toggles
1213 interactive pdb debugger after the traceback printout. %pdb toggles
1210 this feature on and off.
1214 this feature on and off.
1211
1215
1212 The initial state of this feature is set in your ipythonrc
1216 The initial state of this feature is set in your ipythonrc
1213 configuration file (the variable is called 'pdb').
1217 configuration file (the variable is called 'pdb').
1214
1218
1215 If you want to just activate the debugger AFTER an exception has fired,
1219 If you want to just activate the debugger AFTER an exception has fired,
1216 without having to type '%pdb on' and rerunning your code, you can use
1220 without having to type '%pdb on' and rerunning your code, you can use
1217 the %debug magic."""
1221 the %debug magic."""
1218
1222
1219 par = parameter_s.strip().lower()
1223 par = parameter_s.strip().lower()
1220
1224
1221 if par:
1225 if par:
1222 try:
1226 try:
1223 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1227 new_pdb = {'off':0,'0':0,'on':1,'1':1}[par]
1224 except KeyError:
1228 except KeyError:
1225 print ('Incorrect argument. Use on/1, off/0, '
1229 print ('Incorrect argument. Use on/1, off/0, '
1226 'or nothing for a toggle.')
1230 'or nothing for a toggle.')
1227 return
1231 return
1228 else:
1232 else:
1229 # toggle
1233 # toggle
1230 new_pdb = not self.shell.call_pdb
1234 new_pdb = not self.shell.call_pdb
1231
1235
1232 # set on the shell
1236 # set on the shell
1233 self.shell.call_pdb = new_pdb
1237 self.shell.call_pdb = new_pdb
1234 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1238 print 'Automatic pdb calling has been turned',on_off(new_pdb)
1235
1239
1236 def magic_debug(self, parameter_s=''):
1240 def magic_debug(self, parameter_s=''):
1237 """Activate the interactive debugger in post-mortem mode.
1241 """Activate the interactive debugger in post-mortem mode.
1238
1242
1239 If an exception has just occurred, this lets you inspect its stack
1243 If an exception has just occurred, this lets you inspect its stack
1240 frames interactively. Note that this will always work only on the last
1244 frames interactively. Note that this will always work only on the last
1241 traceback that occurred, so you must call this quickly after an
1245 traceback that occurred, so you must call this quickly after an
1242 exception that you wish to inspect has fired, because if another one
1246 exception that you wish to inspect has fired, because if another one
1243 occurs, it clobbers the previous one.
1247 occurs, it clobbers the previous one.
1244
1248
1245 If you want IPython to automatically do this on every exception, see
1249 If you want IPython to automatically do this on every exception, see
1246 the %pdb magic for more details.
1250 the %pdb magic for more details.
1247 """
1251 """
1248
1252
1249 self.shell.debugger(force=True)
1253 self.shell.debugger(force=True)
1250
1254
1251 @testdec.skip_doctest
1255 @testdec.skip_doctest
1252 def magic_prun(self, parameter_s ='',user_mode=1,
1256 def magic_prun(self, parameter_s ='',user_mode=1,
1253 opts=None,arg_lst=None,prog_ns=None):
1257 opts=None,arg_lst=None,prog_ns=None):
1254
1258
1255 """Run a statement through the python code profiler.
1259 """Run a statement through the python code profiler.
1256
1260
1257 Usage:
1261 Usage:
1258 %prun [options] statement
1262 %prun [options] statement
1259
1263
1260 The given statement (which doesn't require quote marks) is run via the
1264 The given statement (which doesn't require quote marks) is run via the
1261 python profiler in a manner similar to the profile.run() function.
1265 python profiler in a manner similar to the profile.run() function.
1262 Namespaces are internally managed to work correctly; profile.run
1266 Namespaces are internally managed to work correctly; profile.run
1263 cannot be used in IPython because it makes certain assumptions about
1267 cannot be used in IPython because it makes certain assumptions about
1264 namespaces which do not hold under IPython.
1268 namespaces which do not hold under IPython.
1265
1269
1266 Options:
1270 Options:
1267
1271
1268 -l <limit>: you can place restrictions on what or how much of the
1272 -l <limit>: you can place restrictions on what or how much of the
1269 profile gets printed. The limit value can be:
1273 profile gets printed. The limit value can be:
1270
1274
1271 * A string: only information for function names containing this string
1275 * A string: only information for function names containing this string
1272 is printed.
1276 is printed.
1273
1277
1274 * An integer: only these many lines are printed.
1278 * An integer: only these many lines are printed.
1275
1279
1276 * A float (between 0 and 1): this fraction of the report is printed
1280 * A float (between 0 and 1): this fraction of the report is printed
1277 (for example, use a limit of 0.4 to see the topmost 40% only).
1281 (for example, use a limit of 0.4 to see the topmost 40% only).
1278
1282
1279 You can combine several limits with repeated use of the option. For
1283 You can combine several limits with repeated use of the option. For
1280 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1284 example, '-l __init__ -l 5' will print only the topmost 5 lines of
1281 information about class constructors.
1285 information about class constructors.
1282
1286
1283 -r: return the pstats.Stats object generated by the profiling. This
1287 -r: return the pstats.Stats object generated by the profiling. This
1284 object has all the information about the profile in it, and you can
1288 object has all the information about the profile in it, and you can
1285 later use it for further analysis or in other functions.
1289 later use it for further analysis or in other functions.
1286
1290
1287 -s <key>: sort profile by given key. You can provide more than one key
1291 -s <key>: sort profile by given key. You can provide more than one key
1288 by using the option several times: '-s key1 -s key2 -s key3...'. The
1292 by using the option several times: '-s key1 -s key2 -s key3...'. The
1289 default sorting key is 'time'.
1293 default sorting key is 'time'.
1290
1294
1291 The following is copied verbatim from the profile documentation
1295 The following is copied verbatim from the profile documentation
1292 referenced below:
1296 referenced below:
1293
1297
1294 When more than one key is provided, additional keys are used as
1298 When more than one key is provided, additional keys are used as
1295 secondary criteria when the there is equality in all keys selected
1299 secondary criteria when the there is equality in all keys selected
1296 before them.
1300 before them.
1297
1301
1298 Abbreviations can be used for any key names, as long as the
1302 Abbreviations can be used for any key names, as long as the
1299 abbreviation is unambiguous. The following are the keys currently
1303 abbreviation is unambiguous. The following are the keys currently
1300 defined:
1304 defined:
1301
1305
1302 Valid Arg Meaning
1306 Valid Arg Meaning
1303 "calls" call count
1307 "calls" call count
1304 "cumulative" cumulative time
1308 "cumulative" cumulative time
1305 "file" file name
1309 "file" file name
1306 "module" file name
1310 "module" file name
1307 "pcalls" primitive call count
1311 "pcalls" primitive call count
1308 "line" line number
1312 "line" line number
1309 "name" function name
1313 "name" function name
1310 "nfl" name/file/line
1314 "nfl" name/file/line
1311 "stdname" standard name
1315 "stdname" standard name
1312 "time" internal time
1316 "time" internal time
1313
1317
1314 Note that all sorts on statistics are in descending order (placing
1318 Note that all sorts on statistics are in descending order (placing
1315 most time consuming items first), where as name, file, and line number
1319 most time consuming items first), where as name, file, and line number
1316 searches are in ascending order (i.e., alphabetical). The subtle
1320 searches are in ascending order (i.e., alphabetical). The subtle
1317 distinction between "nfl" and "stdname" is that the standard name is a
1321 distinction between "nfl" and "stdname" is that the standard name is a
1318 sort of the name as printed, which means that the embedded line
1322 sort of the name as printed, which means that the embedded line
1319 numbers get compared in an odd way. For example, lines 3, 20, and 40
1323 numbers get compared in an odd way. For example, lines 3, 20, and 40
1320 would (if the file names were the same) appear in the string order
1324 would (if the file names were the same) appear in the string order
1321 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1325 "20" "3" and "40". In contrast, "nfl" does a numeric compare of the
1322 line numbers. In fact, sort_stats("nfl") is the same as
1326 line numbers. In fact, sort_stats("nfl") is the same as
1323 sort_stats("name", "file", "line").
1327 sort_stats("name", "file", "line").
1324
1328
1325 -T <filename>: save profile results as shown on screen to a text
1329 -T <filename>: save profile results as shown on screen to a text
1326 file. The profile is still shown on screen.
1330 file. The profile is still shown on screen.
1327
1331
1328 -D <filename>: save (via dump_stats) profile statistics to given
1332 -D <filename>: save (via dump_stats) profile statistics to given
1329 filename. This data is in a format understod by the pstats module, and
1333 filename. This data is in a format understod by the pstats module, and
1330 is generated by a call to the dump_stats() method of profile
1334 is generated by a call to the dump_stats() method of profile
1331 objects. The profile is still shown on screen.
1335 objects. The profile is still shown on screen.
1332
1336
1333 If you want to run complete programs under the profiler's control, use
1337 If you want to run complete programs under the profiler's control, use
1334 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1338 '%run -p [prof_opts] filename.py [args to program]' where prof_opts
1335 contains profiler specific options as described here.
1339 contains profiler specific options as described here.
1336
1340
1337 You can read the complete documentation for the profile module with::
1341 You can read the complete documentation for the profile module with::
1338
1342
1339 In [1]: import profile; profile.help()
1343 In [1]: import profile; profile.help()
1340 """
1344 """
1341
1345
1342 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1346 opts_def = Struct(D=[''],l=[],s=['time'],T=[''])
1343 # protect user quote marks
1347 # protect user quote marks
1344 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1348 parameter_s = parameter_s.replace('"',r'\"').replace("'",r"\'")
1345
1349
1346 if user_mode: # regular user call
1350 if user_mode: # regular user call
1347 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1351 opts,arg_str = self.parse_options(parameter_s,'D:l:rs:T:',
1348 list_all=1)
1352 list_all=1)
1349 namespace = self.shell.user_ns
1353 namespace = self.shell.user_ns
1350 else: # called to run a program by %run -p
1354 else: # called to run a program by %run -p
1351 try:
1355 try:
1352 filename = get_py_filename(arg_lst[0])
1356 filename = get_py_filename(arg_lst[0])
1353 except IOError,msg:
1357 except IOError,msg:
1354 error(msg)
1358 error(msg)
1355 return
1359 return
1356
1360
1357 arg_str = 'execfile(filename,prog_ns)'
1361 arg_str = 'execfile(filename,prog_ns)'
1358 namespace = locals()
1362 namespace = locals()
1359
1363
1360 opts.merge(opts_def)
1364 opts.merge(opts_def)
1361
1365
1362 prof = profile.Profile()
1366 prof = profile.Profile()
1363 try:
1367 try:
1364 prof = prof.runctx(arg_str,namespace,namespace)
1368 prof = prof.runctx(arg_str,namespace,namespace)
1365 sys_exit = ''
1369 sys_exit = ''
1366 except SystemExit:
1370 except SystemExit:
1367 sys_exit = """*** SystemExit exception caught in code being profiled."""
1371 sys_exit = """*** SystemExit exception caught in code being profiled."""
1368
1372
1369 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1373 stats = pstats.Stats(prof).strip_dirs().sort_stats(*opts.s)
1370
1374
1371 lims = opts.l
1375 lims = opts.l
1372 if lims:
1376 if lims:
1373 lims = [] # rebuild lims with ints/floats/strings
1377 lims = [] # rebuild lims with ints/floats/strings
1374 for lim in opts.l:
1378 for lim in opts.l:
1375 try:
1379 try:
1376 lims.append(int(lim))
1380 lims.append(int(lim))
1377 except ValueError:
1381 except ValueError:
1378 try:
1382 try:
1379 lims.append(float(lim))
1383 lims.append(float(lim))
1380 except ValueError:
1384 except ValueError:
1381 lims.append(lim)
1385 lims.append(lim)
1382
1386
1383 # Trap output.
1387 # Trap output.
1384 stdout_trap = StringIO()
1388 stdout_trap = StringIO()
1385
1389
1386 if hasattr(stats,'stream'):
1390 if hasattr(stats,'stream'):
1387 # In newer versions of python, the stats object has a 'stream'
1391 # In newer versions of python, the stats object has a 'stream'
1388 # attribute to write into.
1392 # attribute to write into.
1389 stats.stream = stdout_trap
1393 stats.stream = stdout_trap
1390 stats.print_stats(*lims)
1394 stats.print_stats(*lims)
1391 else:
1395 else:
1392 # For older versions, we manually redirect stdout during printing
1396 # For older versions, we manually redirect stdout during printing
1393 sys_stdout = sys.stdout
1397 sys_stdout = sys.stdout
1394 try:
1398 try:
1395 sys.stdout = stdout_trap
1399 sys.stdout = stdout_trap
1396 stats.print_stats(*lims)
1400 stats.print_stats(*lims)
1397 finally:
1401 finally:
1398 sys.stdout = sys_stdout
1402 sys.stdout = sys_stdout
1399
1403
1400 output = stdout_trap.getvalue()
1404 output = stdout_trap.getvalue()
1401 output = output.rstrip()
1405 output = output.rstrip()
1402
1406
1403 page(output,screen_lines=self.shell.rc.screen_length)
1407 page(output,screen_lines=self.shell.rc.screen_length)
1404 print sys_exit,
1408 print sys_exit,
1405
1409
1406 dump_file = opts.D[0]
1410 dump_file = opts.D[0]
1407 text_file = opts.T[0]
1411 text_file = opts.T[0]
1408 if dump_file:
1412 if dump_file:
1409 prof.dump_stats(dump_file)
1413 prof.dump_stats(dump_file)
1410 print '\n*** Profile stats marshalled to file',\
1414 print '\n*** Profile stats marshalled to file',\
1411 `dump_file`+'.',sys_exit
1415 `dump_file`+'.',sys_exit
1412 if text_file:
1416 if text_file:
1413 pfile = file(text_file,'w')
1417 pfile = file(text_file,'w')
1414 pfile.write(output)
1418 pfile.write(output)
1415 pfile.close()
1419 pfile.close()
1416 print '\n*** Profile printout saved to text file',\
1420 print '\n*** Profile printout saved to text file',\
1417 `text_file`+'.',sys_exit
1421 `text_file`+'.',sys_exit
1418
1422
1419 if opts.has_key('r'):
1423 if opts.has_key('r'):
1420 return stats
1424 return stats
1421 else:
1425 else:
1422 return None
1426 return None
1423
1427
1424 @testdec.skip_doctest
1428 @testdec.skip_doctest
1425 def magic_run(self, parameter_s ='',runner=None):
1429 def magic_run(self, parameter_s ='',runner=None):
1426 """Run the named file inside IPython as a program.
1430 """Run the named file inside IPython as a program.
1427
1431
1428 Usage:\\
1432 Usage:\\
1429 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1433 %run [-n -i -t [-N<N>] -d [-b<N>] -p [profile options]] file [args]
1430
1434
1431 Parameters after the filename are passed as command-line arguments to
1435 Parameters after the filename are passed as command-line arguments to
1432 the program (put in sys.argv). Then, control returns to IPython's
1436 the program (put in sys.argv). Then, control returns to IPython's
1433 prompt.
1437 prompt.
1434
1438
1435 This is similar to running at a system prompt:\\
1439 This is similar to running at a system prompt:\\
1436 $ python file args\\
1440 $ python file args\\
1437 but with the advantage of giving you IPython's tracebacks, and of
1441 but with the advantage of giving you IPython's tracebacks, and of
1438 loading all variables into your interactive namespace for further use
1442 loading all variables into your interactive namespace for further use
1439 (unless -p is used, see below).
1443 (unless -p is used, see below).
1440
1444
1441 The file is executed in a namespace initially consisting only of
1445 The file is executed in a namespace initially consisting only of
1442 __name__=='__main__' and sys.argv constructed as indicated. It thus
1446 __name__=='__main__' and sys.argv constructed as indicated. It thus
1443 sees its environment as if it were being run as a stand-alone program
1447 sees its environment as if it were being run as a stand-alone program
1444 (except for sharing global objects such as previously imported
1448 (except for sharing global objects such as previously imported
1445 modules). But after execution, the IPython interactive namespace gets
1449 modules). But after execution, the IPython interactive namespace gets
1446 updated with all variables defined in the program (except for __name__
1450 updated with all variables defined in the program (except for __name__
1447 and sys.argv). This allows for very convenient loading of code for
1451 and sys.argv). This allows for very convenient loading of code for
1448 interactive work, while giving each program a 'clean sheet' to run in.
1452 interactive work, while giving each program a 'clean sheet' to run in.
1449
1453
1450 Options:
1454 Options:
1451
1455
1452 -n: __name__ is NOT set to '__main__', but to the running file's name
1456 -n: __name__ is NOT set to '__main__', but to the running file's name
1453 without extension (as python does under import). This allows running
1457 without extension (as python does under import). This allows running
1454 scripts and reloading the definitions in them without calling code
1458 scripts and reloading the definitions in them without calling code
1455 protected by an ' if __name__ == "__main__" ' clause.
1459 protected by an ' if __name__ == "__main__" ' clause.
1456
1460
1457 -i: run the file in IPython's namespace instead of an empty one. This
1461 -i: run the file in IPython's namespace instead of an empty one. This
1458 is useful if you are experimenting with code written in a text editor
1462 is useful if you are experimenting with code written in a text editor
1459 which depends on variables defined interactively.
1463 which depends on variables defined interactively.
1460
1464
1461 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1465 -e: ignore sys.exit() calls or SystemExit exceptions in the script
1462 being run. This is particularly useful if IPython is being used to
1466 being run. This is particularly useful if IPython is being used to
1463 run unittests, which always exit with a sys.exit() call. In such
1467 run unittests, which always exit with a sys.exit() call. In such
1464 cases you are interested in the output of the test results, not in
1468 cases you are interested in the output of the test results, not in
1465 seeing a traceback of the unittest module.
1469 seeing a traceback of the unittest module.
1466
1470
1467 -t: print timing information at the end of the run. IPython will give
1471 -t: print timing information at the end of the run. IPython will give
1468 you an estimated CPU time consumption for your script, which under
1472 you an estimated CPU time consumption for your script, which under
1469 Unix uses the resource module to avoid the wraparound problems of
1473 Unix uses the resource module to avoid the wraparound problems of
1470 time.clock(). Under Unix, an estimate of time spent on system tasks
1474 time.clock(). Under Unix, an estimate of time spent on system tasks
1471 is also given (for Windows platforms this is reported as 0.0).
1475 is also given (for Windows platforms this is reported as 0.0).
1472
1476
1473 If -t is given, an additional -N<N> option can be given, where <N>
1477 If -t is given, an additional -N<N> option can be given, where <N>
1474 must be an integer indicating how many times you want the script to
1478 must be an integer indicating how many times you want the script to
1475 run. The final timing report will include total and per run results.
1479 run. The final timing report will include total and per run results.
1476
1480
1477 For example (testing the script uniq_stable.py):
1481 For example (testing the script uniq_stable.py):
1478
1482
1479 In [1]: run -t uniq_stable
1483 In [1]: run -t uniq_stable
1480
1484
1481 IPython CPU timings (estimated):\\
1485 IPython CPU timings (estimated):\\
1482 User : 0.19597 s.\\
1486 User : 0.19597 s.\\
1483 System: 0.0 s.\\
1487 System: 0.0 s.\\
1484
1488
1485 In [2]: run -t -N5 uniq_stable
1489 In [2]: run -t -N5 uniq_stable
1486
1490
1487 IPython CPU timings (estimated):\\
1491 IPython CPU timings (estimated):\\
1488 Total runs performed: 5\\
1492 Total runs performed: 5\\
1489 Times : Total Per run\\
1493 Times : Total Per run\\
1490 User : 0.910862 s, 0.1821724 s.\\
1494 User : 0.910862 s, 0.1821724 s.\\
1491 System: 0.0 s, 0.0 s.
1495 System: 0.0 s, 0.0 s.
1492
1496
1493 -d: run your program under the control of pdb, the Python debugger.
1497 -d: run your program under the control of pdb, the Python debugger.
1494 This allows you to execute your program step by step, watch variables,
1498 This allows you to execute your program step by step, watch variables,
1495 etc. Internally, what IPython does is similar to calling:
1499 etc. Internally, what IPython does is similar to calling:
1496
1500
1497 pdb.run('execfile("YOURFILENAME")')
1501 pdb.run('execfile("YOURFILENAME")')
1498
1502
1499 with a breakpoint set on line 1 of your file. You can change the line
1503 with a breakpoint set on line 1 of your file. You can change the line
1500 number for this automatic breakpoint to be <N> by using the -bN option
1504 number for this automatic breakpoint to be <N> by using the -bN option
1501 (where N must be an integer). For example:
1505 (where N must be an integer). For example:
1502
1506
1503 %run -d -b40 myscript
1507 %run -d -b40 myscript
1504
1508
1505 will set the first breakpoint at line 40 in myscript.py. Note that
1509 will set the first breakpoint at line 40 in myscript.py. Note that
1506 the first breakpoint must be set on a line which actually does
1510 the first breakpoint must be set on a line which actually does
1507 something (not a comment or docstring) for it to stop execution.
1511 something (not a comment or docstring) for it to stop execution.
1508
1512
1509 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1513 When the pdb debugger starts, you will see a (Pdb) prompt. You must
1510 first enter 'c' (without qoutes) to start execution up to the first
1514 first enter 'c' (without qoutes) to start execution up to the first
1511 breakpoint.
1515 breakpoint.
1512
1516
1513 Entering 'help' gives information about the use of the debugger. You
1517 Entering 'help' gives information about the use of the debugger. You
1514 can easily see pdb's full documentation with "import pdb;pdb.help()"
1518 can easily see pdb's full documentation with "import pdb;pdb.help()"
1515 at a prompt.
1519 at a prompt.
1516
1520
1517 -p: run program under the control of the Python profiler module (which
1521 -p: run program under the control of the Python profiler module (which
1518 prints a detailed report of execution times, function calls, etc).
1522 prints a detailed report of execution times, function calls, etc).
1519
1523
1520 You can pass other options after -p which affect the behavior of the
1524 You can pass other options after -p which affect the behavior of the
1521 profiler itself. See the docs for %prun for details.
1525 profiler itself. See the docs for %prun for details.
1522
1526
1523 In this mode, the program's variables do NOT propagate back to the
1527 In this mode, the program's variables do NOT propagate back to the
1524 IPython interactive namespace (because they remain in the namespace
1528 IPython interactive namespace (because they remain in the namespace
1525 where the profiler executes them).
1529 where the profiler executes them).
1526
1530
1527 Internally this triggers a call to %prun, see its documentation for
1531 Internally this triggers a call to %prun, see its documentation for
1528 details on the options available specifically for profiling.
1532 details on the options available specifically for profiling.
1529
1533
1530 There is one special usage for which the text above doesn't apply:
1534 There is one special usage for which the text above doesn't apply:
1531 if the filename ends with .ipy, the file is run as ipython script,
1535 if the filename ends with .ipy, the file is run as ipython script,
1532 just as if the commands were written on IPython prompt.
1536 just as if the commands were written on IPython prompt.
1533 """
1537 """
1534
1538
1535 # get arguments and set sys.argv for program to be run.
1539 # get arguments and set sys.argv for program to be run.
1536 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1540 opts,arg_lst = self.parse_options(parameter_s,'nidtN:b:pD:l:rs:T:e',
1537 mode='list',list_all=1)
1541 mode='list',list_all=1)
1538
1542
1539 try:
1543 try:
1540 filename = get_py_filename(arg_lst[0])
1544 filename = get_py_filename(arg_lst[0])
1541 except IndexError:
1545 except IndexError:
1542 warn('you must provide at least a filename.')
1546 warn('you must provide at least a filename.')
1543 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1547 print '\n%run:\n',OInspect.getdoc(self.magic_run)
1544 return
1548 return
1545 except IOError,msg:
1549 except IOError,msg:
1546 error(msg)
1550 error(msg)
1547 return
1551 return
1548
1552
1549 if filename.lower().endswith('.ipy'):
1553 if filename.lower().endswith('.ipy'):
1550 self.api.runlines(open(filename).read())
1554 self.api.runlines(open(filename).read())
1551 return
1555 return
1552
1556
1553 # Control the response to exit() calls made by the script being run
1557 # Control the response to exit() calls made by the script being run
1554 exit_ignore = opts.has_key('e')
1558 exit_ignore = opts.has_key('e')
1555
1559
1556 # Make sure that the running script gets a proper sys.argv as if it
1560 # Make sure that the running script gets a proper sys.argv as if it
1557 # were run from a system shell.
1561 # were run from a system shell.
1558 save_argv = sys.argv # save it for later restoring
1562 save_argv = sys.argv # save it for later restoring
1559 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1563 sys.argv = [filename]+ arg_lst[1:] # put in the proper filename
1560
1564
1561 if opts.has_key('i'):
1565 if opts.has_key('i'):
1562 # Run in user's interactive namespace
1566 # Run in user's interactive namespace
1563 prog_ns = self.shell.user_ns
1567 prog_ns = self.shell.user_ns
1564 __name__save = self.shell.user_ns['__name__']
1568 __name__save = self.shell.user_ns['__name__']
1565 prog_ns['__name__'] = '__main__'
1569 prog_ns['__name__'] = '__main__'
1566 main_mod = FakeModule(prog_ns)
1570 main_mod = FakeModule(prog_ns)
1567 else:
1571 else:
1568 # Run in a fresh, empty namespace
1572 # Run in a fresh, empty namespace
1569 if opts.has_key('n'):
1573 if opts.has_key('n'):
1570 name = os.path.splitext(os.path.basename(filename))[0]
1574 name = os.path.splitext(os.path.basename(filename))[0]
1571 else:
1575 else:
1572 name = '__main__'
1576 name = '__main__'
1573 main_mod = FakeModule()
1577 main_mod = FakeModule()
1574 prog_ns = main_mod.__dict__
1578 prog_ns = main_mod.__dict__
1575 prog_ns['__name__'] = name
1579 prog_ns['__name__'] = name
1576 # The shell MUST hold a reference to main_mod so after %run exits,
1580 # The shell MUST hold a reference to main_mod so after %run exits,
1577 # the python deletion mechanism doesn't zero it out (leaving
1581 # the python deletion mechanism doesn't zero it out (leaving
1578 # dangling references)
1582 # dangling references)
1579 self.shell._user_main_modules.append(main_mod)
1583 self.shell._user_main_modules.append(main_mod)
1580
1584
1581 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1585 # Since '%run foo' emulates 'python foo.py' at the cmd line, we must
1582 # set the __file__ global in the script's namespace
1586 # set the __file__ global in the script's namespace
1583 prog_ns['__file__'] = filename
1587 prog_ns['__file__'] = filename
1584
1588
1585 # pickle fix. See iplib for an explanation. But we need to make sure
1589 # pickle fix. See iplib for an explanation. But we need to make sure
1586 # that, if we overwrite __main__, we replace it at the end
1590 # that, if we overwrite __main__, we replace it at the end
1587 main_mod_name = prog_ns['__name__']
1591 main_mod_name = prog_ns['__name__']
1588
1592
1589 if main_mod_name == '__main__':
1593 if main_mod_name == '__main__':
1590 restore_main = sys.modules['__main__']
1594 restore_main = sys.modules['__main__']
1591 else:
1595 else:
1592 restore_main = False
1596 restore_main = False
1593
1597
1594 # This needs to be undone at the end to prevent holding references to
1598 # This needs to be undone at the end to prevent holding references to
1595 # every single object ever created.
1599 # every single object ever created.
1596 sys.modules[main_mod_name] = main_mod
1600 sys.modules[main_mod_name] = main_mod
1597
1601
1598 stats = None
1602 stats = None
1599 try:
1603 try:
1600 self.shell.savehist()
1604 self.shell.savehist()
1601
1605
1602 if opts.has_key('p'):
1606 if opts.has_key('p'):
1603 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1607 stats = self.magic_prun('',0,opts,arg_lst,prog_ns)
1604 else:
1608 else:
1605 if opts.has_key('d'):
1609 if opts.has_key('d'):
1606 deb = Debugger.Pdb(self.shell.rc.colors)
1610 deb = Debugger.Pdb(self.shell.rc.colors)
1607 # reset Breakpoint state, which is moronically kept
1611 # reset Breakpoint state, which is moronically kept
1608 # in a class
1612 # in a class
1609 bdb.Breakpoint.next = 1
1613 bdb.Breakpoint.next = 1
1610 bdb.Breakpoint.bplist = {}
1614 bdb.Breakpoint.bplist = {}
1611 bdb.Breakpoint.bpbynumber = [None]
1615 bdb.Breakpoint.bpbynumber = [None]
1612 # Set an initial breakpoint to stop execution
1616 # Set an initial breakpoint to stop execution
1613 maxtries = 10
1617 maxtries = 10
1614 bp = int(opts.get('b',[1])[0])
1618 bp = int(opts.get('b',[1])[0])
1615 checkline = deb.checkline(filename,bp)
1619 checkline = deb.checkline(filename,bp)
1616 if not checkline:
1620 if not checkline:
1617 for bp in range(bp+1,bp+maxtries+1):
1621 for bp in range(bp+1,bp+maxtries+1):
1618 if deb.checkline(filename,bp):
1622 if deb.checkline(filename,bp):
1619 break
1623 break
1620 else:
1624 else:
1621 msg = ("\nI failed to find a valid line to set "
1625 msg = ("\nI failed to find a valid line to set "
1622 "a breakpoint\n"
1626 "a breakpoint\n"
1623 "after trying up to line: %s.\n"
1627 "after trying up to line: %s.\n"
1624 "Please set a valid breakpoint manually "
1628 "Please set a valid breakpoint manually "
1625 "with the -b option." % bp)
1629 "with the -b option." % bp)
1626 error(msg)
1630 error(msg)
1627 return
1631 return
1628 # if we find a good linenumber, set the breakpoint
1632 # if we find a good linenumber, set the breakpoint
1629 deb.do_break('%s:%s' % (filename,bp))
1633 deb.do_break('%s:%s' % (filename,bp))
1630 # Start file run
1634 # Start file run
1631 print "NOTE: Enter 'c' at the",
1635 print "NOTE: Enter 'c' at the",
1632 print "%s prompt to start your script." % deb.prompt
1636 print "%s prompt to start your script." % deb.prompt
1633 try:
1637 try:
1634 deb.run('execfile("%s")' % filename,prog_ns)
1638 deb.run('execfile("%s")' % filename,prog_ns)
1635
1639
1636 except:
1640 except:
1637 etype, value, tb = sys.exc_info()
1641 etype, value, tb = sys.exc_info()
1638 # Skip three frames in the traceback: the %run one,
1642 # Skip three frames in the traceback: the %run one,
1639 # one inside bdb.py, and the command-line typed by the
1643 # one inside bdb.py, and the command-line typed by the
1640 # user (run by exec in pdb itself).
1644 # user (run by exec in pdb itself).
1641 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1645 self.shell.InteractiveTB(etype,value,tb,tb_offset=3)
1642 else:
1646 else:
1643 if runner is None:
1647 if runner is None:
1644 runner = self.shell.safe_execfile
1648 runner = self.shell.safe_execfile
1645 if opts.has_key('t'):
1649 if opts.has_key('t'):
1646 # timed execution
1650 # timed execution
1647 try:
1651 try:
1648 nruns = int(opts['N'][0])
1652 nruns = int(opts['N'][0])
1649 if nruns < 1:
1653 if nruns < 1:
1650 error('Number of runs must be >=1')
1654 error('Number of runs must be >=1')
1651 return
1655 return
1652 except (KeyError):
1656 except (KeyError):
1653 nruns = 1
1657 nruns = 1
1654 if nruns == 1:
1658 if nruns == 1:
1655 t0 = clock2()
1659 t0 = clock2()
1656 runner(filename,prog_ns,prog_ns,
1660 runner(filename,prog_ns,prog_ns,
1657 exit_ignore=exit_ignore)
1661 exit_ignore=exit_ignore)
1658 t1 = clock2()
1662 t1 = clock2()
1659 t_usr = t1[0]-t0[0]
1663 t_usr = t1[0]-t0[0]
1660 t_sys = t1[1]-t1[1]
1664 t_sys = t1[1]-t1[1]
1661 print "\nIPython CPU timings (estimated):"
1665 print "\nIPython CPU timings (estimated):"
1662 print " User : %10s s." % t_usr
1666 print " User : %10s s." % t_usr
1663 print " System: %10s s." % t_sys
1667 print " System: %10s s." % t_sys
1664 else:
1668 else:
1665 runs = range(nruns)
1669 runs = range(nruns)
1666 t0 = clock2()
1670 t0 = clock2()
1667 for nr in runs:
1671 for nr in runs:
1668 runner(filename,prog_ns,prog_ns,
1672 runner(filename,prog_ns,prog_ns,
1669 exit_ignore=exit_ignore)
1673 exit_ignore=exit_ignore)
1670 t1 = clock2()
1674 t1 = clock2()
1671 t_usr = t1[0]-t0[0]
1675 t_usr = t1[0]-t0[0]
1672 t_sys = t1[1]-t1[1]
1676 t_sys = t1[1]-t1[1]
1673 print "\nIPython CPU timings (estimated):"
1677 print "\nIPython CPU timings (estimated):"
1674 print "Total runs performed:",nruns
1678 print "Total runs performed:",nruns
1675 print " Times : %10s %10s" % ('Total','Per run')
1679 print " Times : %10s %10s" % ('Total','Per run')
1676 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1680 print " User : %10s s, %10s s." % (t_usr,t_usr/nruns)
1677 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1681 print " System: %10s s, %10s s." % (t_sys,t_sys/nruns)
1678
1682
1679 else:
1683 else:
1680 # regular execution
1684 # regular execution
1681 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1685 runner(filename,prog_ns,prog_ns,exit_ignore=exit_ignore)
1682 if opts.has_key('i'):
1686 if opts.has_key('i'):
1683 self.shell.user_ns['__name__'] = __name__save
1687 self.shell.user_ns['__name__'] = __name__save
1684 else:
1688 else:
1685 # update IPython interactive namespace
1689 # update IPython interactive namespace
1686 del prog_ns['__name__']
1690 del prog_ns['__name__']
1687 self.shell.user_ns.update(prog_ns)
1691 self.shell.user_ns.update(prog_ns)
1688 finally:
1692 finally:
1689 # Ensure key global structures are restored
1693 # Ensure key global structures are restored
1690 sys.argv = save_argv
1694 sys.argv = save_argv
1691 if restore_main:
1695 if restore_main:
1692 sys.modules['__main__'] = restore_main
1696 sys.modules['__main__'] = restore_main
1693 else:
1697 else:
1694 # Remove from sys.modules the reference to main_mod we'd
1698 # Remove from sys.modules the reference to main_mod we'd
1695 # added. Otherwise it will trap references to objects
1699 # added. Otherwise it will trap references to objects
1696 # contained therein.
1700 # contained therein.
1697 del sys.modules[main_mod_name]
1701 del sys.modules[main_mod_name]
1698 self.shell.reloadhist()
1702 self.shell.reloadhist()
1699
1703
1700 return stats
1704 return stats
1701
1705
1702 def magic_runlog(self, parameter_s =''):
1706 def magic_runlog(self, parameter_s =''):
1703 """Run files as logs.
1707 """Run files as logs.
1704
1708
1705 Usage:\\
1709 Usage:\\
1706 %runlog file1 file2 ...
1710 %runlog file1 file2 ...
1707
1711
1708 Run the named files (treating them as log files) in sequence inside
1712 Run the named files (treating them as log files) in sequence inside
1709 the interpreter, and return to the prompt. This is much slower than
1713 the interpreter, and return to the prompt. This is much slower than
1710 %run because each line is executed in a try/except block, but it
1714 %run because each line is executed in a try/except block, but it
1711 allows running files with syntax errors in them.
1715 allows running files with syntax errors in them.
1712
1716
1713 Normally IPython will guess when a file is one of its own logfiles, so
1717 Normally IPython will guess when a file is one of its own logfiles, so
1714 you can typically use %run even for logs. This shorthand allows you to
1718 you can typically use %run even for logs. This shorthand allows you to
1715 force any file to be treated as a log file."""
1719 force any file to be treated as a log file."""
1716
1720
1717 for f in parameter_s.split():
1721 for f in parameter_s.split():
1718 self.shell.safe_execfile(f,self.shell.user_ns,
1722 self.shell.safe_execfile(f,self.shell.user_ns,
1719 self.shell.user_ns,islog=1)
1723 self.shell.user_ns,islog=1)
1720
1724
1721 @testdec.skip_doctest
1725 @testdec.skip_doctest
1722 def magic_timeit(self, parameter_s =''):
1726 def magic_timeit(self, parameter_s =''):
1723 """Time execution of a Python statement or expression
1727 """Time execution of a Python statement or expression
1724
1728
1725 Usage:\\
1729 Usage:\\
1726 %timeit [-n<N> -r<R> [-t|-c]] statement
1730 %timeit [-n<N> -r<R> [-t|-c]] statement
1727
1731
1728 Time execution of a Python statement or expression using the timeit
1732 Time execution of a Python statement or expression using the timeit
1729 module.
1733 module.
1730
1734
1731 Options:
1735 Options:
1732 -n<N>: execute the given statement <N> times in a loop. If this value
1736 -n<N>: execute the given statement <N> times in a loop. If this value
1733 is not given, a fitting value is chosen.
1737 is not given, a fitting value is chosen.
1734
1738
1735 -r<R>: repeat the loop iteration <R> times and take the best result.
1739 -r<R>: repeat the loop iteration <R> times and take the best result.
1736 Default: 3
1740 Default: 3
1737
1741
1738 -t: use time.time to measure the time, which is the default on Unix.
1742 -t: use time.time to measure the time, which is the default on Unix.
1739 This function measures wall time.
1743 This function measures wall time.
1740
1744
1741 -c: use time.clock to measure the time, which is the default on
1745 -c: use time.clock to measure the time, which is the default on
1742 Windows and measures wall time. On Unix, resource.getrusage is used
1746 Windows and measures wall time. On Unix, resource.getrusage is used
1743 instead and returns the CPU user time.
1747 instead and returns the CPU user time.
1744
1748
1745 -p<P>: use a precision of <P> digits to display the timing result.
1749 -p<P>: use a precision of <P> digits to display the timing result.
1746 Default: 3
1750 Default: 3
1747
1751
1748
1752
1749 Examples:
1753 Examples:
1750
1754
1751 In [1]: %timeit pass
1755 In [1]: %timeit pass
1752 10000000 loops, best of 3: 53.3 ns per loop
1756 10000000 loops, best of 3: 53.3 ns per loop
1753
1757
1754 In [2]: u = None
1758 In [2]: u = None
1755
1759
1756 In [3]: %timeit u is None
1760 In [3]: %timeit u is None
1757 10000000 loops, best of 3: 184 ns per loop
1761 10000000 loops, best of 3: 184 ns per loop
1758
1762
1759 In [4]: %timeit -r 4 u == None
1763 In [4]: %timeit -r 4 u == None
1760 1000000 loops, best of 4: 242 ns per loop
1764 1000000 loops, best of 4: 242 ns per loop
1761
1765
1762 In [5]: import time
1766 In [5]: import time
1763
1767
1764 In [6]: %timeit -n1 time.sleep(2)
1768 In [6]: %timeit -n1 time.sleep(2)
1765 1 loops, best of 3: 2 s per loop
1769 1 loops, best of 3: 2 s per loop
1766
1770
1767
1771
1768 The times reported by %timeit will be slightly higher than those
1772 The times reported by %timeit will be slightly higher than those
1769 reported by the timeit.py script when variables are accessed. This is
1773 reported by the timeit.py script when variables are accessed. This is
1770 due to the fact that %timeit executes the statement in the namespace
1774 due to the fact that %timeit executes the statement in the namespace
1771 of the shell, compared with timeit.py, which uses a single setup
1775 of the shell, compared with timeit.py, which uses a single setup
1772 statement to import function or create variables. Generally, the bias
1776 statement to import function or create variables. Generally, the bias
1773 does not matter as long as results from timeit.py are not mixed with
1777 does not matter as long as results from timeit.py are not mixed with
1774 those from %timeit."""
1778 those from %timeit."""
1775
1779
1776 import timeit
1780 import timeit
1777 import math
1781 import math
1778
1782
1779 units = [u"s", u"ms", u"\xb5s", u"ns"]
1783 units = [u"s", u"ms", u"\xb5s", u"ns"]
1780 scaling = [1, 1e3, 1e6, 1e9]
1784 scaling = [1, 1e3, 1e6, 1e9]
1781
1785
1782 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1786 opts, stmt = self.parse_options(parameter_s,'n:r:tcp:',
1783 posix=False)
1787 posix=False)
1784 if stmt == "":
1788 if stmt == "":
1785 return
1789 return
1786 timefunc = timeit.default_timer
1790 timefunc = timeit.default_timer
1787 number = int(getattr(opts, "n", 0))
1791 number = int(getattr(opts, "n", 0))
1788 repeat = int(getattr(opts, "r", timeit.default_repeat))
1792 repeat = int(getattr(opts, "r", timeit.default_repeat))
1789 precision = int(getattr(opts, "p", 3))
1793 precision = int(getattr(opts, "p", 3))
1790 if hasattr(opts, "t"):
1794 if hasattr(opts, "t"):
1791 timefunc = time.time
1795 timefunc = time.time
1792 if hasattr(opts, "c"):
1796 if hasattr(opts, "c"):
1793 timefunc = clock
1797 timefunc = clock
1794
1798
1795 timer = timeit.Timer(timer=timefunc)
1799 timer = timeit.Timer(timer=timefunc)
1796 # this code has tight coupling to the inner workings of timeit.Timer,
1800 # this code has tight coupling to the inner workings of timeit.Timer,
1797 # but is there a better way to achieve that the code stmt has access
1801 # but is there a better way to achieve that the code stmt has access
1798 # to the shell namespace?
1802 # to the shell namespace?
1799
1803
1800 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1804 src = timeit.template % {'stmt': timeit.reindent(stmt, 8),
1801 'setup': "pass"}
1805 'setup': "pass"}
1802 # Track compilation time so it can be reported if too long
1806 # Track compilation time so it can be reported if too long
1803 # Minimum time above which compilation time will be reported
1807 # Minimum time above which compilation time will be reported
1804 tc_min = 0.1
1808 tc_min = 0.1
1805
1809
1806 t0 = clock()
1810 t0 = clock()
1807 code = compile(src, "<magic-timeit>", "exec")
1811 code = compile(src, "<magic-timeit>", "exec")
1808 tc = clock()-t0
1812 tc = clock()-t0
1809
1813
1810 ns = {}
1814 ns = {}
1811 exec code in self.shell.user_ns, ns
1815 exec code in self.shell.user_ns, ns
1812 timer.inner = ns["inner"]
1816 timer.inner = ns["inner"]
1813
1817
1814 if number == 0:
1818 if number == 0:
1815 # determine number so that 0.2 <= total time < 2.0
1819 # determine number so that 0.2 <= total time < 2.0
1816 number = 1
1820 number = 1
1817 for i in range(1, 10):
1821 for i in range(1, 10):
1818 number *= 10
1822 number *= 10
1819 if timer.timeit(number) >= 0.2:
1823 if timer.timeit(number) >= 0.2:
1820 break
1824 break
1821
1825
1822 best = min(timer.repeat(repeat, number)) / number
1826 best = min(timer.repeat(repeat, number)) / number
1823
1827
1824 if best > 0.0:
1828 if best > 0.0:
1825 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1829 order = min(-int(math.floor(math.log10(best)) // 3), 3)
1826 else:
1830 else:
1827 order = 3
1831 order = 3
1828 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1832 print u"%d loops, best of %d: %.*g %s per loop" % (number, repeat,
1829 precision,
1833 precision,
1830 best * scaling[order],
1834 best * scaling[order],
1831 units[order])
1835 units[order])
1832 if tc > tc_min:
1836 if tc > tc_min:
1833 print "Compiler time: %.2f s" % tc
1837 print "Compiler time: %.2f s" % tc
1834
1838
1835 @testdec.skip_doctest
1839 @testdec.skip_doctest
1836 def magic_time(self,parameter_s = ''):
1840 def magic_time(self,parameter_s = ''):
1837 """Time execution of a Python statement or expression.
1841 """Time execution of a Python statement or expression.
1838
1842
1839 The CPU and wall clock times are printed, and the value of the
1843 The CPU and wall clock times are printed, and the value of the
1840 expression (if any) is returned. Note that under Win32, system time
1844 expression (if any) is returned. Note that under Win32, system time
1841 is always reported as 0, since it can not be measured.
1845 is always reported as 0, since it can not be measured.
1842
1846
1843 This function provides very basic timing functionality. In Python
1847 This function provides very basic timing functionality. In Python
1844 2.3, the timeit module offers more control and sophistication, so this
1848 2.3, the timeit module offers more control and sophistication, so this
1845 could be rewritten to use it (patches welcome).
1849 could be rewritten to use it (patches welcome).
1846
1850
1847 Some examples:
1851 Some examples:
1848
1852
1849 In [1]: time 2**128
1853 In [1]: time 2**128
1850 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1854 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1851 Wall time: 0.00
1855 Wall time: 0.00
1852 Out[1]: 340282366920938463463374607431768211456L
1856 Out[1]: 340282366920938463463374607431768211456L
1853
1857
1854 In [2]: n = 1000000
1858 In [2]: n = 1000000
1855
1859
1856 In [3]: time sum(range(n))
1860 In [3]: time sum(range(n))
1857 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1861 CPU times: user 1.20 s, sys: 0.05 s, total: 1.25 s
1858 Wall time: 1.37
1862 Wall time: 1.37
1859 Out[3]: 499999500000L
1863 Out[3]: 499999500000L
1860
1864
1861 In [4]: time print 'hello world'
1865 In [4]: time print 'hello world'
1862 hello world
1866 hello world
1863 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1867 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1864 Wall time: 0.00
1868 Wall time: 0.00
1865
1869
1866 Note that the time needed by Python to compile the given expression
1870 Note that the time needed by Python to compile the given expression
1867 will be reported if it is more than 0.1s. In this example, the
1871 will be reported if it is more than 0.1s. In this example, the
1868 actual exponentiation is done by Python at compilation time, so while
1872 actual exponentiation is done by Python at compilation time, so while
1869 the expression can take a noticeable amount of time to compute, that
1873 the expression can take a noticeable amount of time to compute, that
1870 time is purely due to the compilation:
1874 time is purely due to the compilation:
1871
1875
1872 In [5]: time 3**9999;
1876 In [5]: time 3**9999;
1873 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1877 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1874 Wall time: 0.00 s
1878 Wall time: 0.00 s
1875
1879
1876 In [6]: time 3**999999;
1880 In [6]: time 3**999999;
1877 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1881 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
1878 Wall time: 0.00 s
1882 Wall time: 0.00 s
1879 Compiler : 0.78 s
1883 Compiler : 0.78 s
1880 """
1884 """
1881
1885
1882 # fail immediately if the given expression can't be compiled
1886 # fail immediately if the given expression can't be compiled
1883
1887
1884 expr = self.shell.prefilter(parameter_s,False)
1888 expr = self.shell.prefilter(parameter_s,False)
1885
1889
1886 # Minimum time above which compilation time will be reported
1890 # Minimum time above which compilation time will be reported
1887 tc_min = 0.1
1891 tc_min = 0.1
1888
1892
1889 try:
1893 try:
1890 mode = 'eval'
1894 mode = 'eval'
1891 t0 = clock()
1895 t0 = clock()
1892 code = compile(expr,'<timed eval>',mode)
1896 code = compile(expr,'<timed eval>',mode)
1893 tc = clock()-t0
1897 tc = clock()-t0
1894 except SyntaxError:
1898 except SyntaxError:
1895 mode = 'exec'
1899 mode = 'exec'
1896 t0 = clock()
1900 t0 = clock()
1897 code = compile(expr,'<timed exec>',mode)
1901 code = compile(expr,'<timed exec>',mode)
1898 tc = clock()-t0
1902 tc = clock()-t0
1899 # skew measurement as little as possible
1903 # skew measurement as little as possible
1900 glob = self.shell.user_ns
1904 glob = self.shell.user_ns
1901 clk = clock2
1905 clk = clock2
1902 wtime = time.time
1906 wtime = time.time
1903 # time execution
1907 # time execution
1904 wall_st = wtime()
1908 wall_st = wtime()
1905 if mode=='eval':
1909 if mode=='eval':
1906 st = clk()
1910 st = clk()
1907 out = eval(code,glob)
1911 out = eval(code,glob)
1908 end = clk()
1912 end = clk()
1909 else:
1913 else:
1910 st = clk()
1914 st = clk()
1911 exec code in glob
1915 exec code in glob
1912 end = clk()
1916 end = clk()
1913 out = None
1917 out = None
1914 wall_end = wtime()
1918 wall_end = wtime()
1915 # Compute actual times and report
1919 # Compute actual times and report
1916 wall_time = wall_end-wall_st
1920 wall_time = wall_end-wall_st
1917 cpu_user = end[0]-st[0]
1921 cpu_user = end[0]-st[0]
1918 cpu_sys = end[1]-st[1]
1922 cpu_sys = end[1]-st[1]
1919 cpu_tot = cpu_user+cpu_sys
1923 cpu_tot = cpu_user+cpu_sys
1920 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1924 print "CPU times: user %.2f s, sys: %.2f s, total: %.2f s" % \
1921 (cpu_user,cpu_sys,cpu_tot)
1925 (cpu_user,cpu_sys,cpu_tot)
1922 print "Wall time: %.2f s" % wall_time
1926 print "Wall time: %.2f s" % wall_time
1923 if tc > tc_min:
1927 if tc > tc_min:
1924 print "Compiler : %.2f s" % tc
1928 print "Compiler : %.2f s" % tc
1925 return out
1929 return out
1926
1930
1927 @testdec.skip_doctest
1931 @testdec.skip_doctest
1928 def magic_macro(self,parameter_s = ''):
1932 def magic_macro(self,parameter_s = ''):
1929 """Define a set of input lines as a macro for future re-execution.
1933 """Define a set of input lines as a macro for future re-execution.
1930
1934
1931 Usage:\\
1935 Usage:\\
1932 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1936 %macro [options] name n1-n2 n3-n4 ... n5 .. n6 ...
1933
1937
1934 Options:
1938 Options:
1935
1939
1936 -r: use 'raw' input. By default, the 'processed' history is used,
1940 -r: use 'raw' input. By default, the 'processed' history is used,
1937 so that magics are loaded in their transformed version to valid
1941 so that magics are loaded in their transformed version to valid
1938 Python. If this option is given, the raw input as typed as the
1942 Python. If this option is given, the raw input as typed as the
1939 command line is used instead.
1943 command line is used instead.
1940
1944
1941 This will define a global variable called `name` which is a string
1945 This will define a global variable called `name` which is a string
1942 made of joining the slices and lines you specify (n1,n2,... numbers
1946 made of joining the slices and lines you specify (n1,n2,... numbers
1943 above) from your input history into a single string. This variable
1947 above) from your input history into a single string. This variable
1944 acts like an automatic function which re-executes those lines as if
1948 acts like an automatic function which re-executes those lines as if
1945 you had typed them. You just type 'name' at the prompt and the code
1949 you had typed them. You just type 'name' at the prompt and the code
1946 executes.
1950 executes.
1947
1951
1948 The notation for indicating number ranges is: n1-n2 means 'use line
1952 The notation for indicating number ranges is: n1-n2 means 'use line
1949 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1953 numbers n1,...n2' (the endpoint is included). That is, '5-7' means
1950 using the lines numbered 5,6 and 7.
1954 using the lines numbered 5,6 and 7.
1951
1955
1952 Note: as a 'hidden' feature, you can also use traditional python slice
1956 Note: as a 'hidden' feature, you can also use traditional python slice
1953 notation, where N:M means numbers N through M-1.
1957 notation, where N:M means numbers N through M-1.
1954
1958
1955 For example, if your history contains (%hist prints it):
1959 For example, if your history contains (%hist prints it):
1956
1960
1957 44: x=1
1961 44: x=1
1958 45: y=3
1962 45: y=3
1959 46: z=x+y
1963 46: z=x+y
1960 47: print x
1964 47: print x
1961 48: a=5
1965 48: a=5
1962 49: print 'x',x,'y',y
1966 49: print 'x',x,'y',y
1963
1967
1964 you can create a macro with lines 44 through 47 (included) and line 49
1968 you can create a macro with lines 44 through 47 (included) and line 49
1965 called my_macro with:
1969 called my_macro with:
1966
1970
1967 In [55]: %macro my_macro 44-47 49
1971 In [55]: %macro my_macro 44-47 49
1968
1972
1969 Now, typing `my_macro` (without quotes) will re-execute all this code
1973 Now, typing `my_macro` (without quotes) will re-execute all this code
1970 in one pass.
1974 in one pass.
1971
1975
1972 You don't need to give the line-numbers in order, and any given line
1976 You don't need to give the line-numbers in order, and any given line
1973 number can appear multiple times. You can assemble macros with any
1977 number can appear multiple times. You can assemble macros with any
1974 lines from your input history in any order.
1978 lines from your input history in any order.
1975
1979
1976 The macro is a simple object which holds its value in an attribute,
1980 The macro is a simple object which holds its value in an attribute,
1977 but IPython's display system checks for macros and executes them as
1981 but IPython's display system checks for macros and executes them as
1978 code instead of printing them when you type their name.
1982 code instead of printing them when you type their name.
1979
1983
1980 You can view a macro's contents by explicitly printing it with:
1984 You can view a macro's contents by explicitly printing it with:
1981
1985
1982 'print macro_name'.
1986 'print macro_name'.
1983
1987
1984 For one-off cases which DON'T contain magic function calls in them you
1988 For one-off cases which DON'T contain magic function calls in them you
1985 can obtain similar results by explicitly executing slices from your
1989 can obtain similar results by explicitly executing slices from your
1986 input history with:
1990 input history with:
1987
1991
1988 In [60]: exec In[44:48]+In[49]"""
1992 In [60]: exec In[44:48]+In[49]"""
1989
1993
1990 opts,args = self.parse_options(parameter_s,'r',mode='list')
1994 opts,args = self.parse_options(parameter_s,'r',mode='list')
1991 if not args:
1995 if not args:
1992 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
1996 macs = [k for k,v in self.shell.user_ns.items() if isinstance(v, Macro)]
1993 macs.sort()
1997 macs.sort()
1994 return macs
1998 return macs
1995 if len(args) == 1:
1999 if len(args) == 1:
1996 raise UsageError(
2000 raise UsageError(
1997 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
2001 "%macro insufficient args; usage '%macro name n1-n2 n3-4...")
1998 name,ranges = args[0], args[1:]
2002 name,ranges = args[0], args[1:]
1999
2003
2000 #print 'rng',ranges # dbg
2004 #print 'rng',ranges # dbg
2001 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2005 lines = self.extract_input_slices(ranges,opts.has_key('r'))
2002 macro = Macro(lines)
2006 macro = Macro(lines)
2003 self.shell.user_ns.update({name:macro})
2007 self.shell.user_ns.update({name:macro})
2004 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2008 print 'Macro `%s` created. To execute, type its name (without quotes).' % name
2005 print 'Macro contents:'
2009 print 'Macro contents:'
2006 print macro,
2010 print macro,
2007
2011
2008 def magic_save(self,parameter_s = ''):
2012 def magic_save(self,parameter_s = ''):
2009 """Save a set of lines to a given filename.
2013 """Save a set of lines to a given filename.
2010
2014
2011 Usage:\\
2015 Usage:\\
2012 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2016 %save [options] filename n1-n2 n3-n4 ... n5 .. n6 ...
2013
2017
2014 Options:
2018 Options:
2015
2019
2016 -r: use 'raw' input. By default, the 'processed' history is used,
2020 -r: use 'raw' input. By default, the 'processed' history is used,
2017 so that magics are loaded in their transformed version to valid
2021 so that magics are loaded in their transformed version to valid
2018 Python. If this option is given, the raw input as typed as the
2022 Python. If this option is given, the raw input as typed as the
2019 command line is used instead.
2023 command line is used instead.
2020
2024
2021 This function uses the same syntax as %macro for line extraction, but
2025 This function uses the same syntax as %macro for line extraction, but
2022 instead of creating a macro it saves the resulting string to the
2026 instead of creating a macro it saves the resulting string to the
2023 filename you specify.
2027 filename you specify.
2024
2028
2025 It adds a '.py' extension to the file if you don't do so yourself, and
2029 It adds a '.py' extension to the file if you don't do so yourself, and
2026 it asks for confirmation before overwriting existing files."""
2030 it asks for confirmation before overwriting existing files."""
2027
2031
2028 opts,args = self.parse_options(parameter_s,'r',mode='list')
2032 opts,args = self.parse_options(parameter_s,'r',mode='list')
2029 fname,ranges = args[0], args[1:]
2033 fname,ranges = args[0], args[1:]
2030 if not fname.endswith('.py'):
2034 if not fname.endswith('.py'):
2031 fname += '.py'
2035 fname += '.py'
2032 if os.path.isfile(fname):
2036 if os.path.isfile(fname):
2033 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2037 ans = raw_input('File `%s` exists. Overwrite (y/[N])? ' % fname)
2034 if ans.lower() not in ['y','yes']:
2038 if ans.lower() not in ['y','yes']:
2035 print 'Operation cancelled.'
2039 print 'Operation cancelled.'
2036 return
2040 return
2037 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2041 cmds = ''.join(self.extract_input_slices(ranges,opts.has_key('r')))
2038 f = file(fname,'w')
2042 f = file(fname,'w')
2039 f.write(cmds)
2043 f.write(cmds)
2040 f.close()
2044 f.close()
2041 print 'The following commands were written to file `%s`:' % fname
2045 print 'The following commands were written to file `%s`:' % fname
2042 print cmds
2046 print cmds
2043
2047
2044 def _edit_macro(self,mname,macro):
2048 def _edit_macro(self,mname,macro):
2045 """open an editor with the macro data in a file"""
2049 """open an editor with the macro data in a file"""
2046 filename = self.shell.mktempfile(macro.value)
2050 filename = self.shell.mktempfile(macro.value)
2047 self.shell.hooks.editor(filename)
2051 self.shell.hooks.editor(filename)
2048
2052
2049 # and make a new macro object, to replace the old one
2053 # and make a new macro object, to replace the old one
2050 mfile = open(filename)
2054 mfile = open(filename)
2051 mvalue = mfile.read()
2055 mvalue = mfile.read()
2052 mfile.close()
2056 mfile.close()
2053 self.shell.user_ns[mname] = Macro(mvalue)
2057 self.shell.user_ns[mname] = Macro(mvalue)
2054
2058
2055 def magic_ed(self,parameter_s=''):
2059 def magic_ed(self,parameter_s=''):
2056 """Alias to %edit."""
2060 """Alias to %edit."""
2057 return self.magic_edit(parameter_s)
2061 return self.magic_edit(parameter_s)
2058
2062
2059 @testdec.skip_doctest
2063 @testdec.skip_doctest
2060 def magic_edit(self,parameter_s='',last_call=['','']):
2064 def magic_edit(self,parameter_s='',last_call=['','']):
2061 """Bring up an editor and execute the resulting code.
2065 """Bring up an editor and execute the resulting code.
2062
2066
2063 Usage:
2067 Usage:
2064 %edit [options] [args]
2068 %edit [options] [args]
2065
2069
2066 %edit runs IPython's editor hook. The default version of this hook is
2070 %edit runs IPython's editor hook. The default version of this hook is
2067 set to call the __IPYTHON__.rc.editor command. This is read from your
2071 set to call the __IPYTHON__.rc.editor command. This is read from your
2068 environment variable $EDITOR. If this isn't found, it will default to
2072 environment variable $EDITOR. If this isn't found, it will default to
2069 vi under Linux/Unix and to notepad under Windows. See the end of this
2073 vi under Linux/Unix and to notepad under Windows. See the end of this
2070 docstring for how to change the editor hook.
2074 docstring for how to change the editor hook.
2071
2075
2072 You can also set the value of this editor via the command line option
2076 You can also set the value of this editor via the command line option
2073 '-editor' or in your ipythonrc file. This is useful if you wish to use
2077 '-editor' or in your ipythonrc file. This is useful if you wish to use
2074 specifically for IPython an editor different from your typical default
2078 specifically for IPython an editor different from your typical default
2075 (and for Windows users who typically don't set environment variables).
2079 (and for Windows users who typically don't set environment variables).
2076
2080
2077 This command allows you to conveniently edit multi-line code right in
2081 This command allows you to conveniently edit multi-line code right in
2078 your IPython session.
2082 your IPython session.
2079
2083
2080 If called without arguments, %edit opens up an empty editor with a
2084 If called without arguments, %edit opens up an empty editor with a
2081 temporary file and will execute the contents of this file when you
2085 temporary file and will execute the contents of this file when you
2082 close it (don't forget to save it!).
2086 close it (don't forget to save it!).
2083
2087
2084
2088
2085 Options:
2089 Options:
2086
2090
2087 -n <number>: open the editor at a specified line number. By default,
2091 -n <number>: open the editor at a specified line number. By default,
2088 the IPython editor hook uses the unix syntax 'editor +N filename', but
2092 the IPython editor hook uses the unix syntax 'editor +N filename', but
2089 you can configure this by providing your own modified hook if your
2093 you can configure this by providing your own modified hook if your
2090 favorite editor supports line-number specifications with a different
2094 favorite editor supports line-number specifications with a different
2091 syntax.
2095 syntax.
2092
2096
2093 -p: this will call the editor with the same data as the previous time
2097 -p: this will call the editor with the same data as the previous time
2094 it was used, regardless of how long ago (in your current session) it
2098 it was used, regardless of how long ago (in your current session) it
2095 was.
2099 was.
2096
2100
2097 -r: use 'raw' input. This option only applies to input taken from the
2101 -r: use 'raw' input. This option only applies to input taken from the
2098 user's history. By default, the 'processed' history is used, so that
2102 user's history. By default, the 'processed' history is used, so that
2099 magics are loaded in their transformed version to valid Python. If
2103 magics are loaded in their transformed version to valid Python. If
2100 this option is given, the raw input as typed as the command line is
2104 this option is given, the raw input as typed as the command line is
2101 used instead. When you exit the editor, it will be executed by
2105 used instead. When you exit the editor, it will be executed by
2102 IPython's own processor.
2106 IPython's own processor.
2103
2107
2104 -x: do not execute the edited code immediately upon exit. This is
2108 -x: do not execute the edited code immediately upon exit. This is
2105 mainly useful if you are editing programs which need to be called with
2109 mainly useful if you are editing programs which need to be called with
2106 command line arguments, which you can then do using %run.
2110 command line arguments, which you can then do using %run.
2107
2111
2108
2112
2109 Arguments:
2113 Arguments:
2110
2114
2111 If arguments are given, the following possibilites exist:
2115 If arguments are given, the following possibilites exist:
2112
2116
2113 - The arguments are numbers or pairs of colon-separated numbers (like
2117 - The arguments are numbers or pairs of colon-separated numbers (like
2114 1 4:8 9). These are interpreted as lines of previous input to be
2118 1 4:8 9). These are interpreted as lines of previous input to be
2115 loaded into the editor. The syntax is the same of the %macro command.
2119 loaded into the editor. The syntax is the same of the %macro command.
2116
2120
2117 - If the argument doesn't start with a number, it is evaluated as a
2121 - If the argument doesn't start with a number, it is evaluated as a
2118 variable and its contents loaded into the editor. You can thus edit
2122 variable and its contents loaded into the editor. You can thus edit
2119 any string which contains python code (including the result of
2123 any string which contains python code (including the result of
2120 previous edits).
2124 previous edits).
2121
2125
2122 - If the argument is the name of an object (other than a string),
2126 - If the argument is the name of an object (other than a string),
2123 IPython will try to locate the file where it was defined and open the
2127 IPython will try to locate the file where it was defined and open the
2124 editor at the point where it is defined. You can use `%edit function`
2128 editor at the point where it is defined. You can use `%edit function`
2125 to load an editor exactly at the point where 'function' is defined,
2129 to load an editor exactly at the point where 'function' is defined,
2126 edit it and have the file be executed automatically.
2130 edit it and have the file be executed automatically.
2127
2131
2128 If the object is a macro (see %macro for details), this opens up your
2132 If the object is a macro (see %macro for details), this opens up your
2129 specified editor with a temporary file containing the macro's data.
2133 specified editor with a temporary file containing the macro's data.
2130 Upon exit, the macro is reloaded with the contents of the file.
2134 Upon exit, the macro is reloaded with the contents of the file.
2131
2135
2132 Note: opening at an exact line is only supported under Unix, and some
2136 Note: opening at an exact line is only supported under Unix, and some
2133 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2137 editors (like kedit and gedit up to Gnome 2.8) do not understand the
2134 '+NUMBER' parameter necessary for this feature. Good editors like
2138 '+NUMBER' parameter necessary for this feature. Good editors like
2135 (X)Emacs, vi, jed, pico and joe all do.
2139 (X)Emacs, vi, jed, pico and joe all do.
2136
2140
2137 - If the argument is not found as a variable, IPython will look for a
2141 - If the argument is not found as a variable, IPython will look for a
2138 file with that name (adding .py if necessary) and load it into the
2142 file with that name (adding .py if necessary) and load it into the
2139 editor. It will execute its contents with execfile() when you exit,
2143 editor. It will execute its contents with execfile() when you exit,
2140 loading any code in the file into your interactive namespace.
2144 loading any code in the file into your interactive namespace.
2141
2145
2142 After executing your code, %edit will return as output the code you
2146 After executing your code, %edit will return as output the code you
2143 typed in the editor (except when it was an existing file). This way
2147 typed in the editor (except when it was an existing file). This way
2144 you can reload the code in further invocations of %edit as a variable,
2148 you can reload the code in further invocations of %edit as a variable,
2145 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2149 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
2146 the output.
2150 the output.
2147
2151
2148 Note that %edit is also available through the alias %ed.
2152 Note that %edit is also available through the alias %ed.
2149
2153
2150 This is an example of creating a simple function inside the editor and
2154 This is an example of creating a simple function inside the editor and
2151 then modifying it. First, start up the editor:
2155 then modifying it. First, start up the editor:
2152
2156
2153 In [1]: ed
2157 In [1]: ed
2154 Editing... done. Executing edited code...
2158 Editing... done. Executing edited code...
2155 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2159 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
2156
2160
2157 We can then call the function foo():
2161 We can then call the function foo():
2158
2162
2159 In [2]: foo()
2163 In [2]: foo()
2160 foo() was defined in an editing session
2164 foo() was defined in an editing session
2161
2165
2162 Now we edit foo. IPython automatically loads the editor with the
2166 Now we edit foo. IPython automatically loads the editor with the
2163 (temporary) file where foo() was previously defined:
2167 (temporary) file where foo() was previously defined:
2164
2168
2165 In [3]: ed foo
2169 In [3]: ed foo
2166 Editing... done. Executing edited code...
2170 Editing... done. Executing edited code...
2167
2171
2168 And if we call foo() again we get the modified version:
2172 And if we call foo() again we get the modified version:
2169
2173
2170 In [4]: foo()
2174 In [4]: foo()
2171 foo() has now been changed!
2175 foo() has now been changed!
2172
2176
2173 Here is an example of how to edit a code snippet successive
2177 Here is an example of how to edit a code snippet successive
2174 times. First we call the editor:
2178 times. First we call the editor:
2175
2179
2176 In [5]: ed
2180 In [5]: ed
2177 Editing... done. Executing edited code...
2181 Editing... done. Executing edited code...
2178 hello
2182 hello
2179 Out[5]: "print 'hello'n"
2183 Out[5]: "print 'hello'n"
2180
2184
2181 Now we call it again with the previous output (stored in _):
2185 Now we call it again with the previous output (stored in _):
2182
2186
2183 In [6]: ed _
2187 In [6]: ed _
2184 Editing... done. Executing edited code...
2188 Editing... done. Executing edited code...
2185 hello world
2189 hello world
2186 Out[6]: "print 'hello world'n"
2190 Out[6]: "print 'hello world'n"
2187
2191
2188 Now we call it with the output #8 (stored in _8, also as Out[8]):
2192 Now we call it with the output #8 (stored in _8, also as Out[8]):
2189
2193
2190 In [7]: ed _8
2194 In [7]: ed _8
2191 Editing... done. Executing edited code...
2195 Editing... done. Executing edited code...
2192 hello again
2196 hello again
2193 Out[7]: "print 'hello again'n"
2197 Out[7]: "print 'hello again'n"
2194
2198
2195
2199
2196 Changing the default editor hook:
2200 Changing the default editor hook:
2197
2201
2198 If you wish to write your own editor hook, you can put it in a
2202 If you wish to write your own editor hook, you can put it in a
2199 configuration file which you load at startup time. The default hook
2203 configuration file which you load at startup time. The default hook
2200 is defined in the IPython.hooks module, and you can use that as a
2204 is defined in the IPython.hooks module, and you can use that as a
2201 starting example for further modifications. That file also has
2205 starting example for further modifications. That file also has
2202 general instructions on how to set a new hook for use once you've
2206 general instructions on how to set a new hook for use once you've
2203 defined it."""
2207 defined it."""
2204
2208
2205 # FIXME: This function has become a convoluted mess. It needs a
2209 # FIXME: This function has become a convoluted mess. It needs a
2206 # ground-up rewrite with clean, simple logic.
2210 # ground-up rewrite with clean, simple logic.
2207
2211
2208 def make_filename(arg):
2212 def make_filename(arg):
2209 "Make a filename from the given args"
2213 "Make a filename from the given args"
2210 try:
2214 try:
2211 filename = get_py_filename(arg)
2215 filename = get_py_filename(arg)
2212 except IOError:
2216 except IOError:
2213 if args.endswith('.py'):
2217 if args.endswith('.py'):
2214 filename = arg
2218 filename = arg
2215 else:
2219 else:
2216 filename = None
2220 filename = None
2217 return filename
2221 return filename
2218
2222
2219 # custom exceptions
2223 # custom exceptions
2220 class DataIsObject(Exception): pass
2224 class DataIsObject(Exception): pass
2221
2225
2222 opts,args = self.parse_options(parameter_s,'prxn:')
2226 opts,args = self.parse_options(parameter_s,'prxn:')
2223 # Set a few locals from the options for convenience:
2227 # Set a few locals from the options for convenience:
2224 opts_p = opts.has_key('p')
2228 opts_p = opts.has_key('p')
2225 opts_r = opts.has_key('r')
2229 opts_r = opts.has_key('r')
2226
2230
2227 # Default line number value
2231 # Default line number value
2228 lineno = opts.get('n',None)
2232 lineno = opts.get('n',None)
2229
2233
2230 if opts_p:
2234 if opts_p:
2231 args = '_%s' % last_call[0]
2235 args = '_%s' % last_call[0]
2232 if not self.shell.user_ns.has_key(args):
2236 if not self.shell.user_ns.has_key(args):
2233 args = last_call[1]
2237 args = last_call[1]
2234
2238
2235 # use last_call to remember the state of the previous call, but don't
2239 # use last_call to remember the state of the previous call, but don't
2236 # let it be clobbered by successive '-p' calls.
2240 # let it be clobbered by successive '-p' calls.
2237 try:
2241 try:
2238 last_call[0] = self.shell.outputcache.prompt_count
2242 last_call[0] = self.shell.outputcache.prompt_count
2239 if not opts_p:
2243 if not opts_p:
2240 last_call[1] = parameter_s
2244 last_call[1] = parameter_s
2241 except:
2245 except:
2242 pass
2246 pass
2243
2247
2244 # by default this is done with temp files, except when the given
2248 # by default this is done with temp files, except when the given
2245 # arg is a filename
2249 # arg is a filename
2246 use_temp = 1
2250 use_temp = 1
2247
2251
2248 if re.match(r'\d',args):
2252 if re.match(r'\d',args):
2249 # Mode where user specifies ranges of lines, like in %macro.
2253 # Mode where user specifies ranges of lines, like in %macro.
2250 # This means that you can't edit files whose names begin with
2254 # This means that you can't edit files whose names begin with
2251 # numbers this way. Tough.
2255 # numbers this way. Tough.
2252 ranges = args.split()
2256 ranges = args.split()
2253 data = ''.join(self.extract_input_slices(ranges,opts_r))
2257 data = ''.join(self.extract_input_slices(ranges,opts_r))
2254 elif args.endswith('.py'):
2258 elif args.endswith('.py'):
2255 filename = make_filename(args)
2259 filename = make_filename(args)
2256 data = ''
2260 data = ''
2257 use_temp = 0
2261 use_temp = 0
2258 elif args:
2262 elif args:
2259 try:
2263 try:
2260 # Load the parameter given as a variable. If not a string,
2264 # Load the parameter given as a variable. If not a string,
2261 # process it as an object instead (below)
2265 # process it as an object instead (below)
2262
2266
2263 #print '*** args',args,'type',type(args) # dbg
2267 #print '*** args',args,'type',type(args) # dbg
2264 data = eval(args,self.shell.user_ns)
2268 data = eval(args,self.shell.user_ns)
2265 if not type(data) in StringTypes:
2269 if not type(data) in StringTypes:
2266 raise DataIsObject
2270 raise DataIsObject
2267
2271
2268 except (NameError,SyntaxError):
2272 except (NameError,SyntaxError):
2269 # given argument is not a variable, try as a filename
2273 # given argument is not a variable, try as a filename
2270 filename = make_filename(args)
2274 filename = make_filename(args)
2271 if filename is None:
2275 if filename is None:
2272 warn("Argument given (%s) can't be found as a variable "
2276 warn("Argument given (%s) can't be found as a variable "
2273 "or as a filename." % args)
2277 "or as a filename." % args)
2274 return
2278 return
2275
2279
2276 data = ''
2280 data = ''
2277 use_temp = 0
2281 use_temp = 0
2278 except DataIsObject:
2282 except DataIsObject:
2279
2283
2280 # macros have a special edit function
2284 # macros have a special edit function
2281 if isinstance(data,Macro):
2285 if isinstance(data,Macro):
2282 self._edit_macro(args,data)
2286 self._edit_macro(args,data)
2283 return
2287 return
2284
2288
2285 # For objects, try to edit the file where they are defined
2289 # For objects, try to edit the file where they are defined
2286 try:
2290 try:
2287 filename = inspect.getabsfile(data)
2291 filename = inspect.getabsfile(data)
2288 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2292 if 'fakemodule' in filename.lower() and inspect.isclass(data):
2289 # class created by %edit? Try to find source
2293 # class created by %edit? Try to find source
2290 # by looking for method definitions instead, the
2294 # by looking for method definitions instead, the
2291 # __module__ in those classes is FakeModule.
2295 # __module__ in those classes is FakeModule.
2292 attrs = [getattr(data, aname) for aname in dir(data)]
2296 attrs = [getattr(data, aname) for aname in dir(data)]
2293 for attr in attrs:
2297 for attr in attrs:
2294 if not inspect.ismethod(attr):
2298 if not inspect.ismethod(attr):
2295 continue
2299 continue
2296 filename = inspect.getabsfile(attr)
2300 filename = inspect.getabsfile(attr)
2297 if filename and 'fakemodule' not in filename.lower():
2301 if filename and 'fakemodule' not in filename.lower():
2298 # change the attribute to be the edit target instead
2302 # change the attribute to be the edit target instead
2299 data = attr
2303 data = attr
2300 break
2304 break
2301
2305
2302 datafile = 1
2306 datafile = 1
2303 except TypeError:
2307 except TypeError:
2304 filename = make_filename(args)
2308 filename = make_filename(args)
2305 datafile = 1
2309 datafile = 1
2306 warn('Could not find file where `%s` is defined.\n'
2310 warn('Could not find file where `%s` is defined.\n'
2307 'Opening a file named `%s`' % (args,filename))
2311 'Opening a file named `%s`' % (args,filename))
2308 # Now, make sure we can actually read the source (if it was in
2312 # Now, make sure we can actually read the source (if it was in
2309 # a temp file it's gone by now).
2313 # a temp file it's gone by now).
2310 if datafile:
2314 if datafile:
2311 try:
2315 try:
2312 if lineno is None:
2316 if lineno is None:
2313 lineno = inspect.getsourcelines(data)[1]
2317 lineno = inspect.getsourcelines(data)[1]
2314 except IOError:
2318 except IOError:
2315 filename = make_filename(args)
2319 filename = make_filename(args)
2316 if filename is None:
2320 if filename is None:
2317 warn('The file `%s` where `%s` was defined cannot '
2321 warn('The file `%s` where `%s` was defined cannot '
2318 'be read.' % (filename,data))
2322 'be read.' % (filename,data))
2319 return
2323 return
2320 use_temp = 0
2324 use_temp = 0
2321 else:
2325 else:
2322 data = ''
2326 data = ''
2323
2327
2324 if use_temp:
2328 if use_temp:
2325 filename = self.shell.mktempfile(data)
2329 filename = self.shell.mktempfile(data)
2326 print 'IPython will make a temporary file named:',filename
2330 print 'IPython will make a temporary file named:',filename
2327
2331
2328 # do actual editing here
2332 # do actual editing here
2329 print 'Editing...',
2333 print 'Editing...',
2330 sys.stdout.flush()
2334 sys.stdout.flush()
2335 try:
2331 self.shell.hooks.editor(filename,lineno)
2336 self.shell.hooks.editor(filename,lineno)
2337 except IPython.ipapi.TryNext:
2338 warn('Could not open editor')
2339 return
2340
2341 # XXX TODO: should this be generalized for all string vars?
2342 # For now, this is special-cased to blocks created by cpaste
2343 if args.strip() == 'pasted_block':
2344 self.shell.user_ns['pasted_block'] = file_read(filename)
2345
2332 if opts.has_key('x'): # -x prevents actual execution
2346 if opts.has_key('x'): # -x prevents actual execution
2333 print
2347 print
2334 else:
2348 else:
2335 print 'done. Executing edited code...'
2349 print 'done. Executing edited code...'
2336 if opts_r:
2350 if opts_r:
2337 self.shell.runlines(file_read(filename))
2351 self.shell.runlines(file_read(filename))
2338 else:
2352 else:
2339 self.shell.safe_execfile(filename,self.shell.user_ns,
2353 self.shell.safe_execfile(filename,self.shell.user_ns,
2340 self.shell.user_ns)
2354 self.shell.user_ns)
2355
2356
2341 if use_temp:
2357 if use_temp:
2342 try:
2358 try:
2343 return open(filename).read()
2359 return open(filename).read()
2344 except IOError,msg:
2360 except IOError,msg:
2345 if msg.filename == filename:
2361 if msg.filename == filename:
2346 warn('File not found. Did you forget to save?')
2362 warn('File not found. Did you forget to save?')
2347 return
2363 return
2348 else:
2364 else:
2349 self.shell.showtraceback()
2365 self.shell.showtraceback()
2350
2366
2351 def magic_xmode(self,parameter_s = ''):
2367 def magic_xmode(self,parameter_s = ''):
2352 """Switch modes for the exception handlers.
2368 """Switch modes for the exception handlers.
2353
2369
2354 Valid modes: Plain, Context and Verbose.
2370 Valid modes: Plain, Context and Verbose.
2355
2371
2356 If called without arguments, acts as a toggle."""
2372 If called without arguments, acts as a toggle."""
2357
2373
2358 def xmode_switch_err(name):
2374 def xmode_switch_err(name):
2359 warn('Error changing %s exception modes.\n%s' %
2375 warn('Error changing %s exception modes.\n%s' %
2360 (name,sys.exc_info()[1]))
2376 (name,sys.exc_info()[1]))
2361
2377
2362 shell = self.shell
2378 shell = self.shell
2363 new_mode = parameter_s.strip().capitalize()
2379 new_mode = parameter_s.strip().capitalize()
2364 try:
2380 try:
2365 shell.InteractiveTB.set_mode(mode=new_mode)
2381 shell.InteractiveTB.set_mode(mode=new_mode)
2366 print 'Exception reporting mode:',shell.InteractiveTB.mode
2382 print 'Exception reporting mode:',shell.InteractiveTB.mode
2367 except:
2383 except:
2368 xmode_switch_err('user')
2384 xmode_switch_err('user')
2369
2385
2370 # threaded shells use a special handler in sys.excepthook
2386 # threaded shells use a special handler in sys.excepthook
2371 if shell.isthreaded:
2387 if shell.isthreaded:
2372 try:
2388 try:
2373 shell.sys_excepthook.set_mode(mode=new_mode)
2389 shell.sys_excepthook.set_mode(mode=new_mode)
2374 except:
2390 except:
2375 xmode_switch_err('threaded')
2391 xmode_switch_err('threaded')
2376
2392
2377 def magic_colors(self,parameter_s = ''):
2393 def magic_colors(self,parameter_s = ''):
2378 """Switch color scheme for prompts, info system and exception handlers.
2394 """Switch color scheme for prompts, info system and exception handlers.
2379
2395
2380 Currently implemented schemes: NoColor, Linux, LightBG.
2396 Currently implemented schemes: NoColor, Linux, LightBG.
2381
2397
2382 Color scheme names are not case-sensitive."""
2398 Color scheme names are not case-sensitive."""
2383
2399
2384 def color_switch_err(name):
2400 def color_switch_err(name):
2385 warn('Error changing %s color schemes.\n%s' %
2401 warn('Error changing %s color schemes.\n%s' %
2386 (name,sys.exc_info()[1]))
2402 (name,sys.exc_info()[1]))
2387
2403
2388
2404
2389 new_scheme = parameter_s.strip()
2405 new_scheme = parameter_s.strip()
2390 if not new_scheme:
2406 if not new_scheme:
2391 raise UsageError(
2407 raise UsageError(
2392 "%colors: you must specify a color scheme. See '%colors?'")
2408 "%colors: you must specify a color scheme. See '%colors?'")
2393 return
2409 return
2394 # local shortcut
2410 # local shortcut
2395 shell = self.shell
2411 shell = self.shell
2396
2412
2397 import IPython.rlineimpl as readline
2413 import IPython.rlineimpl as readline
2398
2414
2399 if not readline.have_readline and sys.platform == "win32":
2415 if not readline.have_readline and sys.platform == "win32":
2400 msg = """\
2416 msg = """\
2401 Proper color support under MS Windows requires the pyreadline library.
2417 Proper color support under MS Windows requires the pyreadline library.
2402 You can find it at:
2418 You can find it at:
2403 http://ipython.scipy.org/moin/PyReadline/Intro
2419 http://ipython.scipy.org/moin/PyReadline/Intro
2404 Gary's readline needs the ctypes module, from:
2420 Gary's readline needs the ctypes module, from:
2405 http://starship.python.net/crew/theller/ctypes
2421 http://starship.python.net/crew/theller/ctypes
2406 (Note that ctypes is already part of Python versions 2.5 and newer).
2422 (Note that ctypes is already part of Python versions 2.5 and newer).
2407
2423
2408 Defaulting color scheme to 'NoColor'"""
2424 Defaulting color scheme to 'NoColor'"""
2409 new_scheme = 'NoColor'
2425 new_scheme = 'NoColor'
2410 warn(msg)
2426 warn(msg)
2411
2427
2412 # readline option is 0
2428 # readline option is 0
2413 if not shell.has_readline:
2429 if not shell.has_readline:
2414 new_scheme = 'NoColor'
2430 new_scheme = 'NoColor'
2415
2431
2416 # Set prompt colors
2432 # Set prompt colors
2417 try:
2433 try:
2418 shell.outputcache.set_colors(new_scheme)
2434 shell.outputcache.set_colors(new_scheme)
2419 except:
2435 except:
2420 color_switch_err('prompt')
2436 color_switch_err('prompt')
2421 else:
2437 else:
2422 shell.rc.colors = \
2438 shell.rc.colors = \
2423 shell.outputcache.color_table.active_scheme_name
2439 shell.outputcache.color_table.active_scheme_name
2424 # Set exception colors
2440 # Set exception colors
2425 try:
2441 try:
2426 shell.InteractiveTB.set_colors(scheme = new_scheme)
2442 shell.InteractiveTB.set_colors(scheme = new_scheme)
2427 shell.SyntaxTB.set_colors(scheme = new_scheme)
2443 shell.SyntaxTB.set_colors(scheme = new_scheme)
2428 except:
2444 except:
2429 color_switch_err('exception')
2445 color_switch_err('exception')
2430
2446
2431 # threaded shells use a verbose traceback in sys.excepthook
2447 # threaded shells use a verbose traceback in sys.excepthook
2432 if shell.isthreaded:
2448 if shell.isthreaded:
2433 try:
2449 try:
2434 shell.sys_excepthook.set_colors(scheme=new_scheme)
2450 shell.sys_excepthook.set_colors(scheme=new_scheme)
2435 except:
2451 except:
2436 color_switch_err('system exception handler')
2452 color_switch_err('system exception handler')
2437
2453
2438 # Set info (for 'object?') colors
2454 # Set info (for 'object?') colors
2439 if shell.rc.color_info:
2455 if shell.rc.color_info:
2440 try:
2456 try:
2441 shell.inspector.set_active_scheme(new_scheme)
2457 shell.inspector.set_active_scheme(new_scheme)
2442 except:
2458 except:
2443 color_switch_err('object inspector')
2459 color_switch_err('object inspector')
2444 else:
2460 else:
2445 shell.inspector.set_active_scheme('NoColor')
2461 shell.inspector.set_active_scheme('NoColor')
2446
2462
2447 def magic_color_info(self,parameter_s = ''):
2463 def magic_color_info(self,parameter_s = ''):
2448 """Toggle color_info.
2464 """Toggle color_info.
2449
2465
2450 The color_info configuration parameter controls whether colors are
2466 The color_info configuration parameter controls whether colors are
2451 used for displaying object details (by things like %psource, %pfile or
2467 used for displaying object details (by things like %psource, %pfile or
2452 the '?' system). This function toggles this value with each call.
2468 the '?' system). This function toggles this value with each call.
2453
2469
2454 Note that unless you have a fairly recent pager (less works better
2470 Note that unless you have a fairly recent pager (less works better
2455 than more) in your system, using colored object information displays
2471 than more) in your system, using colored object information displays
2456 will not work properly. Test it and see."""
2472 will not work properly. Test it and see."""
2457
2473
2458 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2474 self.shell.rc.color_info = 1 - self.shell.rc.color_info
2459 self.magic_colors(self.shell.rc.colors)
2475 self.magic_colors(self.shell.rc.colors)
2460 print 'Object introspection functions have now coloring:',
2476 print 'Object introspection functions have now coloring:',
2461 print ['OFF','ON'][self.shell.rc.color_info]
2477 print ['OFF','ON'][self.shell.rc.color_info]
2462
2478
2463 def magic_Pprint(self, parameter_s=''):
2479 def magic_Pprint(self, parameter_s=''):
2464 """Toggle pretty printing on/off."""
2480 """Toggle pretty printing on/off."""
2465
2481
2466 self.shell.rc.pprint = 1 - self.shell.rc.pprint
2482 self.shell.rc.pprint = 1 - self.shell.rc.pprint
2467 print 'Pretty printing has been turned', \
2483 print 'Pretty printing has been turned', \
2468 ['OFF','ON'][self.shell.rc.pprint]
2484 ['OFF','ON'][self.shell.rc.pprint]
2469
2485
2470 def magic_exit(self, parameter_s=''):
2486 def magic_exit(self, parameter_s=''):
2471 """Exit IPython, confirming if configured to do so.
2487 """Exit IPython, confirming if configured to do so.
2472
2488
2473 You can configure whether IPython asks for confirmation upon exit by
2489 You can configure whether IPython asks for confirmation upon exit by
2474 setting the confirm_exit flag in the ipythonrc file."""
2490 setting the confirm_exit flag in the ipythonrc file."""
2475
2491
2476 self.shell.exit()
2492 self.shell.exit()
2477
2493
2478 def magic_quit(self, parameter_s=''):
2494 def magic_quit(self, parameter_s=''):
2479 """Exit IPython, confirming if configured to do so (like %exit)"""
2495 """Exit IPython, confirming if configured to do so (like %exit)"""
2480
2496
2481 self.shell.exit()
2497 self.shell.exit()
2482
2498
2483 def magic_Exit(self, parameter_s=''):
2499 def magic_Exit(self, parameter_s=''):
2484 """Exit IPython without confirmation."""
2500 """Exit IPython without confirmation."""
2485
2501
2486 self.shell.ask_exit()
2502 self.shell.ask_exit()
2487
2503
2488 #......................................................................
2504 #......................................................................
2489 # Functions to implement unix shell-type things
2505 # Functions to implement unix shell-type things
2490
2506
2491 @testdec.skip_doctest
2507 @testdec.skip_doctest
2492 def magic_alias(self, parameter_s = ''):
2508 def magic_alias(self, parameter_s = ''):
2493 """Define an alias for a system command.
2509 """Define an alias for a system command.
2494
2510
2495 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2511 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
2496
2512
2497 Then, typing 'alias_name params' will execute the system command 'cmd
2513 Then, typing 'alias_name params' will execute the system command 'cmd
2498 params' (from your underlying operating system).
2514 params' (from your underlying operating system).
2499
2515
2500 Aliases have lower precedence than magic functions and Python normal
2516 Aliases have lower precedence than magic functions and Python normal
2501 variables, so if 'foo' is both a Python variable and an alias, the
2517 variables, so if 'foo' is both a Python variable and an alias, the
2502 alias can not be executed until 'del foo' removes the Python variable.
2518 alias can not be executed until 'del foo' removes the Python variable.
2503
2519
2504 You can use the %l specifier in an alias definition to represent the
2520 You can use the %l specifier in an alias definition to represent the
2505 whole line when the alias is called. For example:
2521 whole line when the alias is called. For example:
2506
2522
2507 In [2]: alias all echo "Input in brackets: <%l>"
2523 In [2]: alias all echo "Input in brackets: <%l>"
2508 In [3]: all hello world
2524 In [3]: all hello world
2509 Input in brackets: <hello world>
2525 Input in brackets: <hello world>
2510
2526
2511 You can also define aliases with parameters using %s specifiers (one
2527 You can also define aliases with parameters using %s specifiers (one
2512 per parameter):
2528 per parameter):
2513
2529
2514 In [1]: alias parts echo first %s second %s
2530 In [1]: alias parts echo first %s second %s
2515 In [2]: %parts A B
2531 In [2]: %parts A B
2516 first A second B
2532 first A second B
2517 In [3]: %parts A
2533 In [3]: %parts A
2518 Incorrect number of arguments: 2 expected.
2534 Incorrect number of arguments: 2 expected.
2519 parts is an alias to: 'echo first %s second %s'
2535 parts is an alias to: 'echo first %s second %s'
2520
2536
2521 Note that %l and %s are mutually exclusive. You can only use one or
2537 Note that %l and %s are mutually exclusive. You can only use one or
2522 the other in your aliases.
2538 the other in your aliases.
2523
2539
2524 Aliases expand Python variables just like system calls using ! or !!
2540 Aliases expand Python variables just like system calls using ! or !!
2525 do: all expressions prefixed with '$' get expanded. For details of
2541 do: all expressions prefixed with '$' get expanded. For details of
2526 the semantic rules, see PEP-215:
2542 the semantic rules, see PEP-215:
2527 http://www.python.org/peps/pep-0215.html. This is the library used by
2543 http://www.python.org/peps/pep-0215.html. This is the library used by
2528 IPython for variable expansion. If you want to access a true shell
2544 IPython for variable expansion. If you want to access a true shell
2529 variable, an extra $ is necessary to prevent its expansion by IPython:
2545 variable, an extra $ is necessary to prevent its expansion by IPython:
2530
2546
2531 In [6]: alias show echo
2547 In [6]: alias show echo
2532 In [7]: PATH='A Python string'
2548 In [7]: PATH='A Python string'
2533 In [8]: show $PATH
2549 In [8]: show $PATH
2534 A Python string
2550 A Python string
2535 In [9]: show $$PATH
2551 In [9]: show $$PATH
2536 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2552 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
2537
2553
2538 You can use the alias facility to acess all of $PATH. See the %rehash
2554 You can use the alias facility to acess all of $PATH. See the %rehash
2539 and %rehashx functions, which automatically create aliases for the
2555 and %rehashx functions, which automatically create aliases for the
2540 contents of your $PATH.
2556 contents of your $PATH.
2541
2557
2542 If called with no parameters, %alias prints the current alias table."""
2558 If called with no parameters, %alias prints the current alias table."""
2543
2559
2544 par = parameter_s.strip()
2560 par = parameter_s.strip()
2545 if not par:
2561 if not par:
2546 stored = self.db.get('stored_aliases', {} )
2562 stored = self.db.get('stored_aliases', {} )
2547 atab = self.shell.alias_table
2563 atab = self.shell.alias_table
2548 aliases = atab.keys()
2564 aliases = atab.keys()
2549 aliases.sort()
2565 aliases.sort()
2550 res = []
2566 res = []
2551 showlast = []
2567 showlast = []
2552 for alias in aliases:
2568 for alias in aliases:
2553 special = False
2569 special = False
2554 try:
2570 try:
2555 tgt = atab[alias][1]
2571 tgt = atab[alias][1]
2556 except (TypeError, AttributeError):
2572 except (TypeError, AttributeError):
2557 # unsubscriptable? probably a callable
2573 # unsubscriptable? probably a callable
2558 tgt = atab[alias]
2574 tgt = atab[alias]
2559 special = True
2575 special = True
2560 # 'interesting' aliases
2576 # 'interesting' aliases
2561 if (alias in stored or
2577 if (alias in stored or
2562 special or
2578 special or
2563 alias.lower() != os.path.splitext(tgt)[0].lower() or
2579 alias.lower() != os.path.splitext(tgt)[0].lower() or
2564 ' ' in tgt):
2580 ' ' in tgt):
2565 showlast.append((alias, tgt))
2581 showlast.append((alias, tgt))
2566 else:
2582 else:
2567 res.append((alias, tgt ))
2583 res.append((alias, tgt ))
2568
2584
2569 # show most interesting aliases last
2585 # show most interesting aliases last
2570 res.extend(showlast)
2586 res.extend(showlast)
2571 print "Total number of aliases:",len(aliases)
2587 print "Total number of aliases:",len(aliases)
2572 return res
2588 return res
2573 try:
2589 try:
2574 alias,cmd = par.split(None,1)
2590 alias,cmd = par.split(None,1)
2575 except:
2591 except:
2576 print OInspect.getdoc(self.magic_alias)
2592 print OInspect.getdoc(self.magic_alias)
2577 else:
2593 else:
2578 nargs = cmd.count('%s')
2594 nargs = cmd.count('%s')
2579 if nargs>0 and cmd.find('%l')>=0:
2595 if nargs>0 and cmd.find('%l')>=0:
2580 error('The %s and %l specifiers are mutually exclusive '
2596 error('The %s and %l specifiers are mutually exclusive '
2581 'in alias definitions.')
2597 'in alias definitions.')
2582 else: # all looks OK
2598 else: # all looks OK
2583 self.shell.alias_table[alias] = (nargs,cmd)
2599 self.shell.alias_table[alias] = (nargs,cmd)
2584 self.shell.alias_table_validate(verbose=0)
2600 self.shell.alias_table_validate(verbose=0)
2585 # end magic_alias
2601 # end magic_alias
2586
2602
2587 def magic_unalias(self, parameter_s = ''):
2603 def magic_unalias(self, parameter_s = ''):
2588 """Remove an alias"""
2604 """Remove an alias"""
2589
2605
2590 aname = parameter_s.strip()
2606 aname = parameter_s.strip()
2591 if aname in self.shell.alias_table:
2607 if aname in self.shell.alias_table:
2592 del self.shell.alias_table[aname]
2608 del self.shell.alias_table[aname]
2593 stored = self.db.get('stored_aliases', {} )
2609 stored = self.db.get('stored_aliases', {} )
2594 if aname in stored:
2610 if aname in stored:
2595 print "Removing %stored alias",aname
2611 print "Removing %stored alias",aname
2596 del stored[aname]
2612 del stored[aname]
2597 self.db['stored_aliases'] = stored
2613 self.db['stored_aliases'] = stored
2598
2614
2599
2615
2600 def magic_rehashx(self, parameter_s = ''):
2616 def magic_rehashx(self, parameter_s = ''):
2601 """Update the alias table with all executable files in $PATH.
2617 """Update the alias table with all executable files in $PATH.
2602
2618
2603 This version explicitly checks that every entry in $PATH is a file
2619 This version explicitly checks that every entry in $PATH is a file
2604 with execute access (os.X_OK), so it is much slower than %rehash.
2620 with execute access (os.X_OK), so it is much slower than %rehash.
2605
2621
2606 Under Windows, it checks executability as a match agains a
2622 Under Windows, it checks executability as a match agains a
2607 '|'-separated string of extensions, stored in the IPython config
2623 '|'-separated string of extensions, stored in the IPython config
2608 variable win_exec_ext. This defaults to 'exe|com|bat'.
2624 variable win_exec_ext. This defaults to 'exe|com|bat'.
2609
2625
2610 This function also resets the root module cache of module completer,
2626 This function also resets the root module cache of module completer,
2611 used on slow filesystems.
2627 used on slow filesystems.
2612 """
2628 """
2613
2629
2614
2630
2615 ip = self.api
2631 ip = self.api
2616
2632
2617 # for the benefit of module completer in ipy_completers.py
2633 # for the benefit of module completer in ipy_completers.py
2618 del ip.db['rootmodules']
2634 del ip.db['rootmodules']
2619
2635
2620 path = [os.path.abspath(os.path.expanduser(p)) for p in
2636 path = [os.path.abspath(os.path.expanduser(p)) for p in
2621 os.environ.get('PATH','').split(os.pathsep)]
2637 os.environ.get('PATH','').split(os.pathsep)]
2622 path = filter(os.path.isdir,path)
2638 path = filter(os.path.isdir,path)
2623
2639
2624 alias_table = self.shell.alias_table
2640 alias_table = self.shell.alias_table
2625 syscmdlist = []
2641 syscmdlist = []
2626 if os.name == 'posix':
2642 if os.name == 'posix':
2627 isexec = lambda fname:os.path.isfile(fname) and \
2643 isexec = lambda fname:os.path.isfile(fname) and \
2628 os.access(fname,os.X_OK)
2644 os.access(fname,os.X_OK)
2629 else:
2645 else:
2630
2646
2631 try:
2647 try:
2632 winext = os.environ['pathext'].replace(';','|').replace('.','')
2648 winext = os.environ['pathext'].replace(';','|').replace('.','')
2633 except KeyError:
2649 except KeyError:
2634 winext = 'exe|com|bat|py'
2650 winext = 'exe|com|bat|py'
2635 if 'py' not in winext:
2651 if 'py' not in winext:
2636 winext += '|py'
2652 winext += '|py'
2637 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2653 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
2638 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2654 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
2639 savedir = os.getcwd()
2655 savedir = os.getcwd()
2640 try:
2656 try:
2641 # write the whole loop for posix/Windows so we don't have an if in
2657 # write the whole loop for posix/Windows so we don't have an if in
2642 # the innermost part
2658 # the innermost part
2643 if os.name == 'posix':
2659 if os.name == 'posix':
2644 for pdir in path:
2660 for pdir in path:
2645 os.chdir(pdir)
2661 os.chdir(pdir)
2646 for ff in os.listdir(pdir):
2662 for ff in os.listdir(pdir):
2647 if isexec(ff) and ff not in self.shell.no_alias:
2663 if isexec(ff) and ff not in self.shell.no_alias:
2648 # each entry in the alias table must be (N,name),
2664 # each entry in the alias table must be (N,name),
2649 # where N is the number of positional arguments of the
2665 # where N is the number of positional arguments of the
2650 # alias.
2666 # alias.
2651 alias_table[ff] = (0,ff)
2667 # Dots will be removed from alias names, since ipython
2668 # assumes names with dots to be python code
2669 alias_table[ff.replace('.','')] = (0,ff)
2652 syscmdlist.append(ff)
2670 syscmdlist.append(ff)
2653 else:
2671 else:
2654 for pdir in path:
2672 for pdir in path:
2655 os.chdir(pdir)
2673 os.chdir(pdir)
2656 for ff in os.listdir(pdir):
2674 for ff in os.listdir(pdir):
2657 base, ext = os.path.splitext(ff)
2675 base, ext = os.path.splitext(ff)
2658 if isexec(ff) and base.lower() not in self.shell.no_alias:
2676 if isexec(ff) and base.lower() not in self.shell.no_alias:
2659 if ext.lower() == '.exe':
2677 if ext.lower() == '.exe':
2660 ff = base
2678 ff = base
2661 alias_table[base.lower()] = (0,ff)
2679 alias_table[base.lower().replace('.','')] = (0,ff)
2662 syscmdlist.append(ff)
2680 syscmdlist.append(ff)
2663 # Make sure the alias table doesn't contain keywords or builtins
2681 # Make sure the alias table doesn't contain keywords or builtins
2664 self.shell.alias_table_validate()
2682 self.shell.alias_table_validate()
2665 # Call again init_auto_alias() so we get 'rm -i' and other
2683 # Call again init_auto_alias() so we get 'rm -i' and other
2666 # modified aliases since %rehashx will probably clobber them
2684 # modified aliases since %rehashx will probably clobber them
2667
2685
2668 # no, we don't want them. if %rehashx clobbers them, good,
2686 # no, we don't want them. if %rehashx clobbers them, good,
2669 # we'll probably get better versions
2687 # we'll probably get better versions
2670 # self.shell.init_auto_alias()
2688 # self.shell.init_auto_alias()
2671 db = ip.db
2689 db = ip.db
2672 db['syscmdlist'] = syscmdlist
2690 db['syscmdlist'] = syscmdlist
2673 finally:
2691 finally:
2674 os.chdir(savedir)
2692 os.chdir(savedir)
2675
2693
2676 def magic_pwd(self, parameter_s = ''):
2694 def magic_pwd(self, parameter_s = ''):
2677 """Return the current working directory path."""
2695 """Return the current working directory path."""
2678 return os.getcwd()
2696 return os.getcwd()
2679
2697
2680 def magic_cd(self, parameter_s=''):
2698 def magic_cd(self, parameter_s=''):
2681 """Change the current working directory.
2699 """Change the current working directory.
2682
2700
2683 This command automatically maintains an internal list of directories
2701 This command automatically maintains an internal list of directories
2684 you visit during your IPython session, in the variable _dh. The
2702 you visit during your IPython session, in the variable _dh. The
2685 command %dhist shows this history nicely formatted. You can also
2703 command %dhist shows this history nicely formatted. You can also
2686 do 'cd -<tab>' to see directory history conveniently.
2704 do 'cd -<tab>' to see directory history conveniently.
2687
2705
2688 Usage:
2706 Usage:
2689
2707
2690 cd 'dir': changes to directory 'dir'.
2708 cd 'dir': changes to directory 'dir'.
2691
2709
2692 cd -: changes to the last visited directory.
2710 cd -: changes to the last visited directory.
2693
2711
2694 cd -<n>: changes to the n-th directory in the directory history.
2712 cd -<n>: changes to the n-th directory in the directory history.
2695
2713
2696 cd --foo: change to directory that matches 'foo' in history
2714 cd --foo: change to directory that matches 'foo' in history
2697
2715
2698 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2716 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
2699 (note: cd <bookmark_name> is enough if there is no
2717 (note: cd <bookmark_name> is enough if there is no
2700 directory <bookmark_name>, but a bookmark with the name exists.)
2718 directory <bookmark_name>, but a bookmark with the name exists.)
2701 'cd -b <tab>' allows you to tab-complete bookmark names.
2719 'cd -b <tab>' allows you to tab-complete bookmark names.
2702
2720
2703 Options:
2721 Options:
2704
2722
2705 -q: quiet. Do not print the working directory after the cd command is
2723 -q: quiet. Do not print the working directory after the cd command is
2706 executed. By default IPython's cd command does print this directory,
2724 executed. By default IPython's cd command does print this directory,
2707 since the default prompts do not display path information.
2725 since the default prompts do not display path information.
2708
2726
2709 Note that !cd doesn't work for this purpose because the shell where
2727 Note that !cd doesn't work for this purpose because the shell where
2710 !command runs is immediately discarded after executing 'command'."""
2728 !command runs is immediately discarded after executing 'command'."""
2711
2729
2712 parameter_s = parameter_s.strip()
2730 parameter_s = parameter_s.strip()
2713 #bkms = self.shell.persist.get("bookmarks",{})
2731 #bkms = self.shell.persist.get("bookmarks",{})
2714
2732
2715 oldcwd = os.getcwd()
2733 oldcwd = os.getcwd()
2716 numcd = re.match(r'(-)(\d+)$',parameter_s)
2734 numcd = re.match(r'(-)(\d+)$',parameter_s)
2717 # jump in directory history by number
2735 # jump in directory history by number
2718 if numcd:
2736 if numcd:
2719 nn = int(numcd.group(2))
2737 nn = int(numcd.group(2))
2720 try:
2738 try:
2721 ps = self.shell.user_ns['_dh'][nn]
2739 ps = self.shell.user_ns['_dh'][nn]
2722 except IndexError:
2740 except IndexError:
2723 print 'The requested directory does not exist in history.'
2741 print 'The requested directory does not exist in history.'
2724 return
2742 return
2725 else:
2743 else:
2726 opts = {}
2744 opts = {}
2727 elif parameter_s.startswith('--'):
2745 elif parameter_s.startswith('--'):
2728 ps = None
2746 ps = None
2729 fallback = None
2747 fallback = None
2730 pat = parameter_s[2:]
2748 pat = parameter_s[2:]
2731 dh = self.shell.user_ns['_dh']
2749 dh = self.shell.user_ns['_dh']
2732 # first search only by basename (last component)
2750 # first search only by basename (last component)
2733 for ent in reversed(dh):
2751 for ent in reversed(dh):
2734 if pat in os.path.basename(ent) and os.path.isdir(ent):
2752 if pat in os.path.basename(ent) and os.path.isdir(ent):
2735 ps = ent
2753 ps = ent
2736 break
2754 break
2737
2755
2738 if fallback is None and pat in ent and os.path.isdir(ent):
2756 if fallback is None and pat in ent and os.path.isdir(ent):
2739 fallback = ent
2757 fallback = ent
2740
2758
2741 # if we have no last part match, pick the first full path match
2759 # if we have no last part match, pick the first full path match
2742 if ps is None:
2760 if ps is None:
2743 ps = fallback
2761 ps = fallback
2744
2762
2745 if ps is None:
2763 if ps is None:
2746 print "No matching entry in directory history"
2764 print "No matching entry in directory history"
2747 return
2765 return
2748 else:
2766 else:
2749 opts = {}
2767 opts = {}
2750
2768
2751
2769
2752 else:
2770 else:
2753 #turn all non-space-escaping backslashes to slashes,
2771 #turn all non-space-escaping backslashes to slashes,
2754 # for c:\windows\directory\names\
2772 # for c:\windows\directory\names\
2755 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2773 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
2756 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2774 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
2757 # jump to previous
2775 # jump to previous
2758 if ps == '-':
2776 if ps == '-':
2759 try:
2777 try:
2760 ps = self.shell.user_ns['_dh'][-2]
2778 ps = self.shell.user_ns['_dh'][-2]
2761 except IndexError:
2779 except IndexError:
2762 raise UsageError('%cd -: No previous directory to change to.')
2780 raise UsageError('%cd -: No previous directory to change to.')
2763 # jump to bookmark if needed
2781 # jump to bookmark if needed
2764 else:
2782 else:
2765 if not os.path.isdir(ps) or opts.has_key('b'):
2783 if not os.path.isdir(ps) or opts.has_key('b'):
2766 bkms = self.db.get('bookmarks', {})
2784 bkms = self.db.get('bookmarks', {})
2767
2785
2768 if bkms.has_key(ps):
2786 if bkms.has_key(ps):
2769 target = bkms[ps]
2787 target = bkms[ps]
2770 print '(bookmark:%s) -> %s' % (ps,target)
2788 print '(bookmark:%s) -> %s' % (ps,target)
2771 ps = target
2789 ps = target
2772 else:
2790 else:
2773 if opts.has_key('b'):
2791 if opts.has_key('b'):
2774 raise UsageError("Bookmark '%s' not found. "
2792 raise UsageError("Bookmark '%s' not found. "
2775 "Use '%%bookmark -l' to see your bookmarks." % ps)
2793 "Use '%%bookmark -l' to see your bookmarks." % ps)
2776
2794
2777 # at this point ps should point to the target dir
2795 # at this point ps should point to the target dir
2778 if ps:
2796 if ps:
2779 try:
2797 try:
2780 os.chdir(os.path.expanduser(ps))
2798 os.chdir(os.path.expanduser(ps))
2781 if self.shell.rc.term_title:
2799 if self.shell.rc.term_title:
2782 #print 'set term title:',self.shell.rc.term_title # dbg
2800 #print 'set term title:',self.shell.rc.term_title # dbg
2783 platutils.set_term_title('IPy ' + abbrev_cwd())
2801 platutils.set_term_title('IPy ' + abbrev_cwd())
2784 except OSError:
2802 except OSError:
2785 print sys.exc_info()[1]
2803 print sys.exc_info()[1]
2786 else:
2804 else:
2787 cwd = os.getcwd()
2805 cwd = os.getcwd()
2788 dhist = self.shell.user_ns['_dh']
2806 dhist = self.shell.user_ns['_dh']
2789 if oldcwd != cwd:
2807 if oldcwd != cwd:
2790 dhist.append(cwd)
2808 dhist.append(cwd)
2791 self.db['dhist'] = compress_dhist(dhist)[-100:]
2809 self.db['dhist'] = compress_dhist(dhist)[-100:]
2792
2810
2793 else:
2811 else:
2794 os.chdir(self.shell.home_dir)
2812 os.chdir(self.shell.home_dir)
2795 if self.shell.rc.term_title:
2813 if self.shell.rc.term_title:
2796 platutils.set_term_title("IPy ~")
2814 platutils.set_term_title("IPy ~")
2797 cwd = os.getcwd()
2815 cwd = os.getcwd()
2798 dhist = self.shell.user_ns['_dh']
2816 dhist = self.shell.user_ns['_dh']
2799
2817
2800 if oldcwd != cwd:
2818 if oldcwd != cwd:
2801 dhist.append(cwd)
2819 dhist.append(cwd)
2802 self.db['dhist'] = compress_dhist(dhist)[-100:]
2820 self.db['dhist'] = compress_dhist(dhist)[-100:]
2803 if not 'q' in opts and self.shell.user_ns['_dh']:
2821 if not 'q' in opts and self.shell.user_ns['_dh']:
2804 print self.shell.user_ns['_dh'][-1]
2822 print self.shell.user_ns['_dh'][-1]
2805
2823
2806
2824
2807 def magic_env(self, parameter_s=''):
2825 def magic_env(self, parameter_s=''):
2808 """List environment variables."""
2826 """List environment variables."""
2809
2827
2810 return os.environ.data
2828 return os.environ.data
2811
2829
2812 def magic_pushd(self, parameter_s=''):
2830 def magic_pushd(self, parameter_s=''):
2813 """Place the current dir on stack and change directory.
2831 """Place the current dir on stack and change directory.
2814
2832
2815 Usage:\\
2833 Usage:\\
2816 %pushd ['dirname']
2834 %pushd ['dirname']
2817 """
2835 """
2818
2836
2819 dir_s = self.shell.dir_stack
2837 dir_s = self.shell.dir_stack
2820 tgt = os.path.expanduser(parameter_s)
2838 tgt = os.path.expanduser(parameter_s)
2821 cwd = os.getcwd().replace(self.home_dir,'~')
2839 cwd = os.getcwd().replace(self.home_dir,'~')
2822 if tgt:
2840 if tgt:
2823 self.magic_cd(parameter_s)
2841 self.magic_cd(parameter_s)
2824 dir_s.insert(0,cwd)
2842 dir_s.insert(0,cwd)
2825 return self.magic_dirs()
2843 return self.magic_dirs()
2826
2844
2827 def magic_popd(self, parameter_s=''):
2845 def magic_popd(self, parameter_s=''):
2828 """Change to directory popped off the top of the stack.
2846 """Change to directory popped off the top of the stack.
2829 """
2847 """
2830 if not self.shell.dir_stack:
2848 if not self.shell.dir_stack:
2831 raise UsageError("%popd on empty stack")
2849 raise UsageError("%popd on empty stack")
2832 top = self.shell.dir_stack.pop(0)
2850 top = self.shell.dir_stack.pop(0)
2833 self.magic_cd(top)
2851 self.magic_cd(top)
2834 print "popd ->",top
2852 print "popd ->",top
2835
2853
2836 def magic_dirs(self, parameter_s=''):
2854 def magic_dirs(self, parameter_s=''):
2837 """Return the current directory stack."""
2855 """Return the current directory stack."""
2838
2856
2839 return self.shell.dir_stack
2857 return self.shell.dir_stack
2840
2858
2841 def magic_dhist(self, parameter_s=''):
2859 def magic_dhist(self, parameter_s=''):
2842 """Print your history of visited directories.
2860 """Print your history of visited directories.
2843
2861
2844 %dhist -> print full history\\
2862 %dhist -> print full history\\
2845 %dhist n -> print last n entries only\\
2863 %dhist n -> print last n entries only\\
2846 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2864 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
2847
2865
2848 This history is automatically maintained by the %cd command, and
2866 This history is automatically maintained by the %cd command, and
2849 always available as the global list variable _dh. You can use %cd -<n>
2867 always available as the global list variable _dh. You can use %cd -<n>
2850 to go to directory number <n>.
2868 to go to directory number <n>.
2851
2869
2852 Note that most of time, you should view directory history by entering
2870 Note that most of time, you should view directory history by entering
2853 cd -<TAB>.
2871 cd -<TAB>.
2854
2872
2855 """
2873 """
2856
2874
2857 dh = self.shell.user_ns['_dh']
2875 dh = self.shell.user_ns['_dh']
2858 if parameter_s:
2876 if parameter_s:
2859 try:
2877 try:
2860 args = map(int,parameter_s.split())
2878 args = map(int,parameter_s.split())
2861 except:
2879 except:
2862 self.arg_err(Magic.magic_dhist)
2880 self.arg_err(Magic.magic_dhist)
2863 return
2881 return
2864 if len(args) == 1:
2882 if len(args) == 1:
2865 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2883 ini,fin = max(len(dh)-(args[0]),0),len(dh)
2866 elif len(args) == 2:
2884 elif len(args) == 2:
2867 ini,fin = args
2885 ini,fin = args
2868 else:
2886 else:
2869 self.arg_err(Magic.magic_dhist)
2887 self.arg_err(Magic.magic_dhist)
2870 return
2888 return
2871 else:
2889 else:
2872 ini,fin = 0,len(dh)
2890 ini,fin = 0,len(dh)
2873 nlprint(dh,
2891 nlprint(dh,
2874 header = 'Directory history (kept in _dh)',
2892 header = 'Directory history (kept in _dh)',
2875 start=ini,stop=fin)
2893 start=ini,stop=fin)
2876
2894
2877 @testdec.skip_doctest
2895 @testdec.skip_doctest
2878 def magic_sc(self, parameter_s=''):
2896 def magic_sc(self, parameter_s=''):
2879 """Shell capture - execute a shell command and capture its output.
2897 """Shell capture - execute a shell command and capture its output.
2880
2898
2881 DEPRECATED. Suboptimal, retained for backwards compatibility.
2899 DEPRECATED. Suboptimal, retained for backwards compatibility.
2882
2900
2883 You should use the form 'var = !command' instead. Example:
2901 You should use the form 'var = !command' instead. Example:
2884
2902
2885 "%sc -l myfiles = ls ~" should now be written as
2903 "%sc -l myfiles = ls ~" should now be written as
2886
2904
2887 "myfiles = !ls ~"
2905 "myfiles = !ls ~"
2888
2906
2889 myfiles.s, myfiles.l and myfiles.n still apply as documented
2907 myfiles.s, myfiles.l and myfiles.n still apply as documented
2890 below.
2908 below.
2891
2909
2892 --
2910 --
2893 %sc [options] varname=command
2911 %sc [options] varname=command
2894
2912
2895 IPython will run the given command using commands.getoutput(), and
2913 IPython will run the given command using commands.getoutput(), and
2896 will then update the user's interactive namespace with a variable
2914 will then update the user's interactive namespace with a variable
2897 called varname, containing the value of the call. Your command can
2915 called varname, containing the value of the call. Your command can
2898 contain shell wildcards, pipes, etc.
2916 contain shell wildcards, pipes, etc.
2899
2917
2900 The '=' sign in the syntax is mandatory, and the variable name you
2918 The '=' sign in the syntax is mandatory, and the variable name you
2901 supply must follow Python's standard conventions for valid names.
2919 supply must follow Python's standard conventions for valid names.
2902
2920
2903 (A special format without variable name exists for internal use)
2921 (A special format without variable name exists for internal use)
2904
2922
2905 Options:
2923 Options:
2906
2924
2907 -l: list output. Split the output on newlines into a list before
2925 -l: list output. Split the output on newlines into a list before
2908 assigning it to the given variable. By default the output is stored
2926 assigning it to the given variable. By default the output is stored
2909 as a single string.
2927 as a single string.
2910
2928
2911 -v: verbose. Print the contents of the variable.
2929 -v: verbose. Print the contents of the variable.
2912
2930
2913 In most cases you should not need to split as a list, because the
2931 In most cases you should not need to split as a list, because the
2914 returned value is a special type of string which can automatically
2932 returned value is a special type of string which can automatically
2915 provide its contents either as a list (split on newlines) or as a
2933 provide its contents either as a list (split on newlines) or as a
2916 space-separated string. These are convenient, respectively, either
2934 space-separated string. These are convenient, respectively, either
2917 for sequential processing or to be passed to a shell command.
2935 for sequential processing or to be passed to a shell command.
2918
2936
2919 For example:
2937 For example:
2920
2938
2921 # all-random
2939 # all-random
2922
2940
2923 # Capture into variable a
2941 # Capture into variable a
2924 In [1]: sc a=ls *py
2942 In [1]: sc a=ls *py
2925
2943
2926 # a is a string with embedded newlines
2944 # a is a string with embedded newlines
2927 In [2]: a
2945 In [2]: a
2928 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2946 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
2929
2947
2930 # which can be seen as a list:
2948 # which can be seen as a list:
2931 In [3]: a.l
2949 In [3]: a.l
2932 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2950 Out[3]: ['setup.py', 'win32_manual_post_install.py']
2933
2951
2934 # or as a whitespace-separated string:
2952 # or as a whitespace-separated string:
2935 In [4]: a.s
2953 In [4]: a.s
2936 Out[4]: 'setup.py win32_manual_post_install.py'
2954 Out[4]: 'setup.py win32_manual_post_install.py'
2937
2955
2938 # a.s is useful to pass as a single command line:
2956 # a.s is useful to pass as a single command line:
2939 In [5]: !wc -l $a.s
2957 In [5]: !wc -l $a.s
2940 146 setup.py
2958 146 setup.py
2941 130 win32_manual_post_install.py
2959 130 win32_manual_post_install.py
2942 276 total
2960 276 total
2943
2961
2944 # while the list form is useful to loop over:
2962 # while the list form is useful to loop over:
2945 In [6]: for f in a.l:
2963 In [6]: for f in a.l:
2946 ...: !wc -l $f
2964 ...: !wc -l $f
2947 ...:
2965 ...:
2948 146 setup.py
2966 146 setup.py
2949 130 win32_manual_post_install.py
2967 130 win32_manual_post_install.py
2950
2968
2951 Similiarly, the lists returned by the -l option are also special, in
2969 Similiarly, the lists returned by the -l option are also special, in
2952 the sense that you can equally invoke the .s attribute on them to
2970 the sense that you can equally invoke the .s attribute on them to
2953 automatically get a whitespace-separated string from their contents:
2971 automatically get a whitespace-separated string from their contents:
2954
2972
2955 In [7]: sc -l b=ls *py
2973 In [7]: sc -l b=ls *py
2956
2974
2957 In [8]: b
2975 In [8]: b
2958 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2976 Out[8]: ['setup.py', 'win32_manual_post_install.py']
2959
2977
2960 In [9]: b.s
2978 In [9]: b.s
2961 Out[9]: 'setup.py win32_manual_post_install.py'
2979 Out[9]: 'setup.py win32_manual_post_install.py'
2962
2980
2963 In summary, both the lists and strings used for ouptut capture have
2981 In summary, both the lists and strings used for ouptut capture have
2964 the following special attributes:
2982 the following special attributes:
2965
2983
2966 .l (or .list) : value as list.
2984 .l (or .list) : value as list.
2967 .n (or .nlstr): value as newline-separated string.
2985 .n (or .nlstr): value as newline-separated string.
2968 .s (or .spstr): value as space-separated string.
2986 .s (or .spstr): value as space-separated string.
2969 """
2987 """
2970
2988
2971 opts,args = self.parse_options(parameter_s,'lv')
2989 opts,args = self.parse_options(parameter_s,'lv')
2972 # Try to get a variable name and command to run
2990 # Try to get a variable name and command to run
2973 try:
2991 try:
2974 # the variable name must be obtained from the parse_options
2992 # the variable name must be obtained from the parse_options
2975 # output, which uses shlex.split to strip options out.
2993 # output, which uses shlex.split to strip options out.
2976 var,_ = args.split('=',1)
2994 var,_ = args.split('=',1)
2977 var = var.strip()
2995 var = var.strip()
2978 # But the the command has to be extracted from the original input
2996 # But the the command has to be extracted from the original input
2979 # parameter_s, not on what parse_options returns, to avoid the
2997 # parameter_s, not on what parse_options returns, to avoid the
2980 # quote stripping which shlex.split performs on it.
2998 # quote stripping which shlex.split performs on it.
2981 _,cmd = parameter_s.split('=',1)
2999 _,cmd = parameter_s.split('=',1)
2982 except ValueError:
3000 except ValueError:
2983 var,cmd = '',''
3001 var,cmd = '',''
2984 # If all looks ok, proceed
3002 # If all looks ok, proceed
2985 out,err = self.shell.getoutputerror(cmd)
3003 out,err = self.shell.getoutputerror(cmd)
2986 if err:
3004 if err:
2987 print >> Term.cerr,err
3005 print >> Term.cerr,err
2988 if opts.has_key('l'):
3006 if opts.has_key('l'):
2989 out = SList(out.split('\n'))
3007 out = SList(out.split('\n'))
2990 else:
3008 else:
2991 out = LSString(out)
3009 out = LSString(out)
2992 if opts.has_key('v'):
3010 if opts.has_key('v'):
2993 print '%s ==\n%s' % (var,pformat(out))
3011 print '%s ==\n%s' % (var,pformat(out))
2994 if var:
3012 if var:
2995 self.shell.user_ns.update({var:out})
3013 self.shell.user_ns.update({var:out})
2996 else:
3014 else:
2997 return out
3015 return out
2998
3016
2999 def magic_sx(self, parameter_s=''):
3017 def magic_sx(self, parameter_s=''):
3000 """Shell execute - run a shell command and capture its output.
3018 """Shell execute - run a shell command and capture its output.
3001
3019
3002 %sx command
3020 %sx command
3003
3021
3004 IPython will run the given command using commands.getoutput(), and
3022 IPython will run the given command using commands.getoutput(), and
3005 return the result formatted as a list (split on '\\n'). Since the
3023 return the result formatted as a list (split on '\\n'). Since the
3006 output is _returned_, it will be stored in ipython's regular output
3024 output is _returned_, it will be stored in ipython's regular output
3007 cache Out[N] and in the '_N' automatic variables.
3025 cache Out[N] and in the '_N' automatic variables.
3008
3026
3009 Notes:
3027 Notes:
3010
3028
3011 1) If an input line begins with '!!', then %sx is automatically
3029 1) If an input line begins with '!!', then %sx is automatically
3012 invoked. That is, while:
3030 invoked. That is, while:
3013 !ls
3031 !ls
3014 causes ipython to simply issue system('ls'), typing
3032 causes ipython to simply issue system('ls'), typing
3015 !!ls
3033 !!ls
3016 is a shorthand equivalent to:
3034 is a shorthand equivalent to:
3017 %sx ls
3035 %sx ls
3018
3036
3019 2) %sx differs from %sc in that %sx automatically splits into a list,
3037 2) %sx differs from %sc in that %sx automatically splits into a list,
3020 like '%sc -l'. The reason for this is to make it as easy as possible
3038 like '%sc -l'. The reason for this is to make it as easy as possible
3021 to process line-oriented shell output via further python commands.
3039 to process line-oriented shell output via further python commands.
3022 %sc is meant to provide much finer control, but requires more
3040 %sc is meant to provide much finer control, but requires more
3023 typing.
3041 typing.
3024
3042
3025 3) Just like %sc -l, this is a list with special attributes:
3043 3) Just like %sc -l, this is a list with special attributes:
3026
3044
3027 .l (or .list) : value as list.
3045 .l (or .list) : value as list.
3028 .n (or .nlstr): value as newline-separated string.
3046 .n (or .nlstr): value as newline-separated string.
3029 .s (or .spstr): value as whitespace-separated string.
3047 .s (or .spstr): value as whitespace-separated string.
3030
3048
3031 This is very useful when trying to use such lists as arguments to
3049 This is very useful when trying to use such lists as arguments to
3032 system commands."""
3050 system commands."""
3033
3051
3034 if parameter_s:
3052 if parameter_s:
3035 out,err = self.shell.getoutputerror(parameter_s)
3053 out,err = self.shell.getoutputerror(parameter_s)
3036 if err:
3054 if err:
3037 print >> Term.cerr,err
3055 print >> Term.cerr,err
3038 return SList(out.split('\n'))
3056 return SList(out.split('\n'))
3039
3057
3040 def magic_bg(self, parameter_s=''):
3058 def magic_bg(self, parameter_s=''):
3041 """Run a job in the background, in a separate thread.
3059 """Run a job in the background, in a separate thread.
3042
3060
3043 For example,
3061 For example,
3044
3062
3045 %bg myfunc(x,y,z=1)
3063 %bg myfunc(x,y,z=1)
3046
3064
3047 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3065 will execute 'myfunc(x,y,z=1)' in a background thread. As soon as the
3048 execution starts, a message will be printed indicating the job
3066 execution starts, a message will be printed indicating the job
3049 number. If your job number is 5, you can use
3067 number. If your job number is 5, you can use
3050
3068
3051 myvar = jobs.result(5) or myvar = jobs[5].result
3069 myvar = jobs.result(5) or myvar = jobs[5].result
3052
3070
3053 to assign this result to variable 'myvar'.
3071 to assign this result to variable 'myvar'.
3054
3072
3055 IPython has a job manager, accessible via the 'jobs' object. You can
3073 IPython has a job manager, accessible via the 'jobs' object. You can
3056 type jobs? to get more information about it, and use jobs.<TAB> to see
3074 type jobs? to get more information about it, and use jobs.<TAB> to see
3057 its attributes. All attributes not starting with an underscore are
3075 its attributes. All attributes not starting with an underscore are
3058 meant for public use.
3076 meant for public use.
3059
3077
3060 In particular, look at the jobs.new() method, which is used to create
3078 In particular, look at the jobs.new() method, which is used to create
3061 new jobs. This magic %bg function is just a convenience wrapper
3079 new jobs. This magic %bg function is just a convenience wrapper
3062 around jobs.new(), for expression-based jobs. If you want to create a
3080 around jobs.new(), for expression-based jobs. If you want to create a
3063 new job with an explicit function object and arguments, you must call
3081 new job with an explicit function object and arguments, you must call
3064 jobs.new() directly.
3082 jobs.new() directly.
3065
3083
3066 The jobs.new docstring also describes in detail several important
3084 The jobs.new docstring also describes in detail several important
3067 caveats associated with a thread-based model for background job
3085 caveats associated with a thread-based model for background job
3068 execution. Type jobs.new? for details.
3086 execution. Type jobs.new? for details.
3069
3087
3070 You can check the status of all jobs with jobs.status().
3088 You can check the status of all jobs with jobs.status().
3071
3089
3072 The jobs variable is set by IPython into the Python builtin namespace.
3090 The jobs variable is set by IPython into the Python builtin namespace.
3073 If you ever declare a variable named 'jobs', you will shadow this
3091 If you ever declare a variable named 'jobs', you will shadow this
3074 name. You can either delete your global jobs variable to regain
3092 name. You can either delete your global jobs variable to regain
3075 access to the job manager, or make a new name and assign it manually
3093 access to the job manager, or make a new name and assign it manually
3076 to the manager (stored in IPython's namespace). For example, to
3094 to the manager (stored in IPython's namespace). For example, to
3077 assign the job manager to the Jobs name, use:
3095 assign the job manager to the Jobs name, use:
3078
3096
3079 Jobs = __builtins__.jobs"""
3097 Jobs = __builtins__.jobs"""
3080
3098
3081 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3099 self.shell.jobs.new(parameter_s,self.shell.user_ns)
3082
3100
3083 def magic_r(self, parameter_s=''):
3101 def magic_r(self, parameter_s=''):
3084 """Repeat previous input.
3102 """Repeat previous input.
3085
3103
3086 Note: Consider using the more powerfull %rep instead!
3104 Note: Consider using the more powerfull %rep instead!
3087
3105
3088 If given an argument, repeats the previous command which starts with
3106 If given an argument, repeats the previous command which starts with
3089 the same string, otherwise it just repeats the previous input.
3107 the same string, otherwise it just repeats the previous input.
3090
3108
3091 Shell escaped commands (with ! as first character) are not recognized
3109 Shell escaped commands (with ! as first character) are not recognized
3092 by this system, only pure python code and magic commands.
3110 by this system, only pure python code and magic commands.
3093 """
3111 """
3094
3112
3095 start = parameter_s.strip()
3113 start = parameter_s.strip()
3096 esc_magic = self.shell.ESC_MAGIC
3114 esc_magic = self.shell.ESC_MAGIC
3097 # Identify magic commands even if automagic is on (which means
3115 # Identify magic commands even if automagic is on (which means
3098 # the in-memory version is different from that typed by the user).
3116 # the in-memory version is different from that typed by the user).
3099 if self.shell.rc.automagic:
3117 if self.shell.rc.automagic:
3100 start_magic = esc_magic+start
3118 start_magic = esc_magic+start
3101 else:
3119 else:
3102 start_magic = start
3120 start_magic = start
3103 # Look through the input history in reverse
3121 # Look through the input history in reverse
3104 for n in range(len(self.shell.input_hist)-2,0,-1):
3122 for n in range(len(self.shell.input_hist)-2,0,-1):
3105 input = self.shell.input_hist[n]
3123 input = self.shell.input_hist[n]
3106 # skip plain 'r' lines so we don't recurse to infinity
3124 # skip plain 'r' lines so we don't recurse to infinity
3107 if input != '_ip.magic("r")\n' and \
3125 if input != '_ip.magic("r")\n' and \
3108 (input.startswith(start) or input.startswith(start_magic)):
3126 (input.startswith(start) or input.startswith(start_magic)):
3109 #print 'match',`input` # dbg
3127 #print 'match',`input` # dbg
3110 print 'Executing:',input,
3128 print 'Executing:',input,
3111 self.shell.runlines(input)
3129 self.shell.runlines(input)
3112 return
3130 return
3113 print 'No previous input matching `%s` found.' % start
3131 print 'No previous input matching `%s` found.' % start
3114
3132
3115
3133
3116 def magic_bookmark(self, parameter_s=''):
3134 def magic_bookmark(self, parameter_s=''):
3117 """Manage IPython's bookmark system.
3135 """Manage IPython's bookmark system.
3118
3136
3119 %bookmark <name> - set bookmark to current dir
3137 %bookmark <name> - set bookmark to current dir
3120 %bookmark <name> <dir> - set bookmark to <dir>
3138 %bookmark <name> <dir> - set bookmark to <dir>
3121 %bookmark -l - list all bookmarks
3139 %bookmark -l - list all bookmarks
3122 %bookmark -d <name> - remove bookmark
3140 %bookmark -d <name> - remove bookmark
3123 %bookmark -r - remove all bookmarks
3141 %bookmark -r - remove all bookmarks
3124
3142
3125 You can later on access a bookmarked folder with:
3143 You can later on access a bookmarked folder with:
3126 %cd -b <name>
3144 %cd -b <name>
3127 or simply '%cd <name>' if there is no directory called <name> AND
3145 or simply '%cd <name>' if there is no directory called <name> AND
3128 there is such a bookmark defined.
3146 there is such a bookmark defined.
3129
3147
3130 Your bookmarks persist through IPython sessions, but they are
3148 Your bookmarks persist through IPython sessions, but they are
3131 associated with each profile."""
3149 associated with each profile."""
3132
3150
3133 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3151 opts,args = self.parse_options(parameter_s,'drl',mode='list')
3134 if len(args) > 2:
3152 if len(args) > 2:
3135 raise UsageError("%bookmark: too many arguments")
3153 raise UsageError("%bookmark: too many arguments")
3136
3154
3137 bkms = self.db.get('bookmarks',{})
3155 bkms = self.db.get('bookmarks',{})
3138
3156
3139 if opts.has_key('d'):
3157 if opts.has_key('d'):
3140 try:
3158 try:
3141 todel = args[0]
3159 todel = args[0]
3142 except IndexError:
3160 except IndexError:
3143 raise UsageError(
3161 raise UsageError(
3144 "%bookmark -d: must provide a bookmark to delete")
3162 "%bookmark -d: must provide a bookmark to delete")
3145 else:
3163 else:
3146 try:
3164 try:
3147 del bkms[todel]
3165 del bkms[todel]
3148 except KeyError:
3166 except KeyError:
3149 raise UsageError(
3167 raise UsageError(
3150 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3168 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
3151
3169
3152 elif opts.has_key('r'):
3170 elif opts.has_key('r'):
3153 bkms = {}
3171 bkms = {}
3154 elif opts.has_key('l'):
3172 elif opts.has_key('l'):
3155 bks = bkms.keys()
3173 bks = bkms.keys()
3156 bks.sort()
3174 bks.sort()
3157 if bks:
3175 if bks:
3158 size = max(map(len,bks))
3176 size = max(map(len,bks))
3159 else:
3177 else:
3160 size = 0
3178 size = 0
3161 fmt = '%-'+str(size)+'s -> %s'
3179 fmt = '%-'+str(size)+'s -> %s'
3162 print 'Current bookmarks:'
3180 print 'Current bookmarks:'
3163 for bk in bks:
3181 for bk in bks:
3164 print fmt % (bk,bkms[bk])
3182 print fmt % (bk,bkms[bk])
3165 else:
3183 else:
3166 if not args:
3184 if not args:
3167 raise UsageError("%bookmark: You must specify the bookmark name")
3185 raise UsageError("%bookmark: You must specify the bookmark name")
3168 elif len(args)==1:
3186 elif len(args)==1:
3169 bkms[args[0]] = os.getcwd()
3187 bkms[args[0]] = os.getcwd()
3170 elif len(args)==2:
3188 elif len(args)==2:
3171 bkms[args[0]] = args[1]
3189 bkms[args[0]] = args[1]
3172 self.db['bookmarks'] = bkms
3190 self.db['bookmarks'] = bkms
3173
3191
3174 def magic_pycat(self, parameter_s=''):
3192 def magic_pycat(self, parameter_s=''):
3175 """Show a syntax-highlighted file through a pager.
3193 """Show a syntax-highlighted file through a pager.
3176
3194
3177 This magic is similar to the cat utility, but it will assume the file
3195 This magic is similar to the cat utility, but it will assume the file
3178 to be Python source and will show it with syntax highlighting. """
3196 to be Python source and will show it with syntax highlighting. """
3179
3197
3180 try:
3198 try:
3181 filename = get_py_filename(parameter_s)
3199 filename = get_py_filename(parameter_s)
3182 cont = file_read(filename)
3200 cont = file_read(filename)
3183 except IOError:
3201 except IOError:
3184 try:
3202 try:
3185 cont = eval(parameter_s,self.user_ns)
3203 cont = eval(parameter_s,self.user_ns)
3186 except NameError:
3204 except NameError:
3187 cont = None
3205 cont = None
3188 if cont is None:
3206 if cont is None:
3189 print "Error: no such file or variable"
3207 print "Error: no such file or variable"
3190 return
3208 return
3191
3209
3192 page(self.shell.pycolorize(cont),
3210 page(self.shell.pycolorize(cont),
3193 screen_lines=self.shell.rc.screen_length)
3211 screen_lines=self.shell.rc.screen_length)
3194
3212
3195 def magic_cpaste(self, parameter_s=''):
3213 def magic_cpaste(self, parameter_s=''):
3196 """Allows you to paste & execute a pre-formatted code block from clipboard.
3214 """Allows you to paste & execute a pre-formatted code block from clipboard.
3197
3215
3198 You must terminate the block with '--' (two minus-signs) alone on the
3216 You must terminate the block with '--' (two minus-signs) alone on the
3199 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3217 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
3200 is the new sentinel for this operation)
3218 is the new sentinel for this operation)
3201
3219
3202 The block is dedented prior to execution to enable execution of method
3220 The block is dedented prior to execution to enable execution of method
3203 definitions. '>' and '+' characters at the beginning of a line are
3221 definitions. '>' and '+' characters at the beginning of a line are
3204 ignored, to allow pasting directly from e-mails, diff files and
3222 ignored, to allow pasting directly from e-mails, diff files and
3205 doctests (the '...' continuation prompt is also stripped). The
3223 doctests (the '...' continuation prompt is also stripped). The
3206 executed block is also assigned to variable named 'pasted_block' for
3224 executed block is also assigned to variable named 'pasted_block' for
3207 later editing with '%edit pasted_block'.
3225 later editing with '%edit pasted_block'.
3208
3226
3209 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3227 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
3210 This assigns the pasted block to variable 'foo' as string, without
3228 This assigns the pasted block to variable 'foo' as string, without
3211 dedenting or executing it (preceding >>> and + is still stripped)
3229 dedenting or executing it (preceding >>> and + is still stripped)
3212
3230
3231 '%cpaste -r' re-executes the block previously entered by cpaste.
3232
3213 Do not be alarmed by garbled output on Windows (it's a readline bug).
3233 Do not be alarmed by garbled output on Windows (it's a readline bug).
3214 Just press enter and type -- (and press enter again) and the block
3234 Just press enter and type -- (and press enter again) and the block
3215 will be what was just pasted.
3235 will be what was just pasted.
3216
3236
3217 IPython statements (magics, shell escapes) are not supported (yet).
3237 IPython statements (magics, shell escapes) are not supported (yet).
3218 """
3238 """
3219 opts,args = self.parse_options(parameter_s,'s:',mode='string')
3239 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
3220 par = args.strip()
3240 par = args.strip()
3241 if opts.has_key('r'):
3242 b = self.user_ns.get('pasted_block', None)
3243 if b is None:
3244 raise UsageError('No previous pasted block available')
3245 print "Re-executing '%s...' (%d chars)"% (b.split('\n',1)[0], len(b))
3246 exec b in self.user_ns
3247 return
3248
3221 sentinel = opts.get('s','--')
3249 sentinel = opts.get('s','--')
3222
3250
3223 # Regular expressions that declare text we strip from the input:
3251 # Regular expressions that declare text we strip from the input:
3224 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3252 strip_re = [r'^\s*In \[\d+\]:', # IPython input prompt
3225 r'^\s*(\s?>)+', # Python input prompt
3253 r'^\s*(\s?>)+', # Python input prompt
3226 r'^\s*\.{3,}', # Continuation prompts
3254 r'^\s*\.{3,}', # Continuation prompts
3227 r'^\++',
3255 r'^\++',
3228 ]
3256 ]
3229
3257
3230 strip_from_start = map(re.compile,strip_re)
3258 strip_from_start = map(re.compile,strip_re)
3231
3259
3232 from IPython import iplib
3260 from IPython import iplib
3233 lines = []
3261 lines = []
3234 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3262 print "Pasting code; enter '%s' alone on the line to stop." % sentinel
3235 while 1:
3263 while 1:
3236 l = iplib.raw_input_original(':')
3264 l = iplib.raw_input_original(':')
3237 if l ==sentinel:
3265 if l ==sentinel:
3238 break
3266 break
3239
3267
3240 for pat in strip_from_start:
3268 for pat in strip_from_start:
3241 l = pat.sub('',l)
3269 l = pat.sub('',l)
3242 lines.append(l)
3270 lines.append(l)
3243
3271
3244 block = "\n".join(lines) + '\n'
3272 block = "\n".join(lines) + '\n'
3245 #print "block:\n",block
3273 #print "block:\n",block
3246 if not par:
3274 if not par:
3247 b = textwrap.dedent(block)
3275 b = textwrap.dedent(block)
3248 exec b in self.user_ns
3249 self.user_ns['pasted_block'] = b
3276 self.user_ns['pasted_block'] = b
3277 exec b in self.user_ns
3250 else:
3278 else:
3251 self.user_ns[par] = SList(block.splitlines())
3279 self.user_ns[par] = SList(block.splitlines())
3252 print "Block assigned to '%s'" % par
3280 print "Block assigned to '%s'" % par
3253
3281
3254 def magic_quickref(self,arg):
3282 def magic_quickref(self,arg):
3255 """ Show a quick reference sheet """
3283 """ Show a quick reference sheet """
3256 import IPython.usage
3284 import IPython.usage
3257 qr = IPython.usage.quick_reference + self.magic_magic('-brief')
3285 qr = IPython.usage.quick_reference + self.magic_magic('-brief')
3258
3286
3259 page(qr)
3287 page(qr)
3260
3288
3261 def magic_upgrade(self,arg):
3289 def magic_upgrade(self,arg):
3262 """ Upgrade your IPython installation
3290 """ Upgrade your IPython installation
3263
3291
3264 This will copy the config files that don't yet exist in your
3292 This will copy the config files that don't yet exist in your
3265 ipython dir from the system config dir. Use this after upgrading
3293 ipython dir from the system config dir. Use this after upgrading
3266 IPython if you don't wish to delete your .ipython dir.
3294 IPython if you don't wish to delete your .ipython dir.
3267
3295
3268 Call with -nolegacy to get rid of ipythonrc* files (recommended for
3296 Call with -nolegacy to get rid of ipythonrc* files (recommended for
3269 new users)
3297 new users)
3270
3298
3271 """
3299 """
3272 ip = self.getapi()
3300 ip = self.getapi()
3273 ipinstallation = path(IPython.__file__).dirname()
3301 ipinstallation = path(IPython.__file__).dirname()
3274 upgrade_script = '%s "%s"' % (sys.executable,ipinstallation / 'upgrade_dir.py')
3302 upgrade_script = '%s "%s"' % (sys.executable,ipinstallation / 'upgrade_dir.py')
3275 src_config = ipinstallation / 'UserConfig'
3303 src_config = ipinstallation / 'UserConfig'
3276 userdir = path(ip.options.ipythondir)
3304 userdir = path(ip.options.ipythondir)
3277 cmd = '%s "%s" "%s"' % (upgrade_script, src_config, userdir)
3305 cmd = '%s "%s" "%s"' % (upgrade_script, src_config, userdir)
3278 print ">",cmd
3306 print ">",cmd
3279 shell(cmd)
3307 shell(cmd)
3280 if arg == '-nolegacy':
3308 if arg == '-nolegacy':
3281 legacy = userdir.files('ipythonrc*')
3309 legacy = userdir.files('ipythonrc*')
3282 print "Nuking legacy files:",legacy
3310 print "Nuking legacy files:",legacy
3283
3311
3284 [p.remove() for p in legacy]
3312 [p.remove() for p in legacy]
3285 suffix = (sys.platform == 'win32' and '.ini' or '')
3313 suffix = (sys.platform == 'win32' and '.ini' or '')
3286 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
3314 (userdir / ('ipythonrc' + suffix)).write_text('# Empty, see ipy_user_conf.py\n')
3287
3315
3288
3316
3289 def magic_doctest_mode(self,parameter_s=''):
3317 def magic_doctest_mode(self,parameter_s=''):
3290 """Toggle doctest mode on and off.
3318 """Toggle doctest mode on and off.
3291
3319
3292 This mode allows you to toggle the prompt behavior between normal
3320 This mode allows you to toggle the prompt behavior between normal
3293 IPython prompts and ones that are as similar to the default IPython
3321 IPython prompts and ones that are as similar to the default IPython
3294 interpreter as possible.
3322 interpreter as possible.
3295
3323
3296 It also supports the pasting of code snippets that have leading '>>>'
3324 It also supports the pasting of code snippets that have leading '>>>'
3297 and '...' prompts in them. This means that you can paste doctests from
3325 and '...' prompts in them. This means that you can paste doctests from
3298 files or docstrings (even if they have leading whitespace), and the
3326 files or docstrings (even if they have leading whitespace), and the
3299 code will execute correctly. You can then use '%history -tn' to see
3327 code will execute correctly. You can then use '%history -tn' to see
3300 the translated history without line numbers; this will give you the
3328 the translated history without line numbers; this will give you the
3301 input after removal of all the leading prompts and whitespace, which
3329 input after removal of all the leading prompts and whitespace, which
3302 can be pasted back into an editor.
3330 can be pasted back into an editor.
3303
3331
3304 With these features, you can switch into this mode easily whenever you
3332 With these features, you can switch into this mode easily whenever you
3305 need to do testing and changes to doctests, without having to leave
3333 need to do testing and changes to doctests, without having to leave
3306 your existing IPython session.
3334 your existing IPython session.
3307 """
3335 """
3308
3336
3309 # XXX - Fix this to have cleaner activate/deactivate calls.
3337 # XXX - Fix this to have cleaner activate/deactivate calls.
3310 from IPython.Extensions import InterpreterPasteInput as ipaste
3338 from IPython.Extensions import InterpreterPasteInput as ipaste
3311 from IPython.ipstruct import Struct
3339 from IPython.ipstruct import Struct
3312
3340
3313 # Shorthands
3341 # Shorthands
3314 shell = self.shell
3342 shell = self.shell
3315 oc = shell.outputcache
3343 oc = shell.outputcache
3316 rc = shell.rc
3344 rc = shell.rc
3317 meta = shell.meta
3345 meta = shell.meta
3318 # dstore is a data store kept in the instance metadata bag to track any
3346 # dstore is a data store kept in the instance metadata bag to track any
3319 # changes we make, so we can undo them later.
3347 # changes we make, so we can undo them later.
3320 dstore = meta.setdefault('doctest_mode',Struct())
3348 dstore = meta.setdefault('doctest_mode',Struct())
3321 save_dstore = dstore.setdefault
3349 save_dstore = dstore.setdefault
3322
3350
3323 # save a few values we'll need to recover later
3351 # save a few values we'll need to recover later
3324 mode = save_dstore('mode',False)
3352 mode = save_dstore('mode',False)
3325 save_dstore('rc_pprint',rc.pprint)
3353 save_dstore('rc_pprint',rc.pprint)
3326 save_dstore('xmode',shell.InteractiveTB.mode)
3354 save_dstore('xmode',shell.InteractiveTB.mode)
3327 save_dstore('rc_separate_out',rc.separate_out)
3355 save_dstore('rc_separate_out',rc.separate_out)
3328 save_dstore('rc_separate_out2',rc.separate_out2)
3356 save_dstore('rc_separate_out2',rc.separate_out2)
3329 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
3357 save_dstore('rc_prompts_pad_left',rc.prompts_pad_left)
3330 save_dstore('rc_separate_in',rc.separate_in)
3358 save_dstore('rc_separate_in',rc.separate_in)
3331
3359
3332 if mode == False:
3360 if mode == False:
3333 # turn on
3361 # turn on
3334 ipaste.activate_prefilter()
3362 ipaste.activate_prefilter()
3335
3363
3336 oc.prompt1.p_template = '>>> '
3364 oc.prompt1.p_template = '>>> '
3337 oc.prompt2.p_template = '... '
3365 oc.prompt2.p_template = '... '
3338 oc.prompt_out.p_template = ''
3366 oc.prompt_out.p_template = ''
3339
3367
3340 # Prompt separators like plain python
3368 # Prompt separators like plain python
3341 oc.input_sep = oc.prompt1.sep = ''
3369 oc.input_sep = oc.prompt1.sep = ''
3342 oc.output_sep = ''
3370 oc.output_sep = ''
3343 oc.output_sep2 = ''
3371 oc.output_sep2 = ''
3344
3372
3345 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3373 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3346 oc.prompt_out.pad_left = False
3374 oc.prompt_out.pad_left = False
3347
3375
3348 rc.pprint = False
3376 rc.pprint = False
3349
3377
3350 shell.magic_xmode('Plain')
3378 shell.magic_xmode('Plain')
3351
3379
3352 else:
3380 else:
3353 # turn off
3381 # turn off
3354 ipaste.deactivate_prefilter()
3382 ipaste.deactivate_prefilter()
3355
3383
3356 oc.prompt1.p_template = rc.prompt_in1
3384 oc.prompt1.p_template = rc.prompt_in1
3357 oc.prompt2.p_template = rc.prompt_in2
3385 oc.prompt2.p_template = rc.prompt_in2
3358 oc.prompt_out.p_template = rc.prompt_out
3386 oc.prompt_out.p_template = rc.prompt_out
3359
3387
3360 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3388 oc.input_sep = oc.prompt1.sep = dstore.rc_separate_in
3361
3389
3362 oc.output_sep = dstore.rc_separate_out
3390 oc.output_sep = dstore.rc_separate_out
3363 oc.output_sep2 = dstore.rc_separate_out2
3391 oc.output_sep2 = dstore.rc_separate_out2
3364
3392
3365 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3393 oc.prompt1.pad_left = oc.prompt2.pad_left = \
3366 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3394 oc.prompt_out.pad_left = dstore.rc_prompts_pad_left
3367
3395
3368 rc.pprint = dstore.rc_pprint
3396 rc.pprint = dstore.rc_pprint
3369
3397
3370 shell.magic_xmode(dstore.xmode)
3398 shell.magic_xmode(dstore.xmode)
3371
3399
3372 # Store new mode and inform
3400 # Store new mode and inform
3373 dstore.mode = bool(1-int(mode))
3401 dstore.mode = bool(1-int(mode))
3374 print 'Doctest mode is:',
3402 print 'Doctest mode is:',
3375 print ['OFF','ON'][dstore.mode]
3403 print ['OFF','ON'][dstore.mode]
3376
3404
3377 # end Magic
3405 # end Magic
@@ -1,97 +1,121 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Release data for the IPython project."""
2 """Release data for the IPython project."""
3
3
4 #*****************************************************************************
4 #*****************************************************************************
5 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
5 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
6 #
6 #
7 # Copyright (c) 2001 Janko Hauser <jhauser@zscout.de> and Nathaniel Gray
7 # Copyright (c) 2001 Janko Hauser <jhauser@zscout.de> and Nathaniel Gray
8 # <n8gray@caltech.edu>
8 # <n8gray@caltech.edu>
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 # Name of the package for release purposes. This is the name which labels
14 # Name of the package for release purposes. This is the name which labels
15 # the tarballs and RPMs made by distutils, so it's best to lowercase it.
15 # the tarballs and RPMs made by distutils, so it's best to lowercase it.
16 name = 'ipython'
16 name = 'ipython'
17
17
18 # For versions with substrings (like 0.6.16.svn), use an extra . to separate
18 # For versions with substrings (like 0.6.16.svn), use an extra . to separate
19 # the new substring. We have to avoid using either dashes or underscores,
19 # the new substring. We have to avoid using either dashes or underscores,
20 # because bdist_rpm does not accept dashes (an RPM) convention, and
20 # because bdist_rpm does not accept dashes (an RPM) convention, and
21 # bdist_deb does not accept underscores (a Debian convention).
21 # bdist_deb does not accept underscores (a Debian convention).
22
22
23 development = False # change this to False to do a release
23 development = False # change this to False to do a release
24 version_base = '0.9.1'
24 version_base = '0.9.1'
25 branch = 'ipython'
25 branch = 'ipython'
26 revision = '1143'
26 revision = '1143'
27
27
28 if development:
28 if development:
29 if branch == 'ipython':
29 if branch == 'ipython':
30 version = '%s.bzr.r%s' % (version_base, revision)
30 version = '%s.bzr.r%s' % (version_base, revision)
31 else:
31 else:
32 version = '%s.bzr.r%s.%s' % (version_base, revision, branch)
32 version = '%s.bzr.r%s.%s' % (version_base, revision, branch)
33 else:
33 else:
34 version = version_base
34 version = version_base
35
35
36
36
37 description = "Tools for interactive development in Python."
37 description = "An interactive computing environment for Python"
38
38
39 long_description = \
39 long_description = \
40 """
40 """
41 IPython provides a replacement for the interactive Python interpreter with
41 The goal of IPython is to create a comprehensive environment for
42 extra functionality.
42 interactive and exploratory computing. To support this goal, IPython
43 has two main components:
43
44
44 Main features:
45 * An enhanced interactive Python shell.
46
47 * An architecture for interactive parallel computing.
48
49 The enhanced interactive Python shell has the following main features:
45
50
46 * Comprehensive object introspection.
51 * Comprehensive object introspection.
47
52
48 * Input history, persistent across sessions.
53 * Input history, persistent across sessions.
49
54
50 * Caching of output results during a session with automatically generated
55 * Caching of output results during a session with automatically generated
51 references.
56 references.
52
57
53 * Readline based name completion.
58 * Readline based name completion.
54
59
55 * Extensible system of 'magic' commands for controlling the environment and
60 * Extensible system of 'magic' commands for controlling the environment and
56 performing many tasks related either to IPython or the operating system.
61 performing many tasks related either to IPython or the operating system.
57
62
58 * Configuration system with easy switching between different setups (simpler
63 * Configuration system with easy switching between different setups (simpler
59 than changing $PYTHONSTARTUP environment variables every time).
64 than changing $PYTHONSTARTUP environment variables every time).
60
65
61 * Session logging and reloading.
66 * Session logging and reloading.
62
67
63 * Extensible syntax processing for special purpose situations.
68 * Extensible syntax processing for special purpose situations.
64
69
65 * Access to the system shell with user-extensible alias system.
70 * Access to the system shell with user-extensible alias system.
66
71
67 * Easily embeddable in other Python programs.
72 * Easily embeddable in other Python programs and wxPython GUIs.
68
73
69 * Integrated access to the pdb debugger and the Python profiler.
74 * Integrated access to the pdb debugger and the Python profiler.
70
75
71 The latest development version is always available at the IPython subversion
76 The parallel computing architecture has the following main features:
72 repository_.
77
78 * Quickly parallelize Python code from an interactive Python/IPython session.
79
80 * A flexible and dynamic process model that be deployed on anything from
81 multicore workstations to supercomputers.
82
83 * An architecture that supports many different styles of parallelism, from
84 message passing to task farming.
85
86 * Both blocking and fully asynchronous interfaces.
87
88 * High level APIs that enable many things to be parallelized in a few lines
89 of code.
90
91 * Share live parallel jobs with other users securely.
92
93 * Dynamically load balanced task farming system.
94
95 * Robust error handling in parallel code.
73
96
74 .. _repository: http://ipython.scipy.org/svn/ipython/ipython/trunk#egg=ipython-dev
97 The latest development version is always available from IPython's `Launchpad
98 site <http://launchpad.net/ipython>`_.
75 """
99 """
76
100
77 license = 'BSD'
101 license = 'BSD'
78
102
79 authors = {'Fernando' : ('Fernando Perez','fperez@colorado.edu'),
103 authors = {'Fernando' : ('Fernando Perez','fperez@colorado.edu'),
80 'Janko' : ('Janko Hauser','jhauser@zscout.de'),
104 'Janko' : ('Janko Hauser','jhauser@zscout.de'),
81 'Nathan' : ('Nathaniel Gray','n8gray@caltech.edu'),
105 'Nathan' : ('Nathaniel Gray','n8gray@caltech.edu'),
82 'Ville' : ('Ville Vainio','vivainio@gmail.com'),
106 'Ville' : ('Ville Vainio','vivainio@gmail.com'),
83 'Brian' : ('Brian E Granger', 'ellisonbg@gmail.com'),
107 'Brian' : ('Brian E Granger', 'ellisonbg@gmail.com'),
84 'Min' : ('Min Ragan-Kelley', 'benjaminrk@gmail.com')
108 'Min' : ('Min Ragan-Kelley', 'benjaminrk@gmail.com')
85 }
109 }
86
110
87 author = 'The IPython Development Team'
111 author = 'The IPython Development Team'
88
112
89 author_email = 'ipython-dev@scipy.org'
113 author_email = 'ipython-dev@scipy.org'
90
114
91 url = 'http://ipython.scipy.org'
115 url = 'http://ipython.scipy.org'
92
116
93 download_url = 'http://ipython.scipy.org/dist'
117 download_url = 'http://ipython.scipy.org/dist'
94
118
95 platforms = ['Linux','Mac OSX','Windows XP/2000/NT','Windows 95/98/ME']
119 platforms = ['Linux','Mac OSX','Windows XP/2000/NT','Windows 95/98/ME']
96
120
97 keywords = ['Interactive','Interpreter','Shell','Parallel','Distributed']
121 keywords = ['Interactive','Interpreter','Shell','Parallel','Distributed']
@@ -1,1238 +1,1249 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """IPython Shell classes.
2 """IPython Shell classes.
3
3
4 All the matplotlib support code was co-developed with John Hunter,
4 All the matplotlib support code was co-developed with John Hunter,
5 matplotlib's author.
5 matplotlib's author.
6
6
7 $Id: Shell.py 3024 2008-02-07 15:34:42Z darren.dale $"""
7 $Id: Shell.py 3024 2008-02-07 15:34:42Z darren.dale $"""
8
8
9 #*****************************************************************************
9 #*****************************************************************************
10 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
10 # Copyright (C) 2001-2006 Fernando Perez <fperez@colorado.edu>
11 #
11 #
12 # Distributed under the terms of the BSD License. The full license is in
12 # Distributed under the terms of the BSD License. The full license is in
13 # the file COPYING, distributed as part of this software.
13 # the file COPYING, distributed as part of this software.
14 #*****************************************************************************
14 #*****************************************************************************
15
15
16 from IPython import Release
16 from IPython import Release
17 __author__ = '%s <%s>' % Release.authors['Fernando']
17 __author__ = '%s <%s>' % Release.authors['Fernando']
18 __license__ = Release.license
18 __license__ = Release.license
19
19
20 # Code begins
20 # Code begins
21 # Stdlib imports
21 # Stdlib imports
22 import __builtin__
22 import __builtin__
23 import __main__
23 import __main__
24 import Queue
24 import Queue
25 import inspect
25 import inspect
26 import os
26 import os
27 import sys
27 import sys
28 import thread
28 import thread
29 import threading
29 import threading
30 import time
30 import time
31
31
32 from signal import signal, SIGINT
32 from signal import signal, SIGINT
33
33
34 try:
34 try:
35 import ctypes
35 import ctypes
36 HAS_CTYPES = True
36 HAS_CTYPES = True
37 except ImportError:
37 except ImportError:
38 HAS_CTYPES = False
38 HAS_CTYPES = False
39
39
40 # IPython imports
40 # IPython imports
41 import IPython
41 import IPython
42 from IPython import ultraTB, ipapi
42 from IPython import ultraTB, ipapi
43 from IPython.Magic import Magic
43 from IPython.Magic import Magic
44 from IPython.genutils import Term,warn,error,flag_calls, ask_yes_no
44 from IPython.genutils import Term,warn,error,flag_calls, ask_yes_no
45 from IPython.iplib import InteractiveShell
45 from IPython.iplib import InteractiveShell
46 from IPython.ipmaker import make_IPython
46 from IPython.ipmaker import make_IPython
47 from IPython.ipstruct import Struct
47 from IPython.ipstruct import Struct
48 from IPython.testing import decorators as testdec
48 from IPython.testing import decorators as testdec
49
49
50 # Globals
50 # Globals
51 # global flag to pass around information about Ctrl-C without exceptions
51 # global flag to pass around information about Ctrl-C without exceptions
52 KBINT = False
52 KBINT = False
53
53
54 # global flag to turn on/off Tk support.
54 # global flag to turn on/off Tk support.
55 USE_TK = False
55 USE_TK = False
56
56
57 # ID for the main thread, used for cross-thread exceptions
57 # ID for the main thread, used for cross-thread exceptions
58 MAIN_THREAD_ID = thread.get_ident()
58 MAIN_THREAD_ID = thread.get_ident()
59
59
60 # Tag when runcode() is active, for exception handling
60 # Tag when runcode() is active, for exception handling
61 CODE_RUN = None
61 CODE_RUN = None
62
62
63 # Default timeout for waiting for multithreaded shells (in seconds)
63 # Default timeout for waiting for multithreaded shells (in seconds)
64 GUI_TIMEOUT = 10
64 GUI_TIMEOUT = 10
65
65
66 #-----------------------------------------------------------------------------
66 #-----------------------------------------------------------------------------
67 # This class is trivial now, but I want to have it in to publish a clean
67 # This class is trivial now, but I want to have it in to publish a clean
68 # interface. Later when the internals are reorganized, code that uses this
68 # interface. Later when the internals are reorganized, code that uses this
69 # shouldn't have to change.
69 # shouldn't have to change.
70
70
71 class IPShell:
71 class IPShell:
72 """Create an IPython instance."""
72 """Create an IPython instance."""
73
73
74 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
74 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
75 debug=1,shell_class=InteractiveShell):
75 debug=1,shell_class=InteractiveShell):
76 self.IP = make_IPython(argv,user_ns=user_ns,
76 self.IP = make_IPython(argv,user_ns=user_ns,
77 user_global_ns=user_global_ns,
77 user_global_ns=user_global_ns,
78 debug=debug,shell_class=shell_class)
78 debug=debug,shell_class=shell_class)
79
79
80 def mainloop(self,sys_exit=0,banner=None):
80 def mainloop(self,sys_exit=0,banner=None):
81 self.IP.mainloop(banner)
81 self.IP.mainloop(banner)
82 if sys_exit:
82 if sys_exit:
83 sys.exit()
83 sys.exit()
84
84
85 #-----------------------------------------------------------------------------
85 #-----------------------------------------------------------------------------
86 def kill_embedded(self,parameter_s=''):
86 def kill_embedded(self,parameter_s=''):
87 """%kill_embedded : deactivate for good the current embedded IPython.
87 """%kill_embedded : deactivate for good the current embedded IPython.
88
88
89 This function (after asking for confirmation) sets an internal flag so that
89 This function (after asking for confirmation) sets an internal flag so that
90 an embedded IPython will never activate again. This is useful to
90 an embedded IPython will never activate again. This is useful to
91 permanently disable a shell that is being called inside a loop: once you've
91 permanently disable a shell that is being called inside a loop: once you've
92 figured out what you needed from it, you may then kill it and the program
92 figured out what you needed from it, you may then kill it and the program
93 will then continue to run without the interactive shell interfering again.
93 will then continue to run without the interactive shell interfering again.
94 """
94 """
95
95
96 kill = ask_yes_no("Are you sure you want to kill this embedded instance "
96 kill = ask_yes_no("Are you sure you want to kill this embedded instance "
97 "(y/n)? [y/N] ",'n')
97 "(y/n)? [y/N] ",'n')
98 if kill:
98 if kill:
99 self.shell.embedded_active = False
99 self.shell.embedded_active = False
100 print "This embedded IPython will not reactivate anymore once you exit."
100 print "This embedded IPython will not reactivate anymore once you exit."
101
101
102 class IPShellEmbed:
102 class IPShellEmbed:
103 """Allow embedding an IPython shell into a running program.
103 """Allow embedding an IPython shell into a running program.
104
104
105 Instances of this class are callable, with the __call__ method being an
105 Instances of this class are callable, with the __call__ method being an
106 alias to the embed() method of an InteractiveShell instance.
106 alias to the embed() method of an InteractiveShell instance.
107
107
108 Usage (see also the example-embed.py file for a running example):
108 Usage (see also the example-embed.py file for a running example):
109
109
110 ipshell = IPShellEmbed([argv,banner,exit_msg,rc_override])
110 ipshell = IPShellEmbed([argv,banner,exit_msg,rc_override])
111
111
112 - argv: list containing valid command-line options for IPython, as they
112 - argv: list containing valid command-line options for IPython, as they
113 would appear in sys.argv[1:].
113 would appear in sys.argv[1:].
114
114
115 For example, the following command-line options:
115 For example, the following command-line options:
116
116
117 $ ipython -prompt_in1 'Input <\\#>' -colors LightBG
117 $ ipython -prompt_in1 'Input <\\#>' -colors LightBG
118
118
119 would be passed in the argv list as:
119 would be passed in the argv list as:
120
120
121 ['-prompt_in1','Input <\\#>','-colors','LightBG']
121 ['-prompt_in1','Input <\\#>','-colors','LightBG']
122
122
123 - banner: string which gets printed every time the interpreter starts.
123 - banner: string which gets printed every time the interpreter starts.
124
124
125 - exit_msg: string which gets printed every time the interpreter exits.
125 - exit_msg: string which gets printed every time the interpreter exits.
126
126
127 - rc_override: a dict or Struct of configuration options such as those
127 - rc_override: a dict or Struct of configuration options such as those
128 used by IPython. These options are read from your ~/.ipython/ipythonrc
128 used by IPython. These options are read from your ~/.ipython/ipythonrc
129 file when the Shell object is created. Passing an explicit rc_override
129 file when the Shell object is created. Passing an explicit rc_override
130 dict with any options you want allows you to override those values at
130 dict with any options you want allows you to override those values at
131 creation time without having to modify the file. This way you can create
131 creation time without having to modify the file. This way you can create
132 embeddable instances configured in any way you want without editing any
132 embeddable instances configured in any way you want without editing any
133 global files (thus keeping your interactive IPython configuration
133 global files (thus keeping your interactive IPython configuration
134 unchanged).
134 unchanged).
135
135
136 Then the ipshell instance can be called anywhere inside your code:
136 Then the ipshell instance can be called anywhere inside your code:
137
137
138 ipshell(header='') -> Opens up an IPython shell.
138 ipshell(header='') -> Opens up an IPython shell.
139
139
140 - header: string printed by the IPython shell upon startup. This can let
140 - header: string printed by the IPython shell upon startup. This can let
141 you know where in your code you are when dropping into the shell. Note
141 you know where in your code you are when dropping into the shell. Note
142 that 'banner' gets prepended to all calls, so header is used for
142 that 'banner' gets prepended to all calls, so header is used for
143 location-specific information.
143 location-specific information.
144
144
145 For more details, see the __call__ method below.
145 For more details, see the __call__ method below.
146
146
147 When the IPython shell is exited with Ctrl-D, normal program execution
147 When the IPython shell is exited with Ctrl-D, normal program execution
148 resumes.
148 resumes.
149
149
150 This functionality was inspired by a posting on comp.lang.python by cmkl
150 This functionality was inspired by a posting on comp.lang.python by cmkl
151 <cmkleffner@gmx.de> on Dec. 06/01 concerning similar uses of pyrepl, and
151 <cmkleffner@gmx.de> on Dec. 06/01 concerning similar uses of pyrepl, and
152 by the IDL stop/continue commands."""
152 by the IDL stop/continue commands."""
153
153
154 def __init__(self,argv=None,banner='',exit_msg=None,rc_override=None,
154 def __init__(self,argv=None,banner='',exit_msg=None,rc_override=None,
155 user_ns=None):
155 user_ns=None):
156 """Note that argv here is a string, NOT a list."""
156 """Note that argv here is a string, NOT a list."""
157 self.set_banner(banner)
157 self.set_banner(banner)
158 self.set_exit_msg(exit_msg)
158 self.set_exit_msg(exit_msg)
159 self.set_dummy_mode(0)
159 self.set_dummy_mode(0)
160
160
161 # sys.displayhook is a global, we need to save the user's original
161 # sys.displayhook is a global, we need to save the user's original
162 # Don't rely on __displayhook__, as the user may have changed that.
162 # Don't rely on __displayhook__, as the user may have changed that.
163 self.sys_displayhook_ori = sys.displayhook
163 self.sys_displayhook_ori = sys.displayhook
164
164
165 # save readline completer status
165 # save readline completer status
166 try:
166 try:
167 #print 'Save completer',sys.ipcompleter # dbg
167 #print 'Save completer',sys.ipcompleter # dbg
168 self.sys_ipcompleter_ori = sys.ipcompleter
168 self.sys_ipcompleter_ori = sys.ipcompleter
169 except:
169 except:
170 pass # not nested with IPython
170 pass # not nested with IPython
171
171
172 self.IP = make_IPython(argv,rc_override=rc_override,
172 self.IP = make_IPython(argv,rc_override=rc_override,
173 embedded=True,
173 embedded=True,
174 user_ns=user_ns)
174 user_ns=user_ns)
175
175
176 ip = ipapi.IPApi(self.IP)
176 ip = ipapi.IPApi(self.IP)
177 ip.expose_magic("kill_embedded",kill_embedded)
177 ip.expose_magic("kill_embedded",kill_embedded)
178
178
179 # copy our own displayhook also
179 # copy our own displayhook also
180 self.sys_displayhook_embed = sys.displayhook
180 self.sys_displayhook_embed = sys.displayhook
181 # and leave the system's display hook clean
181 # and leave the system's display hook clean
182 sys.displayhook = self.sys_displayhook_ori
182 sys.displayhook = self.sys_displayhook_ori
183 # don't use the ipython crash handler so that user exceptions aren't
183 # don't use the ipython crash handler so that user exceptions aren't
184 # trapped
184 # trapped
185 sys.excepthook = ultraTB.FormattedTB(color_scheme = self.IP.rc.colors,
185 sys.excepthook = ultraTB.FormattedTB(color_scheme = self.IP.rc.colors,
186 mode = self.IP.rc.xmode,
186 mode = self.IP.rc.xmode,
187 call_pdb = self.IP.rc.pdb)
187 call_pdb = self.IP.rc.pdb)
188 self.restore_system_completer()
188 self.restore_system_completer()
189
189
190 def restore_system_completer(self):
190 def restore_system_completer(self):
191 """Restores the readline completer which was in place.
191 """Restores the readline completer which was in place.
192
192
193 This allows embedded IPython within IPython not to disrupt the
193 This allows embedded IPython within IPython not to disrupt the
194 parent's completion.
194 parent's completion.
195 """
195 """
196
196
197 try:
197 try:
198 self.IP.readline.set_completer(self.sys_ipcompleter_ori)
198 self.IP.readline.set_completer(self.sys_ipcompleter_ori)
199 sys.ipcompleter = self.sys_ipcompleter_ori
199 sys.ipcompleter = self.sys_ipcompleter_ori
200 except:
200 except:
201 pass
201 pass
202
202
203 def __call__(self,header='',local_ns=None,global_ns=None,dummy=None):
203 def __call__(self,header='',local_ns=None,global_ns=None,dummy=None):
204 """Activate the interactive interpreter.
204 """Activate the interactive interpreter.
205
205
206 __call__(self,header='',local_ns=None,global_ns,dummy=None) -> Start
206 __call__(self,header='',local_ns=None,global_ns,dummy=None) -> Start
207 the interpreter shell with the given local and global namespaces, and
207 the interpreter shell with the given local and global namespaces, and
208 optionally print a header string at startup.
208 optionally print a header string at startup.
209
209
210 The shell can be globally activated/deactivated using the
210 The shell can be globally activated/deactivated using the
211 set/get_dummy_mode methods. This allows you to turn off a shell used
211 set/get_dummy_mode methods. This allows you to turn off a shell used
212 for debugging globally.
212 for debugging globally.
213
213
214 However, *each* time you call the shell you can override the current
214 However, *each* time you call the shell you can override the current
215 state of dummy_mode with the optional keyword parameter 'dummy'. For
215 state of dummy_mode with the optional keyword parameter 'dummy'. For
216 example, if you set dummy mode on with IPShell.set_dummy_mode(1), you
216 example, if you set dummy mode on with IPShell.set_dummy_mode(1), you
217 can still have a specific call work by making it as IPShell(dummy=0).
217 can still have a specific call work by making it as IPShell(dummy=0).
218
218
219 The optional keyword parameter dummy controls whether the call
219 The optional keyword parameter dummy controls whether the call
220 actually does anything. """
220 actually does anything. """
221
221
222 # If the user has turned it off, go away
222 # If the user has turned it off, go away
223 if not self.IP.embedded_active:
223 if not self.IP.embedded_active:
224 return
224 return
225
225
226 # Normal exits from interactive mode set this flag, so the shell can't
226 # Normal exits from interactive mode set this flag, so the shell can't
227 # re-enter (it checks this variable at the start of interactive mode).
227 # re-enter (it checks this variable at the start of interactive mode).
228 self.IP.exit_now = False
228 self.IP.exit_now = False
229
229
230 # Allow the dummy parameter to override the global __dummy_mode
230 # Allow the dummy parameter to override the global __dummy_mode
231 if dummy or (dummy != 0 and self.__dummy_mode):
231 if dummy or (dummy != 0 and self.__dummy_mode):
232 return
232 return
233
233
234 # Set global subsystems (display,completions) to our values
234 # Set global subsystems (display,completions) to our values
235 sys.displayhook = self.sys_displayhook_embed
235 sys.displayhook = self.sys_displayhook_embed
236 if self.IP.has_readline:
236 if self.IP.has_readline:
237 self.IP.set_completer()
237 self.IP.set_completer()
238
238
239 if self.banner and header:
239 if self.banner and header:
240 format = '%s\n%s\n'
240 format = '%s\n%s\n'
241 else:
241 else:
242 format = '%s%s\n'
242 format = '%s%s\n'
243 banner = format % (self.banner,header)
243 banner = format % (self.banner,header)
244
244
245 # Call the embedding code with a stack depth of 1 so it can skip over
245 # Call the embedding code with a stack depth of 1 so it can skip over
246 # our call and get the original caller's namespaces.
246 # our call and get the original caller's namespaces.
247 self.IP.embed_mainloop(banner,local_ns,global_ns,stack_depth=1)
247 self.IP.embed_mainloop(banner,local_ns,global_ns,stack_depth=1)
248
248
249 if self.exit_msg:
249 if self.exit_msg:
250 print self.exit_msg
250 print self.exit_msg
251
251
252 # Restore global systems (display, completion)
252 # Restore global systems (display, completion)
253 sys.displayhook = self.sys_displayhook_ori
253 sys.displayhook = self.sys_displayhook_ori
254 self.restore_system_completer()
254 self.restore_system_completer()
255
255
256 def set_dummy_mode(self,dummy):
256 def set_dummy_mode(self,dummy):
257 """Sets the embeddable shell's dummy mode parameter.
257 """Sets the embeddable shell's dummy mode parameter.
258
258
259 set_dummy_mode(dummy): dummy = 0 or 1.
259 set_dummy_mode(dummy): dummy = 0 or 1.
260
260
261 This parameter is persistent and makes calls to the embeddable shell
261 This parameter is persistent and makes calls to the embeddable shell
262 silently return without performing any action. This allows you to
262 silently return without performing any action. This allows you to
263 globally activate or deactivate a shell you're using with a single call.
263 globally activate or deactivate a shell you're using with a single call.
264
264
265 If you need to manually"""
265 If you need to manually"""
266
266
267 if dummy not in [0,1,False,True]:
267 if dummy not in [0,1,False,True]:
268 raise ValueError,'dummy parameter must be boolean'
268 raise ValueError,'dummy parameter must be boolean'
269 self.__dummy_mode = dummy
269 self.__dummy_mode = dummy
270
270
271 def get_dummy_mode(self):
271 def get_dummy_mode(self):
272 """Return the current value of the dummy mode parameter.
272 """Return the current value of the dummy mode parameter.
273 """
273 """
274 return self.__dummy_mode
274 return self.__dummy_mode
275
275
276 def set_banner(self,banner):
276 def set_banner(self,banner):
277 """Sets the global banner.
277 """Sets the global banner.
278
278
279 This banner gets prepended to every header printed when the shell
279 This banner gets prepended to every header printed when the shell
280 instance is called."""
280 instance is called."""
281
281
282 self.banner = banner
282 self.banner = banner
283
283
284 def set_exit_msg(self,exit_msg):
284 def set_exit_msg(self,exit_msg):
285 """Sets the global exit_msg.
285 """Sets the global exit_msg.
286
286
287 This exit message gets printed upon exiting every time the embedded
287 This exit message gets printed upon exiting every time the embedded
288 shell is called. It is None by default. """
288 shell is called. It is None by default. """
289
289
290 self.exit_msg = exit_msg
290 self.exit_msg = exit_msg
291
291
292 #-----------------------------------------------------------------------------
292 #-----------------------------------------------------------------------------
293 if HAS_CTYPES:
293 if HAS_CTYPES:
294 # Add async exception support. Trick taken from:
294 # Add async exception support. Trick taken from:
295 # http://sebulba.wikispaces.com/recipe+thread2
295 # http://sebulba.wikispaces.com/recipe+thread2
296 def _async_raise(tid, exctype):
296 def _async_raise(tid, exctype):
297 """raises the exception, performs cleanup if needed"""
297 """raises the exception, performs cleanup if needed"""
298 if not inspect.isclass(exctype):
298 if not inspect.isclass(exctype):
299 raise TypeError("Only types can be raised (not instances)")
299 raise TypeError("Only types can be raised (not instances)")
300 res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,
300 res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,
301 ctypes.py_object(exctype))
301 ctypes.py_object(exctype))
302 if res == 0:
302 if res == 0:
303 raise ValueError("invalid thread id")
303 raise ValueError("invalid thread id")
304 elif res != 1:
304 elif res != 1:
305 # """if it returns a number greater than one, you're in trouble,
305 # """if it returns a number greater than one, you're in trouble,
306 # and you should call it again with exc=NULL to revert the effect"""
306 # and you should call it again with exc=NULL to revert the effect"""
307 ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
307 ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
308 raise SystemError("PyThreadState_SetAsyncExc failed")
308 raise SystemError("PyThreadState_SetAsyncExc failed")
309
309
310 def sigint_handler (signum,stack_frame):
310 def sigint_handler (signum,stack_frame):
311 """Sigint handler for threaded apps.
311 """Sigint handler for threaded apps.
312
312
313 This is a horrible hack to pass information about SIGINT _without_
313 This is a horrible hack to pass information about SIGINT _without_
314 using exceptions, since I haven't been able to properly manage
314 using exceptions, since I haven't been able to properly manage
315 cross-thread exceptions in GTK/WX. In fact, I don't think it can be
315 cross-thread exceptions in GTK/WX. In fact, I don't think it can be
316 done (or at least that's my understanding from a c.l.py thread where
316 done (or at least that's my understanding from a c.l.py thread where
317 this was discussed)."""
317 this was discussed)."""
318
318
319 global KBINT
319 global KBINT
320
320
321 if CODE_RUN:
321 if CODE_RUN:
322 _async_raise(MAIN_THREAD_ID,KeyboardInterrupt)
322 _async_raise(MAIN_THREAD_ID,KeyboardInterrupt)
323 else:
323 else:
324 KBINT = True
324 KBINT = True
325 print '\nKeyboardInterrupt - Press <Enter> to continue.',
325 print '\nKeyboardInterrupt - Press <Enter> to continue.',
326 Term.cout.flush()
326 Term.cout.flush()
327
327
328 else:
328 else:
329 def sigint_handler (signum,stack_frame):
329 def sigint_handler (signum,stack_frame):
330 """Sigint handler for threaded apps.
330 """Sigint handler for threaded apps.
331
331
332 This is a horrible hack to pass information about SIGINT _without_
332 This is a horrible hack to pass information about SIGINT _without_
333 using exceptions, since I haven't been able to properly manage
333 using exceptions, since I haven't been able to properly manage
334 cross-thread exceptions in GTK/WX. In fact, I don't think it can be
334 cross-thread exceptions in GTK/WX. In fact, I don't think it can be
335 done (or at least that's my understanding from a c.l.py thread where
335 done (or at least that's my understanding from a c.l.py thread where
336 this was discussed)."""
336 this was discussed)."""
337
337
338 global KBINT
338 global KBINT
339
339
340 print '\nKeyboardInterrupt - Press <Enter> to continue.',
340 print '\nKeyboardInterrupt - Press <Enter> to continue.',
341 Term.cout.flush()
341 Term.cout.flush()
342 # Set global flag so that runsource can know that Ctrl-C was hit
342 # Set global flag so that runsource can know that Ctrl-C was hit
343 KBINT = True
343 KBINT = True
344
344
345
345
346 class MTInteractiveShell(InteractiveShell):
346 class MTInteractiveShell(InteractiveShell):
347 """Simple multi-threaded shell."""
347 """Simple multi-threaded shell."""
348
348
349 # Threading strategy taken from:
349 # Threading strategy taken from:
350 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65109, by Brian
350 # http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/65109, by Brian
351 # McErlean and John Finlay. Modified with corrections by Antoon Pardon,
351 # McErlean and John Finlay. Modified with corrections by Antoon Pardon,
352 # from the pygtk mailing list, to avoid lockups with system calls.
352 # from the pygtk mailing list, to avoid lockups with system calls.
353
353
354 # class attribute to indicate whether the class supports threads or not.
354 # class attribute to indicate whether the class supports threads or not.
355 # Subclasses with thread support should override this as needed.
355 # Subclasses with thread support should override this as needed.
356 isthreaded = True
356 isthreaded = True
357
357
358 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
358 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
359 user_ns=None,user_global_ns=None,banner2='',
359 user_ns=None,user_global_ns=None,banner2='',
360 gui_timeout=GUI_TIMEOUT,**kw):
360 gui_timeout=GUI_TIMEOUT,**kw):
361 """Similar to the normal InteractiveShell, but with threading control"""
361 """Similar to the normal InteractiveShell, but with threading control"""
362
362
363 InteractiveShell.__init__(self,name,usage,rc,user_ns,
363 InteractiveShell.__init__(self,name,usage,rc,user_ns,
364 user_global_ns,banner2)
364 user_global_ns,banner2)
365
365
366 # Timeout we wait for GUI thread
366 # Timeout we wait for GUI thread
367 self.gui_timeout = gui_timeout
367 self.gui_timeout = gui_timeout
368
368
369 # A queue to hold the code to be executed.
369 # A queue to hold the code to be executed.
370 self.code_queue = Queue.Queue()
370 self.code_queue = Queue.Queue()
371
371
372 # Stuff to do at closing time
372 # Stuff to do at closing time
373 self._kill = None
373 self._kill = None
374 on_kill = kw.get('on_kill', [])
374 on_kill = kw.get('on_kill', [])
375 # Check that all things to kill are callable:
375 # Check that all things to kill are callable:
376 for t in on_kill:
376 for t in on_kill:
377 if not callable(t):
377 if not callable(t):
378 raise TypeError,'on_kill must be a list of callables'
378 raise TypeError,'on_kill must be a list of callables'
379 self.on_kill = on_kill
379 self.on_kill = on_kill
380 # thread identity of the "worker thread" (that may execute code directly)
380 # thread identity of the "worker thread" (that may execute code directly)
381 self.worker_ident = None
381 self.worker_ident = None
382
382
383 def runsource(self, source, filename="<input>", symbol="single"):
383 def runsource(self, source, filename="<input>", symbol="single"):
384 """Compile and run some source in the interpreter.
384 """Compile and run some source in the interpreter.
385
385
386 Modified version of code.py's runsource(), to handle threading issues.
386 Modified version of code.py's runsource(), to handle threading issues.
387 See the original for full docstring details."""
387 See the original for full docstring details."""
388
388
389 global KBINT
389 global KBINT
390
390
391 # If Ctrl-C was typed, we reset the flag and return right away
391 # If Ctrl-C was typed, we reset the flag and return right away
392 if KBINT:
392 if KBINT:
393 KBINT = False
393 KBINT = False
394 return False
394 return False
395
395
396 if self._kill:
396 if self._kill:
397 # can't queue new code if we are being killed
397 # can't queue new code if we are being killed
398 return True
398 return True
399
399
400 try:
400 try:
401 code = self.compile(source, filename, symbol)
401 code = self.compile(source, filename, symbol)
402 except (OverflowError, SyntaxError, ValueError):
402 except (OverflowError, SyntaxError, ValueError):
403 # Case 1
403 # Case 1
404 self.showsyntaxerror(filename)
404 self.showsyntaxerror(filename)
405 return False
405 return False
406
406
407 if code is None:
407 if code is None:
408 # Case 2
408 # Case 2
409 return True
409 return True
410
410
411 # shortcut - if we are in worker thread, or the worker thread is not
411 # shortcut - if we are in worker thread, or the worker thread is not
412 # running, execute directly (to allow recursion and prevent deadlock if
412 # running, execute directly (to allow recursion and prevent deadlock if
413 # code is run early in IPython construction)
413 # code is run early in IPython construction)
414
414
415 if (self.worker_ident is None
415 if (self.worker_ident is None
416 or self.worker_ident == thread.get_ident() ):
416 or self.worker_ident == thread.get_ident() ):
417 InteractiveShell.runcode(self,code)
417 InteractiveShell.runcode(self,code)
418 return
418 return False
419
419
420 # Case 3
420 # Case 3
421 # Store code in queue, so the execution thread can handle it.
421 # Store code in queue, so the execution thread can handle it.
422
422
423 completed_ev, received_ev = threading.Event(), threading.Event()
423 completed_ev, received_ev = threading.Event(), threading.Event()
424
424
425 self.code_queue.put((code,completed_ev, received_ev))
425 self.code_queue.put((code,completed_ev, received_ev))
426 # first make sure the message was received, with timeout
426 # first make sure the message was received, with timeout
427 received_ev.wait(self.gui_timeout)
427 received_ev.wait(self.gui_timeout)
428 if not received_ev.isSet():
428 if not received_ev.isSet():
429 # the mainloop is dead, start executing code directly
429 # the mainloop is dead, start executing code directly
430 print "Warning: Timeout for mainloop thread exceeded"
430 print "Warning: Timeout for mainloop thread exceeded"
431 print "switching to nonthreaded mode (until mainloop wakes up again)"
431 print "switching to nonthreaded mode (until mainloop wakes up again)"
432 self.worker_ident = None
432 self.worker_ident = None
433 else:
433 else:
434 completed_ev.wait()
434 completed_ev.wait()
435 return False
435 return False
436
436
437 def runcode(self):
437 def runcode(self):
438 """Execute a code object.
438 """Execute a code object.
439
439
440 Multithreaded wrapper around IPython's runcode()."""
440 Multithreaded wrapper around IPython's runcode()."""
441
441
442 global CODE_RUN
442 global CODE_RUN
443
443
444 # we are in worker thread, stash out the id for runsource()
444 # we are in worker thread, stash out the id for runsource()
445 self.worker_ident = thread.get_ident()
445 self.worker_ident = thread.get_ident()
446
446
447 if self._kill:
447 if self._kill:
448 print >>Term.cout, 'Closing threads...',
448 print >>Term.cout, 'Closing threads...',
449 Term.cout.flush()
449 Term.cout.flush()
450 for tokill in self.on_kill:
450 for tokill in self.on_kill:
451 tokill()
451 tokill()
452 print >>Term.cout, 'Done.'
452 print >>Term.cout, 'Done.'
453 # allow kill() to return
453 # allow kill() to return
454 self._kill.set()
454 self._kill.set()
455 return True
455 return True
456
456
457 # Install sigint handler. We do it every time to ensure that if user
457 # Install sigint handler. We do it every time to ensure that if user
458 # code modifies it, we restore our own handling.
458 # code modifies it, we restore our own handling.
459 try:
459 try:
460 signal(SIGINT,sigint_handler)
460 signal(SIGINT,sigint_handler)
461 except SystemError:
461 except SystemError:
462 # This happens under Windows, which seems to have all sorts
462 # This happens under Windows, which seems to have all sorts
463 # of problems with signal handling. Oh well...
463 # of problems with signal handling. Oh well...
464 pass
464 pass
465
465
466 # Flush queue of pending code by calling the run methood of the parent
466 # Flush queue of pending code by calling the run methood of the parent
467 # class with all items which may be in the queue.
467 # class with all items which may be in the queue.
468 code_to_run = None
468 code_to_run = None
469 while 1:
469 while 1:
470 try:
470 try:
471 code_to_run, completed_ev, received_ev = self.code_queue.get_nowait()
471 code_to_run, completed_ev, received_ev = self.code_queue.get_nowait()
472 except Queue.Empty:
472 except Queue.Empty:
473 break
473 break
474 received_ev.set()
474 received_ev.set()
475
475
476 # Exceptions need to be raised differently depending on which
476 # Exceptions need to be raised differently depending on which
477 # thread is active. This convoluted try/except is only there to
477 # thread is active. This convoluted try/except is only there to
478 # protect against asynchronous exceptions, to ensure that a KBINT
478 # protect against asynchronous exceptions, to ensure that a KBINT
479 # at the wrong time doesn't deadlock everything. The global
479 # at the wrong time doesn't deadlock everything. The global
480 # CODE_TO_RUN is set to true/false as close as possible to the
480 # CODE_TO_RUN is set to true/false as close as possible to the
481 # runcode() call, so that the KBINT handler is correctly informed.
481 # runcode() call, so that the KBINT handler is correctly informed.
482 try:
482 try:
483 try:
483 try:
484 CODE_RUN = True
484 CODE_RUN = True
485 InteractiveShell.runcode(self,code_to_run)
485 InteractiveShell.runcode(self,code_to_run)
486 except KeyboardInterrupt:
486 except KeyboardInterrupt:
487 print "Keyboard interrupted in mainloop"
487 print "Keyboard interrupted in mainloop"
488 while not self.code_queue.empty():
488 while not self.code_queue.empty():
489 code, ev1,ev2 = self.code_queue.get_nowait()
489 code, ev1,ev2 = self.code_queue.get_nowait()
490 ev1.set()
490 ev1.set()
491 ev2.set()
491 ev2.set()
492 break
492 break
493 finally:
493 finally:
494 CODE_RUN = False
494 CODE_RUN = False
495 # allow runsource() return from wait
495 # allow runsource() return from wait
496 completed_ev.set()
496 completed_ev.set()
497
497
498
498
499 # This MUST return true for gtk threading to work
499 # This MUST return true for gtk threading to work
500 return True
500 return True
501
501
502 def kill(self):
502 def kill(self):
503 """Kill the thread, returning when it has been shut down."""
503 """Kill the thread, returning when it has been shut down."""
504 self._kill = threading.Event()
504 self._kill = threading.Event()
505 self._kill.wait()
505 self._kill.wait()
506
506
507 class MatplotlibShellBase:
507 class MatplotlibShellBase:
508 """Mixin class to provide the necessary modifications to regular IPython
508 """Mixin class to provide the necessary modifications to regular IPython
509 shell classes for matplotlib support.
509 shell classes for matplotlib support.
510
510
511 Given Python's MRO, this should be used as the FIRST class in the
511 Given Python's MRO, this should be used as the FIRST class in the
512 inheritance hierarchy, so that it overrides the relevant methods."""
512 inheritance hierarchy, so that it overrides the relevant methods."""
513
513
514 def _matplotlib_config(self,name,user_ns,user_global_ns=None):
514 def _matplotlib_config(self,name,user_ns,user_global_ns=None):
515 """Return items needed to setup the user's shell with matplotlib"""
515 """Return items needed to setup the user's shell with matplotlib"""
516
516
517 # Initialize matplotlib to interactive mode always
517 # Initialize matplotlib to interactive mode always
518 import matplotlib
518 import matplotlib
519 from matplotlib import backends
519 from matplotlib import backends
520 matplotlib.interactive(True)
520 matplotlib.interactive(True)
521
521
522 def use(arg):
522 def use(arg):
523 """IPython wrapper for matplotlib's backend switcher.
523 """IPython wrapper for matplotlib's backend switcher.
524
524
525 In interactive use, we can not allow switching to a different
525 In interactive use, we can not allow switching to a different
526 interactive backend, since thread conflicts will most likely crash
526 interactive backend, since thread conflicts will most likely crash
527 the python interpreter. This routine does a safety check first,
527 the python interpreter. This routine does a safety check first,
528 and refuses to perform a dangerous switch. It still allows
528 and refuses to perform a dangerous switch. It still allows
529 switching to non-interactive backends."""
529 switching to non-interactive backends."""
530
530
531 if arg in backends.interactive_bk and arg != self.mpl_backend:
531 if arg in backends.interactive_bk and arg != self.mpl_backend:
532 m=('invalid matplotlib backend switch.\n'
532 m=('invalid matplotlib backend switch.\n'
533 'This script attempted to switch to the interactive '
533 'This script attempted to switch to the interactive '
534 'backend: `%s`\n'
534 'backend: `%s`\n'
535 'Your current choice of interactive backend is: `%s`\n\n'
535 'Your current choice of interactive backend is: `%s`\n\n'
536 'Switching interactive matplotlib backends at runtime\n'
536 'Switching interactive matplotlib backends at runtime\n'
537 'would crash the python interpreter, '
537 'would crash the python interpreter, '
538 'and IPython has blocked it.\n\n'
538 'and IPython has blocked it.\n\n'
539 'You need to either change your choice of matplotlib backend\n'
539 'You need to either change your choice of matplotlib backend\n'
540 'by editing your .matplotlibrc file, or run this script as a \n'
540 'by editing your .matplotlibrc file, or run this script as a \n'
541 'standalone file from the command line, not using IPython.\n' %
541 'standalone file from the command line, not using IPython.\n' %
542 (arg,self.mpl_backend) )
542 (arg,self.mpl_backend) )
543 raise RuntimeError, m
543 raise RuntimeError, m
544 else:
544 else:
545 self.mpl_use(arg)
545 self.mpl_use(arg)
546 self.mpl_use._called = True
546 self.mpl_use._called = True
547
547
548 self.matplotlib = matplotlib
548 self.matplotlib = matplotlib
549 self.mpl_backend = matplotlib.rcParams['backend']
549 self.mpl_backend = matplotlib.rcParams['backend']
550
550
551 # we also need to block switching of interactive backends by use()
551 # we also need to block switching of interactive backends by use()
552 self.mpl_use = matplotlib.use
552 self.mpl_use = matplotlib.use
553 self.mpl_use._called = False
553 self.mpl_use._called = False
554 # overwrite the original matplotlib.use with our wrapper
554 # overwrite the original matplotlib.use with our wrapper
555 matplotlib.use = use
555 matplotlib.use = use
556
556
557 # This must be imported last in the matplotlib series, after
557 # This must be imported last in the matplotlib series, after
558 # backend/interactivity choices have been made
558 # backend/interactivity choices have been made
559 import matplotlib.pylab as pylab
559 import matplotlib.pylab as pylab
560 self.pylab = pylab
560 self.pylab = pylab
561
561
562 self.pylab.show._needmain = False
562 self.pylab.show._needmain = False
563 # We need to detect at runtime whether show() is called by the user.
563 # We need to detect at runtime whether show() is called by the user.
564 # For this, we wrap it into a decorator which adds a 'called' flag.
564 # For this, we wrap it into a decorator which adds a 'called' flag.
565 self.pylab.draw_if_interactive = flag_calls(self.pylab.draw_if_interactive)
565 self.pylab.draw_if_interactive = flag_calls(self.pylab.draw_if_interactive)
566
566
567 # Build a user namespace initialized with matplotlib/matlab features.
567 # Build a user namespace initialized with matplotlib/matlab features.
568 user_ns, user_global_ns = IPython.ipapi.make_user_namespaces(user_ns,
568 user_ns, user_global_ns = IPython.ipapi.make_user_namespaces(user_ns,
569 user_global_ns)
569 user_global_ns)
570
570
571 # Import numpy as np/pyplot as plt are conventions we're trying to
571 # Import numpy as np/pyplot as plt are conventions we're trying to
572 # somewhat standardize on. Making them available to users by default
572 # somewhat standardize on. Making them available to users by default
573 # will greatly help this.
573 # will greatly help this.
574 exec ("import numpy\n"
574 exec ("import numpy\n"
575 "import numpy as np\n"
575 "import numpy as np\n"
576 "import matplotlib\n"
576 "import matplotlib\n"
577 "import matplotlib.pylab as pylab\n"
577 "import matplotlib.pylab as pylab\n"
578 "try:\n"
578 "try:\n"
579 " import matplotlib.pyplot as plt\n"
579 " import matplotlib.pyplot as plt\n"
580 "except ImportError:\n"
580 "except ImportError:\n"
581 " pass\n"
581 " pass\n"
582 ) in user_ns
582 ) in user_ns
583
583
584 # Build matplotlib info banner
584 # Build matplotlib info banner
585 b="""
585 b="""
586 Welcome to pylab, a matplotlib-based Python environment.
586 Welcome to pylab, a matplotlib-based Python environment.
587 For more information, type 'help(pylab)'.
587 For more information, type 'help(pylab)'.
588 """
588 """
589 return user_ns,user_global_ns,b
589 return user_ns,user_global_ns,b
590
590
591 def mplot_exec(self,fname,*where,**kw):
591 def mplot_exec(self,fname,*where,**kw):
592 """Execute a matplotlib script.
592 """Execute a matplotlib script.
593
593
594 This is a call to execfile(), but wrapped in safeties to properly
594 This is a call to execfile(), but wrapped in safeties to properly
595 handle interactive rendering and backend switching."""
595 handle interactive rendering and backend switching."""
596
596
597 #print '*** Matplotlib runner ***' # dbg
597 #print '*** Matplotlib runner ***' # dbg
598 # turn off rendering until end of script
598 # turn off rendering until end of script
599 isInteractive = self.matplotlib.rcParams['interactive']
599 isInteractive = self.matplotlib.rcParams['interactive']
600 self.matplotlib.interactive(False)
600 self.matplotlib.interactive(False)
601 self.safe_execfile(fname,*where,**kw)
601 self.safe_execfile(fname,*where,**kw)
602 self.matplotlib.interactive(isInteractive)
602 self.matplotlib.interactive(isInteractive)
603 # make rendering call now, if the user tried to do it
603 # make rendering call now, if the user tried to do it
604 if self.pylab.draw_if_interactive.called:
604 if self.pylab.draw_if_interactive.called:
605 self.pylab.draw()
605 self.pylab.draw()
606 self.pylab.draw_if_interactive.called = False
606 self.pylab.draw_if_interactive.called = False
607
607
608 # if a backend switch was performed, reverse it now
608 # if a backend switch was performed, reverse it now
609 if self.mpl_use._called:
609 if self.mpl_use._called:
610 self.matplotlib.rcParams['backend'] = self.mpl_backend
610 self.matplotlib.rcParams['backend'] = self.mpl_backend
611
611
612 @testdec.skip_doctest
612 @testdec.skip_doctest
613 def magic_run(self,parameter_s=''):
613 def magic_run(self,parameter_s=''):
614 Magic.magic_run(self,parameter_s,runner=self.mplot_exec)
614 Magic.magic_run(self,parameter_s,runner=self.mplot_exec)
615
615
616 # Fix the docstring so users see the original as well
616 # Fix the docstring so users see the original as well
617 magic_run.__doc__ = "%s\n%s" % (Magic.magic_run.__doc__,
617 magic_run.__doc__ = "%s\n%s" % (Magic.magic_run.__doc__,
618 "\n *** Modified %run for Matplotlib,"
618 "\n *** Modified %run for Matplotlib,"
619 " with proper interactive handling ***")
619 " with proper interactive handling ***")
620
620
621 # Now we provide 2 versions of a matplotlib-aware IPython base shells, single
621 # Now we provide 2 versions of a matplotlib-aware IPython base shells, single
622 # and multithreaded. Note that these are meant for internal use, the IPShell*
622 # and multithreaded. Note that these are meant for internal use, the IPShell*
623 # classes below are the ones meant for public consumption.
623 # classes below are the ones meant for public consumption.
624
624
625 class MatplotlibShell(MatplotlibShellBase,InteractiveShell):
625 class MatplotlibShell(MatplotlibShellBase,InteractiveShell):
626 """Single-threaded shell with matplotlib support."""
626 """Single-threaded shell with matplotlib support."""
627
627
628 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
628 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
629 user_ns=None,user_global_ns=None,**kw):
629 user_ns=None,user_global_ns=None,**kw):
630 user_ns,user_global_ns,b2 = self._matplotlib_config(name,user_ns,user_global_ns)
630 user_ns,user_global_ns,b2 = self._matplotlib_config(name,user_ns,user_global_ns)
631 InteractiveShell.__init__(self,name,usage,rc,user_ns,user_global_ns,
631 InteractiveShell.__init__(self,name,usage,rc,user_ns,user_global_ns,
632 banner2=b2,**kw)
632 banner2=b2,**kw)
633
633
634 class MatplotlibMTShell(MatplotlibShellBase,MTInteractiveShell):
634 class MatplotlibMTShell(MatplotlibShellBase,MTInteractiveShell):
635 """Multi-threaded shell with matplotlib support."""
635 """Multi-threaded shell with matplotlib support."""
636
636
637 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
637 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
638 user_ns=None,user_global_ns=None, **kw):
638 user_ns=None,user_global_ns=None, **kw):
639 user_ns,user_global_ns,b2 = self._matplotlib_config(name,user_ns,user_global_ns)
639 user_ns,user_global_ns,b2 = self._matplotlib_config(name,user_ns,user_global_ns)
640 MTInteractiveShell.__init__(self,name,usage,rc,user_ns,user_global_ns,
640 MTInteractiveShell.__init__(self,name,usage,rc,user_ns,user_global_ns,
641 banner2=b2,**kw)
641 banner2=b2,**kw)
642
642
643 #-----------------------------------------------------------------------------
643 #-----------------------------------------------------------------------------
644 # Utility functions for the different GUI enabled IPShell* classes.
644 # Utility functions for the different GUI enabled IPShell* classes.
645
645
646 def get_tk():
646 def get_tk():
647 """Tries to import Tkinter and returns a withdrawn Tkinter root
647 """Tries to import Tkinter and returns a withdrawn Tkinter root
648 window. If Tkinter is already imported or not available, this
648 window. If Tkinter is already imported or not available, this
649 returns None. This function calls `hijack_tk` underneath.
649 returns None. This function calls `hijack_tk` underneath.
650 """
650 """
651 if not USE_TK or sys.modules.has_key('Tkinter'):
651 if not USE_TK or sys.modules.has_key('Tkinter'):
652 return None
652 return None
653 else:
653 else:
654 try:
654 try:
655 import Tkinter
655 import Tkinter
656 except ImportError:
656 except ImportError:
657 return None
657 return None
658 else:
658 else:
659 hijack_tk()
659 hijack_tk()
660 r = Tkinter.Tk()
660 r = Tkinter.Tk()
661 r.withdraw()
661 r.withdraw()
662 return r
662 return r
663
663
664 def hijack_tk():
664 def hijack_tk():
665 """Modifies Tkinter's mainloop with a dummy so when a module calls
665 """Modifies Tkinter's mainloop with a dummy so when a module calls
666 mainloop, it does not block.
666 mainloop, it does not block.
667
667
668 """
668 """
669 def misc_mainloop(self, n=0):
669 def misc_mainloop(self, n=0):
670 pass
670 pass
671 def tkinter_mainloop(n=0):
671 def tkinter_mainloop(n=0):
672 pass
672 pass
673
673
674 import Tkinter
674 import Tkinter
675 Tkinter.Misc.mainloop = misc_mainloop
675 Tkinter.Misc.mainloop = misc_mainloop
676 Tkinter.mainloop = tkinter_mainloop
676 Tkinter.mainloop = tkinter_mainloop
677
677
678 def update_tk(tk):
678 def update_tk(tk):
679 """Updates the Tkinter event loop. This is typically called from
679 """Updates the Tkinter event loop. This is typically called from
680 the respective WX or GTK mainloops.
680 the respective WX or GTK mainloops.
681 """
681 """
682 if tk:
682 if tk:
683 tk.update()
683 tk.update()
684
684
685 def hijack_wx():
685 def hijack_wx():
686 """Modifies wxPython's MainLoop with a dummy so user code does not
686 """Modifies wxPython's MainLoop with a dummy so user code does not
687 block IPython. The hijacked mainloop function is returned.
687 block IPython. The hijacked mainloop function is returned.
688 """
688 """
689 def dummy_mainloop(*args, **kw):
689 def dummy_mainloop(*args, **kw):
690 pass
690 pass
691
691
692 try:
692 try:
693 import wx
693 import wx
694 except ImportError:
694 except ImportError:
695 # For very old versions of WX
695 # For very old versions of WX
696 import wxPython as wx
696 import wxPython as wx
697
697
698 ver = wx.__version__
698 ver = wx.__version__
699 orig_mainloop = None
699 orig_mainloop = None
700 if ver[:3] >= '2.5':
700 if ver[:3] >= '2.5':
701 import wx
701 import wx
702 if hasattr(wx, '_core_'): core = getattr(wx, '_core_')
702 if hasattr(wx, '_core_'): core = getattr(wx, '_core_')
703 elif hasattr(wx, '_core'): core = getattr(wx, '_core')
703 elif hasattr(wx, '_core'): core = getattr(wx, '_core')
704 else: raise AttributeError('Could not find wx core module')
704 else: raise AttributeError('Could not find wx core module')
705 orig_mainloop = core.PyApp_MainLoop
705 orig_mainloop = core.PyApp_MainLoop
706 core.PyApp_MainLoop = dummy_mainloop
706 core.PyApp_MainLoop = dummy_mainloop
707 elif ver[:3] == '2.4':
707 elif ver[:3] == '2.4':
708 orig_mainloop = wx.wxc.wxPyApp_MainLoop
708 orig_mainloop = wx.wxc.wxPyApp_MainLoop
709 wx.wxc.wxPyApp_MainLoop = dummy_mainloop
709 wx.wxc.wxPyApp_MainLoop = dummy_mainloop
710 else:
710 else:
711 warn("Unable to find either wxPython version 2.4 or >= 2.5.")
711 warn("Unable to find either wxPython version 2.4 or >= 2.5.")
712 return orig_mainloop
712 return orig_mainloop
713
713
714 def hijack_gtk():
714 def hijack_gtk():
715 """Modifies pyGTK's mainloop with a dummy so user code does not
715 """Modifies pyGTK's mainloop with a dummy so user code does not
716 block IPython. This function returns the original `gtk.mainloop`
716 block IPython. This function returns the original `gtk.mainloop`
717 function that has been hijacked.
717 function that has been hijacked.
718 """
718 """
719 def dummy_mainloop(*args, **kw):
719 def dummy_mainloop(*args, **kw):
720 pass
720 pass
721 import gtk
721 import gtk
722 if gtk.pygtk_version >= (2,4,0): orig_mainloop = gtk.main
722 if gtk.pygtk_version >= (2,4,0): orig_mainloop = gtk.main
723 else: orig_mainloop = gtk.mainloop
723 else: orig_mainloop = gtk.mainloop
724 gtk.mainloop = dummy_mainloop
724 gtk.mainloop = dummy_mainloop
725 gtk.main = dummy_mainloop
725 gtk.main = dummy_mainloop
726 return orig_mainloop
726 return orig_mainloop
727
727
728 def hijack_qt():
728 def hijack_qt():
729 """Modifies PyQt's mainloop with a dummy so user code does not
729 """Modifies PyQt's mainloop with a dummy so user code does not
730 block IPython. This function returns the original
730 block IPython. This function returns the original
731 `qt.qApp.exec_loop` function that has been hijacked.
731 `qt.qApp.exec_loop` function that has been hijacked.
732 """
732 """
733 def dummy_mainloop(*args, **kw):
733 def dummy_mainloop(*args, **kw):
734 pass
734 pass
735 import qt
735 import qt
736 orig_mainloop = qt.qApp.exec_loop
736 orig_mainloop = qt.qApp.exec_loop
737 qt.qApp.exec_loop = dummy_mainloop
737 qt.qApp.exec_loop = dummy_mainloop
738 qt.QApplication.exec_loop = dummy_mainloop
738 qt.QApplication.exec_loop = dummy_mainloop
739 return orig_mainloop
739 return orig_mainloop
740
740
741 def hijack_qt4():
741 def hijack_qt4():
742 """Modifies PyQt4's mainloop with a dummy so user code does not
742 """Modifies PyQt4's mainloop with a dummy so user code does not
743 block IPython. This function returns the original
743 block IPython. This function returns the original
744 `QtGui.qApp.exec_` function that has been hijacked.
744 `QtGui.qApp.exec_` function that has been hijacked.
745 """
745 """
746 def dummy_mainloop(*args, **kw):
746 def dummy_mainloop(*args, **kw):
747 pass
747 pass
748 from PyQt4 import QtGui, QtCore
748 from PyQt4 import QtGui, QtCore
749 orig_mainloop = QtGui.qApp.exec_
749 orig_mainloop = QtGui.qApp.exec_
750 QtGui.qApp.exec_ = dummy_mainloop
750 QtGui.qApp.exec_ = dummy_mainloop
751 QtGui.QApplication.exec_ = dummy_mainloop
751 QtGui.QApplication.exec_ = dummy_mainloop
752 QtCore.QCoreApplication.exec_ = dummy_mainloop
752 QtCore.QCoreApplication.exec_ = dummy_mainloop
753 return orig_mainloop
753 return orig_mainloop
754
754
755 #-----------------------------------------------------------------------------
755 #-----------------------------------------------------------------------------
756 # The IPShell* classes below are the ones meant to be run by external code as
756 # The IPShell* classes below are the ones meant to be run by external code as
757 # IPython instances. Note that unless a specific threading strategy is
757 # IPython instances. Note that unless a specific threading strategy is
758 # desired, the factory function start() below should be used instead (it
758 # desired, the factory function start() below should be used instead (it
759 # selects the proper threaded class).
759 # selects the proper threaded class).
760
760
761 class IPThread(threading.Thread):
761 class IPThread(threading.Thread):
762 def run(self):
762 def run(self):
763 self.IP.mainloop(self._banner)
763 self.IP.mainloop(self._banner)
764 self.IP.kill()
764 self.IP.kill()
765
765
766 class IPShellGTK(IPThread):
766 class IPShellGTK(IPThread):
767 """Run a gtk mainloop() in a separate thread.
767 """Run a gtk mainloop() in a separate thread.
768
768
769 Python commands can be passed to the thread where they will be executed.
769 Python commands can be passed to the thread where they will be executed.
770 This is implemented by periodically checking for passed code using a
770 This is implemented by periodically checking for passed code using a
771 GTK timeout callback."""
771 GTK timeout callback."""
772
772
773 TIMEOUT = 100 # Millisecond interval between timeouts.
773 TIMEOUT = 100 # Millisecond interval between timeouts.
774
774
775 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
775 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
776 debug=1,shell_class=MTInteractiveShell):
776 debug=1,shell_class=MTInteractiveShell):
777
777
778 import gtk
778 import gtk
779 # Check for set_interactive, coming up in new pygtk.
780 # Disable it so that this code works, but notify
781 # the user that he has a better option as well.
782 # XXX TODO better support when set_interactive is released
783 try:
784 gtk.set_interactive(False)
785 print "Your PyGtk has set_interactive(), so you can use the"
786 print "more stable single-threaded Gtk mode."
787 print "See https://bugs.launchpad.net/ipython/+bug/270856"
788 except AttributeError:
789 pass
779
790
780 self.gtk = gtk
791 self.gtk = gtk
781 self.gtk_mainloop = hijack_gtk()
792 self.gtk_mainloop = hijack_gtk()
782
793
783 # Allows us to use both Tk and GTK.
794 # Allows us to use both Tk and GTK.
784 self.tk = get_tk()
795 self.tk = get_tk()
785
796
786 if gtk.pygtk_version >= (2,4,0): mainquit = self.gtk.main_quit
797 if gtk.pygtk_version >= (2,4,0): mainquit = self.gtk.main_quit
787 else: mainquit = self.gtk.mainquit
798 else: mainquit = self.gtk.mainquit
788
799
789 self.IP = make_IPython(argv,user_ns=user_ns,
800 self.IP = make_IPython(argv,user_ns=user_ns,
790 user_global_ns=user_global_ns,
801 user_global_ns=user_global_ns,
791 debug=debug,
802 debug=debug,
792 shell_class=shell_class,
803 shell_class=shell_class,
793 on_kill=[mainquit])
804 on_kill=[mainquit])
794
805
795 # HACK: slot for banner in self; it will be passed to the mainloop
806 # HACK: slot for banner in self; it will be passed to the mainloop
796 # method only and .run() needs it. The actual value will be set by
807 # method only and .run() needs it. The actual value will be set by
797 # .mainloop().
808 # .mainloop().
798 self._banner = None
809 self._banner = None
799
810
800 threading.Thread.__init__(self)
811 threading.Thread.__init__(self)
801
812
802 def mainloop(self,sys_exit=0,banner=None):
813 def mainloop(self,sys_exit=0,banner=None):
803
814
804 self._banner = banner
815 self._banner = banner
805
816
806 if self.gtk.pygtk_version >= (2,4,0):
817 if self.gtk.pygtk_version >= (2,4,0):
807 import gobject
818 import gobject
808 gobject.idle_add(self.on_timer)
819 gobject.idle_add(self.on_timer)
809 else:
820 else:
810 self.gtk.idle_add(self.on_timer)
821 self.gtk.idle_add(self.on_timer)
811
822
812 if sys.platform != 'win32':
823 if sys.platform != 'win32':
813 try:
824 try:
814 if self.gtk.gtk_version[0] >= 2:
825 if self.gtk.gtk_version[0] >= 2:
815 self.gtk.gdk.threads_init()
826 self.gtk.gdk.threads_init()
816 except AttributeError:
827 except AttributeError:
817 pass
828 pass
818 except RuntimeError:
829 except RuntimeError:
819 error('Your pyGTK likely has not been compiled with '
830 error('Your pyGTK likely has not been compiled with '
820 'threading support.\n'
831 'threading support.\n'
821 'The exception printout is below.\n'
832 'The exception printout is below.\n'
822 'You can either rebuild pyGTK with threads, or '
833 'You can either rebuild pyGTK with threads, or '
823 'try using \n'
834 'try using \n'
824 'matplotlib with a different backend (like Tk or WX).\n'
835 'matplotlib with a different backend (like Tk or WX).\n'
825 'Note that matplotlib will most likely not work in its '
836 'Note that matplotlib will most likely not work in its '
826 'current state!')
837 'current state!')
827 self.IP.InteractiveTB()
838 self.IP.InteractiveTB()
828
839
829 self.start()
840 self.start()
830 self.gtk.gdk.threads_enter()
841 self.gtk.gdk.threads_enter()
831 self.gtk_mainloop()
842 self.gtk_mainloop()
832 self.gtk.gdk.threads_leave()
843 self.gtk.gdk.threads_leave()
833 self.join()
844 self.join()
834
845
835 def on_timer(self):
846 def on_timer(self):
836 """Called when GTK is idle.
847 """Called when GTK is idle.
837
848
838 Must return True always, otherwise GTK stops calling it"""
849 Must return True always, otherwise GTK stops calling it"""
839
850
840 update_tk(self.tk)
851 update_tk(self.tk)
841 self.IP.runcode()
852 self.IP.runcode()
842 time.sleep(0.01)
853 time.sleep(0.01)
843 return True
854 return True
844
855
845
856
846 class IPShellWX(IPThread):
857 class IPShellWX(IPThread):
847 """Run a wx mainloop() in a separate thread.
858 """Run a wx mainloop() in a separate thread.
848
859
849 Python commands can be passed to the thread where they will be executed.
860 Python commands can be passed to the thread where they will be executed.
850 This is implemented by periodically checking for passed code using a
861 This is implemented by periodically checking for passed code using a
851 GTK timeout callback."""
862 GTK timeout callback."""
852
863
853 TIMEOUT = 100 # Millisecond interval between timeouts.
864 TIMEOUT = 100 # Millisecond interval between timeouts.
854
865
855 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
866 def __init__(self,argv=None,user_ns=None,user_global_ns=None,
856 debug=1,shell_class=MTInteractiveShell):
867 debug=1,shell_class=MTInteractiveShell):
857
868
858 self.IP = make_IPython(argv,user_ns=user_ns,
869 self.IP = make_IPython(argv,user_ns=user_ns,
859 user_global_ns=user_global_ns,
870 user_global_ns=user_global_ns,
860 debug=debug,
871 debug=debug,
861 shell_class=shell_class,
872 shell_class=shell_class,
862 on_kill=[self.wxexit])
873 on_kill=[self.wxexit])
863
874
864 wantedwxversion=self.IP.rc.wxversion
875 wantedwxversion=self.IP.rc.wxversion
865 if wantedwxversion!="0":
876 if wantedwxversion!="0":
866 try:
877 try:
867 import wxversion
878 import wxversion
868 except ImportError:
879 except ImportError:
869 error('The wxversion module is needed for WX version selection')
880 error('The wxversion module is needed for WX version selection')
870 else:
881 else:
871 try:
882 try:
872 wxversion.select(wantedwxversion)
883 wxversion.select(wantedwxversion)
873 except:
884 except:
874 self.IP.InteractiveTB()
885 self.IP.InteractiveTB()
875 error('Requested wxPython version %s could not be loaded' %
886 error('Requested wxPython version %s could not be loaded' %
876 wantedwxversion)
887 wantedwxversion)
877
888
878 import wx
889 import wx
879
890
880 threading.Thread.__init__(self)
891 threading.Thread.__init__(self)
881 self.wx = wx
892 self.wx = wx
882 self.wx_mainloop = hijack_wx()
893 self.wx_mainloop = hijack_wx()
883
894
884 # Allows us to use both Tk and GTK.
895 # Allows us to use both Tk and GTK.
885 self.tk = get_tk()
896 self.tk = get_tk()
886
897
887 # HACK: slot for banner in self; it will be passed to the mainloop
898 # HACK: slot for banner in self; it will be passed to the mainloop
888 # method only and .run() needs it. The actual value will be set by
899 # method only and .run() needs it. The actual value will be set by
889 # .mainloop().
900 # .mainloop().
890 self._banner = None
901 self._banner = None
891
902
892 self.app = None
903 self.app = None
893
904
894 def wxexit(self, *args):
905 def wxexit(self, *args):
895 if self.app is not None:
906 if self.app is not None:
896 self.app.agent.timer.Stop()
907 self.app.agent.timer.Stop()
897 self.app.ExitMainLoop()
908 self.app.ExitMainLoop()
898
909
899 def mainloop(self,sys_exit=0,banner=None):
910 def mainloop(self,sys_exit=0,banner=None):
900
911
901 self._banner = banner
912 self._banner = banner
902
913
903 self.start()
914 self.start()
904
915
905 class TimerAgent(self.wx.MiniFrame):
916 class TimerAgent(self.wx.MiniFrame):
906 wx = self.wx
917 wx = self.wx
907 IP = self.IP
918 IP = self.IP
908 tk = self.tk
919 tk = self.tk
909 def __init__(self, parent, interval):
920 def __init__(self, parent, interval):
910 style = self.wx.DEFAULT_FRAME_STYLE | self.wx.TINY_CAPTION_HORIZ
921 style = self.wx.DEFAULT_FRAME_STYLE | self.wx.TINY_CAPTION_HORIZ
911 self.wx.MiniFrame.__init__(self, parent, -1, ' ', pos=(200, 200),
922 self.wx.MiniFrame.__init__(self, parent, -1, ' ', pos=(200, 200),
912 size=(100, 100),style=style)
923 size=(100, 100),style=style)
913 self.Show(False)
924 self.Show(False)
914 self.interval = interval
925 self.interval = interval
915 self.timerId = self.wx.NewId()
926 self.timerId = self.wx.NewId()
916
927
917 def StartWork(self):
928 def StartWork(self):
918 self.timer = self.wx.Timer(self, self.timerId)
929 self.timer = self.wx.Timer(self, self.timerId)
919 self.wx.EVT_TIMER(self, self.timerId, self.OnTimer)
930 self.wx.EVT_TIMER(self, self.timerId, self.OnTimer)
920 self.timer.Start(self.interval)
931 self.timer.Start(self.interval)
921
932
922 def OnTimer(self, event):
933 def OnTimer(self, event):
923 update_tk(self.tk)
934 update_tk(self.tk)
924 self.IP.runcode()
935 self.IP.runcode()
925
936
926 class App(self.wx.App):
937 class App(self.wx.App):
927 wx = self.wx
938 wx = self.wx
928 TIMEOUT = self.TIMEOUT
939 TIMEOUT = self.TIMEOUT
929 def OnInit(self):
940 def OnInit(self):
930 'Create the main window and insert the custom frame'
941 'Create the main window and insert the custom frame'
931 self.agent = TimerAgent(None, self.TIMEOUT)
942 self.agent = TimerAgent(None, self.TIMEOUT)
932 self.agent.Show(False)
943 self.agent.Show(False)
933 self.agent.StartWork()
944 self.agent.StartWork()
934 return True
945 return True
935
946
936 self.app = App(redirect=False)
947 self.app = App(redirect=False)
937 self.wx_mainloop(self.app)
948 self.wx_mainloop(self.app)
938 self.join()
949 self.join()
939
950
940
951
941 class IPShellQt(IPThread):
952 class IPShellQt(IPThread):
942 """Run a Qt event loop in a separate thread.
953 """Run a Qt event loop in a separate thread.
943
954
944 Python commands can be passed to the thread where they will be executed.
955 Python commands can be passed to the thread where they will be executed.
945 This is implemented by periodically checking for passed code using a
956 This is implemented by periodically checking for passed code using a
946 Qt timer / slot."""
957 Qt timer / slot."""
947
958
948 TIMEOUT = 100 # Millisecond interval between timeouts.
959 TIMEOUT = 100 # Millisecond interval between timeouts.
949
960
950 def __init__(self, argv=None, user_ns=None, user_global_ns=None,
961 def __init__(self, argv=None, user_ns=None, user_global_ns=None,
951 debug=0, shell_class=MTInteractiveShell):
962 debug=0, shell_class=MTInteractiveShell):
952
963
953 import qt
964 import qt
954
965
955 self.exec_loop = hijack_qt()
966 self.exec_loop = hijack_qt()
956
967
957 # Allows us to use both Tk and QT.
968 # Allows us to use both Tk and QT.
958 self.tk = get_tk()
969 self.tk = get_tk()
959
970
960 self.IP = make_IPython(argv,
971 self.IP = make_IPython(argv,
961 user_ns=user_ns,
972 user_ns=user_ns,
962 user_global_ns=user_global_ns,
973 user_global_ns=user_global_ns,
963 debug=debug,
974 debug=debug,
964 shell_class=shell_class,
975 shell_class=shell_class,
965 on_kill=[qt.qApp.exit])
976 on_kill=[qt.qApp.exit])
966
977
967 # HACK: slot for banner in self; it will be passed to the mainloop
978 # HACK: slot for banner in self; it will be passed to the mainloop
968 # method only and .run() needs it. The actual value will be set by
979 # method only and .run() needs it. The actual value will be set by
969 # .mainloop().
980 # .mainloop().
970 self._banner = None
981 self._banner = None
971
982
972 threading.Thread.__init__(self)
983 threading.Thread.__init__(self)
973
984
974 def mainloop(self, sys_exit=0, banner=None):
985 def mainloop(self, sys_exit=0, banner=None):
975
986
976 import qt
987 import qt
977
988
978 self._banner = banner
989 self._banner = banner
979
990
980 if qt.QApplication.startingUp():
991 if qt.QApplication.startingUp():
981 a = qt.QApplication(sys.argv)
992 a = qt.QApplication(sys.argv)
982
993
983 self.timer = qt.QTimer()
994 self.timer = qt.QTimer()
984 qt.QObject.connect(self.timer,
995 qt.QObject.connect(self.timer,
985 qt.SIGNAL('timeout()'),
996 qt.SIGNAL('timeout()'),
986 self.on_timer)
997 self.on_timer)
987
998
988 self.start()
999 self.start()
989 self.timer.start(self.TIMEOUT, True)
1000 self.timer.start(self.TIMEOUT, True)
990 while True:
1001 while True:
991 if self.IP._kill: break
1002 if self.IP._kill: break
992 self.exec_loop()
1003 self.exec_loop()
993 self.join()
1004 self.join()
994
1005
995 def on_timer(self):
1006 def on_timer(self):
996 update_tk(self.tk)
1007 update_tk(self.tk)
997 result = self.IP.runcode()
1008 result = self.IP.runcode()
998 self.timer.start(self.TIMEOUT, True)
1009 self.timer.start(self.TIMEOUT, True)
999 return result
1010 return result
1000
1011
1001
1012
1002 class IPShellQt4(IPThread):
1013 class IPShellQt4(IPThread):
1003 """Run a Qt event loop in a separate thread.
1014 """Run a Qt event loop in a separate thread.
1004
1015
1005 Python commands can be passed to the thread where they will be executed.
1016 Python commands can be passed to the thread where they will be executed.
1006 This is implemented by periodically checking for passed code using a
1017 This is implemented by periodically checking for passed code using a
1007 Qt timer / slot."""
1018 Qt timer / slot."""
1008
1019
1009 TIMEOUT = 100 # Millisecond interval between timeouts.
1020 TIMEOUT = 100 # Millisecond interval between timeouts.
1010
1021
1011 def __init__(self, argv=None, user_ns=None, user_global_ns=None,
1022 def __init__(self, argv=None, user_ns=None, user_global_ns=None,
1012 debug=0, shell_class=MTInteractiveShell):
1023 debug=0, shell_class=MTInteractiveShell):
1013
1024
1014 from PyQt4 import QtCore, QtGui
1025 from PyQt4 import QtCore, QtGui
1015
1026
1016 try:
1027 try:
1017 # present in PyQt4-4.2.1 or later
1028 # present in PyQt4-4.2.1 or later
1018 QtCore.pyqtRemoveInputHook()
1029 QtCore.pyqtRemoveInputHook()
1019 except AttributeError:
1030 except AttributeError:
1020 pass
1031 pass
1021
1032
1022 if QtCore.PYQT_VERSION_STR == '4.3':
1033 if QtCore.PYQT_VERSION_STR == '4.3':
1023 warn('''PyQt4 version 4.3 detected.
1034 warn('''PyQt4 version 4.3 detected.
1024 If you experience repeated threading warnings, please update PyQt4.
1035 If you experience repeated threading warnings, please update PyQt4.
1025 ''')
1036 ''')
1026
1037
1027 self.exec_ = hijack_qt4()
1038 self.exec_ = hijack_qt4()
1028
1039
1029 # Allows us to use both Tk and QT.
1040 # Allows us to use both Tk and QT.
1030 self.tk = get_tk()
1041 self.tk = get_tk()
1031
1042
1032 self.IP = make_IPython(argv,
1043 self.IP = make_IPython(argv,
1033 user_ns=user_ns,
1044 user_ns=user_ns,
1034 user_global_ns=user_global_ns,
1045 user_global_ns=user_global_ns,
1035 debug=debug,
1046 debug=debug,
1036 shell_class=shell_class,
1047 shell_class=shell_class,
1037 on_kill=[QtGui.qApp.exit])
1048 on_kill=[QtGui.qApp.exit])
1038
1049
1039 # HACK: slot for banner in self; it will be passed to the mainloop
1050 # HACK: slot for banner in self; it will be passed to the mainloop
1040 # method only and .run() needs it. The actual value will be set by
1051 # method only and .run() needs it. The actual value will be set by
1041 # .mainloop().
1052 # .mainloop().
1042 self._banner = None
1053 self._banner = None
1043
1054
1044 threading.Thread.__init__(self)
1055 threading.Thread.__init__(self)
1045
1056
1046 def mainloop(self, sys_exit=0, banner=None):
1057 def mainloop(self, sys_exit=0, banner=None):
1047
1058
1048 from PyQt4 import QtCore, QtGui
1059 from PyQt4 import QtCore, QtGui
1049
1060
1050 self._banner = banner
1061 self._banner = banner
1051
1062
1052 if QtGui.QApplication.startingUp():
1063 if QtGui.QApplication.startingUp():
1053 a = QtGui.QApplication(sys.argv)
1064 a = QtGui.QApplication(sys.argv)
1054
1065
1055 self.timer = QtCore.QTimer()
1066 self.timer = QtCore.QTimer()
1056 QtCore.QObject.connect(self.timer,
1067 QtCore.QObject.connect(self.timer,
1057 QtCore.SIGNAL('timeout()'),
1068 QtCore.SIGNAL('timeout()'),
1058 self.on_timer)
1069 self.on_timer)
1059
1070
1060 self.start()
1071 self.start()
1061 self.timer.start(self.TIMEOUT)
1072 self.timer.start(self.TIMEOUT)
1062 while True:
1073 while True:
1063 if self.IP._kill: break
1074 if self.IP._kill: break
1064 self.exec_()
1075 self.exec_()
1065 self.join()
1076 self.join()
1066
1077
1067 def on_timer(self):
1078 def on_timer(self):
1068 update_tk(self.tk)
1079 update_tk(self.tk)
1069 result = self.IP.runcode()
1080 result = self.IP.runcode()
1070 self.timer.start(self.TIMEOUT)
1081 self.timer.start(self.TIMEOUT)
1071 return result
1082 return result
1072
1083
1073
1084
1074 # A set of matplotlib public IPython shell classes, for single-threaded (Tk*
1085 # A set of matplotlib public IPython shell classes, for single-threaded (Tk*
1075 # and FLTK*) and multithreaded (GTK*, WX* and Qt*) backends to use.
1086 # and FLTK*) and multithreaded (GTK*, WX* and Qt*) backends to use.
1076 def _load_pylab(user_ns):
1087 def _load_pylab(user_ns):
1077 """Allow users to disable pulling all of pylab into the top-level
1088 """Allow users to disable pulling all of pylab into the top-level
1078 namespace.
1089 namespace.
1079
1090
1080 This little utility must be called AFTER the actual ipython instance is
1091 This little utility must be called AFTER the actual ipython instance is
1081 running, since only then will the options file have been fully parsed."""
1092 running, since only then will the options file have been fully parsed."""
1082
1093
1083 ip = IPython.ipapi.get()
1094 ip = IPython.ipapi.get()
1084 if ip.options.pylab_import_all:
1095 if ip.options.pylab_import_all:
1085 ip.ex("from matplotlib.pylab import *")
1096 ip.ex("from matplotlib.pylab import *")
1086 ip.IP.user_config_ns.update(ip.user_ns)
1097 ip.IP.user_config_ns.update(ip.user_ns)
1087
1098
1088
1099
1089 class IPShellMatplotlib(IPShell):
1100 class IPShellMatplotlib(IPShell):
1090 """Subclass IPShell with MatplotlibShell as the internal shell.
1101 """Subclass IPShell with MatplotlibShell as the internal shell.
1091
1102
1092 Single-threaded class, meant for the Tk* and FLTK* backends.
1103 Single-threaded class, meant for the Tk* and FLTK* backends.
1093
1104
1094 Having this on a separate class simplifies the external driver code."""
1105 Having this on a separate class simplifies the external driver code."""
1095
1106
1096 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1107 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1097 IPShell.__init__(self,argv,user_ns,user_global_ns,debug,
1108 IPShell.__init__(self,argv,user_ns,user_global_ns,debug,
1098 shell_class=MatplotlibShell)
1109 shell_class=MatplotlibShell)
1099 _load_pylab(self.IP.user_ns)
1110 _load_pylab(self.IP.user_ns)
1100
1111
1101 class IPShellMatplotlibGTK(IPShellGTK):
1112 class IPShellMatplotlibGTK(IPShellGTK):
1102 """Subclass IPShellGTK with MatplotlibMTShell as the internal shell.
1113 """Subclass IPShellGTK with MatplotlibMTShell as the internal shell.
1103
1114
1104 Multi-threaded class, meant for the GTK* backends."""
1115 Multi-threaded class, meant for the GTK* backends."""
1105
1116
1106 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1117 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1107 IPShellGTK.__init__(self,argv,user_ns,user_global_ns,debug,
1118 IPShellGTK.__init__(self,argv,user_ns,user_global_ns,debug,
1108 shell_class=MatplotlibMTShell)
1119 shell_class=MatplotlibMTShell)
1109 _load_pylab(self.IP.user_ns)
1120 _load_pylab(self.IP.user_ns)
1110
1121
1111 class IPShellMatplotlibWX(IPShellWX):
1122 class IPShellMatplotlibWX(IPShellWX):
1112 """Subclass IPShellWX with MatplotlibMTShell as the internal shell.
1123 """Subclass IPShellWX with MatplotlibMTShell as the internal shell.
1113
1124
1114 Multi-threaded class, meant for the WX* backends."""
1125 Multi-threaded class, meant for the WX* backends."""
1115
1126
1116 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1127 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1117 IPShellWX.__init__(self,argv,user_ns,user_global_ns,debug,
1128 IPShellWX.__init__(self,argv,user_ns,user_global_ns,debug,
1118 shell_class=MatplotlibMTShell)
1129 shell_class=MatplotlibMTShell)
1119 _load_pylab(self.IP.user_ns)
1130 _load_pylab(self.IP.user_ns)
1120
1131
1121 class IPShellMatplotlibQt(IPShellQt):
1132 class IPShellMatplotlibQt(IPShellQt):
1122 """Subclass IPShellQt with MatplotlibMTShell as the internal shell.
1133 """Subclass IPShellQt with MatplotlibMTShell as the internal shell.
1123
1134
1124 Multi-threaded class, meant for the Qt* backends."""
1135 Multi-threaded class, meant for the Qt* backends."""
1125
1136
1126 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1137 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1127 IPShellQt.__init__(self,argv,user_ns,user_global_ns,debug,
1138 IPShellQt.__init__(self,argv,user_ns,user_global_ns,debug,
1128 shell_class=MatplotlibMTShell)
1139 shell_class=MatplotlibMTShell)
1129 _load_pylab(self.IP.user_ns)
1140 _load_pylab(self.IP.user_ns)
1130
1141
1131 class IPShellMatplotlibQt4(IPShellQt4):
1142 class IPShellMatplotlibQt4(IPShellQt4):
1132 """Subclass IPShellQt4 with MatplotlibMTShell as the internal shell.
1143 """Subclass IPShellQt4 with MatplotlibMTShell as the internal shell.
1133
1144
1134 Multi-threaded class, meant for the Qt4* backends."""
1145 Multi-threaded class, meant for the Qt4* backends."""
1135
1146
1136 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1147 def __init__(self,argv=None,user_ns=None,user_global_ns=None,debug=1):
1137 IPShellQt4.__init__(self,argv,user_ns,user_global_ns,debug,
1148 IPShellQt4.__init__(self,argv,user_ns,user_global_ns,debug,
1138 shell_class=MatplotlibMTShell)
1149 shell_class=MatplotlibMTShell)
1139 _load_pylab(self.IP.user_ns)
1150 _load_pylab(self.IP.user_ns)
1140
1151
1141 #-----------------------------------------------------------------------------
1152 #-----------------------------------------------------------------------------
1142 # Factory functions to actually start the proper thread-aware shell
1153 # Factory functions to actually start the proper thread-aware shell
1143
1154
1144 def _select_shell(argv):
1155 def _select_shell(argv):
1145 """Select a shell from the given argv vector.
1156 """Select a shell from the given argv vector.
1146
1157
1147 This function implements the threading selection policy, allowing runtime
1158 This function implements the threading selection policy, allowing runtime
1148 control of the threading mode, both for general users and for matplotlib.
1159 control of the threading mode, both for general users and for matplotlib.
1149
1160
1150 Return:
1161 Return:
1151 Shell class to be instantiated for runtime operation.
1162 Shell class to be instantiated for runtime operation.
1152 """
1163 """
1153
1164
1154 global USE_TK
1165 global USE_TK
1155
1166
1156 mpl_shell = {'gthread' : IPShellMatplotlibGTK,
1167 mpl_shell = {'gthread' : IPShellMatplotlibGTK,
1157 'wthread' : IPShellMatplotlibWX,
1168 'wthread' : IPShellMatplotlibWX,
1158 'qthread' : IPShellMatplotlibQt,
1169 'qthread' : IPShellMatplotlibQt,
1159 'q4thread' : IPShellMatplotlibQt4,
1170 'q4thread' : IPShellMatplotlibQt4,
1160 'tkthread' : IPShellMatplotlib, # Tk is built-in
1171 'tkthread' : IPShellMatplotlib, # Tk is built-in
1161 }
1172 }
1162
1173
1163 th_shell = {'gthread' : IPShellGTK,
1174 th_shell = {'gthread' : IPShellGTK,
1164 'wthread' : IPShellWX,
1175 'wthread' : IPShellWX,
1165 'qthread' : IPShellQt,
1176 'qthread' : IPShellQt,
1166 'q4thread' : IPShellQt4,
1177 'q4thread' : IPShellQt4,
1167 'tkthread' : IPShell, # Tk is built-in
1178 'tkthread' : IPShell, # Tk is built-in
1168 }
1179 }
1169
1180
1170 backends = {'gthread' : 'GTKAgg',
1181 backends = {'gthread' : 'GTKAgg',
1171 'wthread' : 'WXAgg',
1182 'wthread' : 'WXAgg',
1172 'qthread' : 'QtAgg',
1183 'qthread' : 'QtAgg',
1173 'q4thread' :'Qt4Agg',
1184 'q4thread' :'Qt4Agg',
1174 'tkthread' :'TkAgg',
1185 'tkthread' :'TkAgg',
1175 }
1186 }
1176
1187
1177 all_opts = set(['tk','pylab','gthread','qthread','q4thread','wthread',
1188 all_opts = set(['tk','pylab','gthread','qthread','q4thread','wthread',
1178 'tkthread'])
1189 'tkthread'])
1179 user_opts = set([s.replace('-','') for s in argv[:3]])
1190 user_opts = set([s.replace('-','') for s in argv[:3]])
1180 special_opts = user_opts & all_opts
1191 special_opts = user_opts & all_opts
1181
1192
1182 if 'tk' in special_opts:
1193 if 'tk' in special_opts:
1183 USE_TK = True
1194 USE_TK = True
1184 special_opts.remove('tk')
1195 special_opts.remove('tk')
1185
1196
1186 if 'pylab' in special_opts:
1197 if 'pylab' in special_opts:
1187
1198
1188 try:
1199 try:
1189 import matplotlib
1200 import matplotlib
1190 except ImportError:
1201 except ImportError:
1191 error('matplotlib could NOT be imported! Starting normal IPython.')
1202 error('matplotlib could NOT be imported! Starting normal IPython.')
1192 return IPShell
1203 return IPShell
1193
1204
1194 special_opts.remove('pylab')
1205 special_opts.remove('pylab')
1195 # If there's any option left, it means the user wants to force the
1206 # If there's any option left, it means the user wants to force the
1196 # threading backend, else it's auto-selected from the rc file
1207 # threading backend, else it's auto-selected from the rc file
1197 if special_opts:
1208 if special_opts:
1198 th_mode = special_opts.pop()
1209 th_mode = special_opts.pop()
1199 matplotlib.rcParams['backend'] = backends[th_mode]
1210 matplotlib.rcParams['backend'] = backends[th_mode]
1200 else:
1211 else:
1201 backend = matplotlib.rcParams['backend']
1212 backend = matplotlib.rcParams['backend']
1202 if backend.startswith('GTK'):
1213 if backend.startswith('GTK'):
1203 th_mode = 'gthread'
1214 th_mode = 'gthread'
1204 elif backend.startswith('WX'):
1215 elif backend.startswith('WX'):
1205 th_mode = 'wthread'
1216 th_mode = 'wthread'
1206 elif backend.startswith('Qt4'):
1217 elif backend.startswith('Qt4'):
1207 th_mode = 'q4thread'
1218 th_mode = 'q4thread'
1208 elif backend.startswith('Qt'):
1219 elif backend.startswith('Qt'):
1209 th_mode = 'qthread'
1220 th_mode = 'qthread'
1210 else:
1221 else:
1211 # Any other backend, use plain Tk
1222 # Any other backend, use plain Tk
1212 th_mode = 'tkthread'
1223 th_mode = 'tkthread'
1213
1224
1214 return mpl_shell[th_mode]
1225 return mpl_shell[th_mode]
1215 else:
1226 else:
1216 # No pylab requested, just plain threads
1227 # No pylab requested, just plain threads
1217 try:
1228 try:
1218 th_mode = special_opts.pop()
1229 th_mode = special_opts.pop()
1219 except KeyError:
1230 except KeyError:
1220 th_mode = 'tkthread'
1231 th_mode = 'tkthread'
1221 return th_shell[th_mode]
1232 return th_shell[th_mode]
1222
1233
1223
1234
1224 # This is the one which should be called by external code.
1235 # This is the one which should be called by external code.
1225 def start(user_ns = None):
1236 def start(user_ns = None):
1226 """Return a running shell instance, dealing with threading options.
1237 """Return a running shell instance, dealing with threading options.
1227
1238
1228 This is a factory function which will instantiate the proper IPython shell
1239 This is a factory function which will instantiate the proper IPython shell
1229 based on the user's threading choice. Such a selector is needed because
1240 based on the user's threading choice. Such a selector is needed because
1230 different GUI toolkits require different thread handling details."""
1241 different GUI toolkits require different thread handling details."""
1231
1242
1232 shell = _select_shell(sys.argv)
1243 shell = _select_shell(sys.argv)
1233 return shell(user_ns = user_ns)
1244 return shell(user_ns = user_ns)
1234
1245
1235 # Some aliases for backwards compatibility
1246 # Some aliases for backwards compatibility
1236 IPythonShell = IPShell
1247 IPythonShell = IPShell
1237 IPythonShellEmbed = IPShellEmbed
1248 IPythonShellEmbed = IPShellEmbed
1238 #************************ End of file <Shell.py> ***************************
1249 #************************ End of file <Shell.py> ***************************
@@ -1,106 +1,102 b''
1 # encoding: utf-8
1 # encoding: utf-8
2
2
3 """This is the official entry point to IPython's configuration system. """
3 """This is the official entry point to IPython's configuration system. """
4
4
5 __docformat__ = "restructuredtext en"
5 __docformat__ = "restructuredtext en"
6
6
7 #-------------------------------------------------------------------------------
7 #-------------------------------------------------------------------------------
8 # Copyright (C) 2008 The IPython Development Team
8 # Copyright (C) 2008 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 os
18 import os
19 from os.path import join as pjoin
19 from os.path import join as pjoin
20
20
21 from IPython.genutils import get_home_dir, get_ipython_dir
21 from IPython.genutils import get_home_dir, get_ipython_dir
22 from IPython.external.configobj import ConfigObj
22 from IPython.external.configobj import ConfigObj
23
23
24 # Traitlets config imports
25 from IPython.config import traitlets
26 from IPython.config.config import *
27 from traitlets import *
28
24
29 class ConfigObjManager(object):
25 class ConfigObjManager(object):
30
26
31 def __init__(self, configObj, filename):
27 def __init__(self, configObj, filename):
32 self.current = configObj
28 self.current = configObj
33 self.current.indent_type = ' '
29 self.current.indent_type = ' '
34 self.filename = filename
30 self.filename = filename
35 # self.write_default_config_file()
31 # self.write_default_config_file()
36
32
37 def get_config_obj(self):
33 def get_config_obj(self):
38 return self.current
34 return self.current
39
35
40 def update_config_obj(self, newConfig):
36 def update_config_obj(self, newConfig):
41 self.current.merge(newConfig)
37 self.current.merge(newConfig)
42
38
43 def update_config_obj_from_file(self, filename):
39 def update_config_obj_from_file(self, filename):
44 newConfig = ConfigObj(filename, file_error=False)
40 newConfig = ConfigObj(filename, file_error=False)
45 self.current.merge(newConfig)
41 self.current.merge(newConfig)
46
42
47 def update_config_obj_from_default_file(self, ipythondir=None):
43 def update_config_obj_from_default_file(self, ipythondir=None):
48 fname = self.resolve_file_path(self.filename, ipythondir)
44 fname = self.resolve_file_path(self.filename, ipythondir)
49 self.update_config_obj_from_file(fname)
45 self.update_config_obj_from_file(fname)
50
46
51 def write_config_obj_to_file(self, filename):
47 def write_config_obj_to_file(self, filename):
52 f = open(filename, 'w')
48 f = open(filename, 'w')
53 self.current.write(f)
49 self.current.write(f)
54 f.close()
50 f.close()
55
51
56 def write_default_config_file(self):
52 def write_default_config_file(self):
57 ipdir = get_ipython_dir()
53 ipdir = get_ipython_dir()
58 fname = pjoin(ipdir, self.filename)
54 fname = pjoin(ipdir, self.filename)
59 if not os.path.isfile(fname):
55 if not os.path.isfile(fname):
60 print "Writing the configuration file to: " + fname
56 print "Writing the configuration file to: " + fname
61 self.write_config_obj_to_file(fname)
57 self.write_config_obj_to_file(fname)
62
58
63 def _import(self, key):
59 def _import(self, key):
64 package = '.'.join(key.split('.')[0:-1])
60 package = '.'.join(key.split('.')[0:-1])
65 obj = key.split('.')[-1]
61 obj = key.split('.')[-1]
66 execString = 'from %s import %s' % (package, obj)
62 execString = 'from %s import %s' % (package, obj)
67 exec execString
63 exec execString
68 exec 'temp = %s' % obj
64 exec 'temp = %s' % obj
69 return temp
65 return temp
70
66
71 def resolve_file_path(self, filename, ipythondir = None):
67 def resolve_file_path(self, filename, ipythondir = None):
72 """Resolve filenames into absolute paths.
68 """Resolve filenames into absolute paths.
73
69
74 This function looks in the following directories in order:
70 This function looks in the following directories in order:
75
71
76 1. In the current working directory or by absolute path with ~ expanded
72 1. In the current working directory or by absolute path with ~ expanded
77 2. In ipythondir if that is set
73 2. In ipythondir if that is set
78 3. In the IPYTHONDIR environment variable if it exists
74 3. In the IPYTHONDIR environment variable if it exists
79 4. In the ~/.ipython directory
75 4. In the ~/.ipython directory
80
76
81 Note: The IPYTHONDIR is also used by the trunk version of IPython so
77 Note: The IPYTHONDIR is also used by the trunk version of IPython so
82 changing it will also affect it was well.
78 changing it will also affect it was well.
83 """
79 """
84
80
85 # In cwd or by absolute path with ~ expanded
81 # In cwd or by absolute path with ~ expanded
86 trythis = os.path.expanduser(filename)
82 trythis = os.path.expanduser(filename)
87 if os.path.isfile(trythis):
83 if os.path.isfile(trythis):
88 return trythis
84 return trythis
89
85
90 # In ipythondir if it is set
86 # In ipythondir if it is set
91 if ipythondir is not None:
87 if ipythondir is not None:
92 trythis = pjoin(ipythondir, filename)
88 trythis = pjoin(ipythondir, filename)
93 if os.path.isfile(trythis):
89 if os.path.isfile(trythis):
94 return trythis
90 return trythis
95
91
96 trythis = pjoin(get_ipython_dir(), filename)
92 trythis = pjoin(get_ipython_dir(), filename)
97 if os.path.isfile(trythis):
93 if os.path.isfile(trythis):
98 return trythis
94 return trythis
99
95
100 return None
96 return None
101
97
102
98
103
99
104
100
105
101
106
102
@@ -1,526 +1,526 b''
1 """Module for interactive demos using IPython.
1 """Module for interactive demos using IPython.
2
2
3 This module implements a few classes for running Python scripts interactively
3 This module implements a few classes for running Python scripts interactively
4 in IPython for demonstrations. With very simple markup (a few tags in
4 in IPython for demonstrations. With very simple markup (a few tags in
5 comments), you can control points where the script stops executing and returns
5 comments), you can control points where the script stops executing and returns
6 control to IPython.
6 control to IPython.
7
7
8
8
9 Provided classes
9 Provided classes
10 ================
10 ================
11
11
12 The classes are (see their docstrings for further details):
12 The classes are (see their docstrings for further details):
13
13
14 - Demo: pure python demos
14 - Demo: pure python demos
15
15
16 - IPythonDemo: demos with input to be processed by IPython as if it had been
16 - IPythonDemo: demos with input to be processed by IPython as if it had been
17 typed interactively (so magics work, as well as any other special syntax you
17 typed interactively (so magics work, as well as any other special syntax you
18 may have added via input prefilters).
18 may have added via input prefilters).
19
19
20 - LineDemo: single-line version of the Demo class. These demos are executed
20 - LineDemo: single-line version of the Demo class. These demos are executed
21 one line at a time, and require no markup.
21 one line at a time, and require no markup.
22
22
23 - IPythonLineDemo: IPython version of the LineDemo class (the demo is
23 - IPythonLineDemo: IPython version of the LineDemo class (the demo is
24 executed a line at a time, but processed via IPython).
24 executed a line at a time, but processed via IPython).
25
25
26 - ClearMixin: mixin to make Demo classes with less visual clutter. It
26 - ClearMixin: mixin to make Demo classes with less visual clutter. It
27 declares an empty marquee and a pre_cmd that clears the screen before each
27 declares an empty marquee and a pre_cmd that clears the screen before each
28 block (see Subclassing below).
28 block (see Subclassing below).
29
29
30 - ClearDemo, ClearIPDemo: mixin-enabled versions of the Demo and IPythonDemo
30 - ClearDemo, ClearIPDemo: mixin-enabled versions of the Demo and IPythonDemo
31 classes.
31 classes.
32
32
33
33
34 Subclassing
34 Subclassing
35 ===========
35 ===========
36
36
37 The classes here all include a few methods meant to make customization by
37 The classes here all include a few methods meant to make customization by
38 subclassing more convenient. Their docstrings below have some more details:
38 subclassing more convenient. Their docstrings below have some more details:
39
39
40 - marquee(): generates a marquee to provide visible on-screen markers at each
40 - marquee(): generates a marquee to provide visible on-screen markers at each
41 block start and end.
41 block start and end.
42
42
43 - pre_cmd(): run right before the execution of each block.
43 - pre_cmd(): run right before the execution of each block.
44
44
45 - post_cmd(): run right after the execution of each block. If the block
45 - post_cmd(): run right after the execution of each block. If the block
46 raises an exception, this is NOT called.
46 raises an exception, this is NOT called.
47
47
48
48
49 Operation
49 Operation
50 =========
50 =========
51
51
52 The file is run in its own empty namespace (though you can pass it a string of
52 The file is run in its own empty namespace (though you can pass it a string of
53 arguments as if in a command line environment, and it will see those as
53 arguments as if in a command line environment, and it will see those as
54 sys.argv). But at each stop, the global IPython namespace is updated with the
54 sys.argv). But at each stop, the global IPython namespace is updated with the
55 current internal demo namespace, so you can work interactively with the data
55 current internal demo namespace, so you can work interactively with the data
56 accumulated so far.
56 accumulated so far.
57
57
58 By default, each block of code is printed (with syntax highlighting) before
58 By default, each block of code is printed (with syntax highlighting) before
59 executing it and you have to confirm execution. This is intended to show the
59 executing it and you have to confirm execution. This is intended to show the
60 code to an audience first so you can discuss it, and only proceed with
60 code to an audience first so you can discuss it, and only proceed with
61 execution once you agree. There are a few tags which allow you to modify this
61 execution once you agree. There are a few tags which allow you to modify this
62 behavior.
62 behavior.
63
63
64 The supported tags are:
64 The supported tags are:
65
65
66 # <demo> stop
66 # <demo> stop
67
67
68 Defines block boundaries, the points where IPython stops execution of the
68 Defines block boundaries, the points where IPython stops execution of the
69 file and returns to the interactive prompt.
69 file and returns to the interactive prompt.
70
70
71 You can optionally mark the stop tag with extra dashes before and after the
71 You can optionally mark the stop tag with extra dashes before and after the
72 word 'stop', to help visually distinguish the blocks in a text editor:
72 word 'stop', to help visually distinguish the blocks in a text editor:
73
73
74 # <demo> --- stop ---
74 # <demo> --- stop ---
75
75
76
76
77 # <demo> silent
77 # <demo> silent
78
78
79 Make a block execute silently (and hence automatically). Typically used in
79 Make a block execute silently (and hence automatically). Typically used in
80 cases where you have some boilerplate or initialization code which you need
80 cases where you have some boilerplate or initialization code which you need
81 executed but do not want to be seen in the demo.
81 executed but do not want to be seen in the demo.
82
82
83 # <demo> auto
83 # <demo> auto
84
84
85 Make a block execute automatically, but still being printed. Useful for
85 Make a block execute automatically, but still being printed. Useful for
86 simple code which does not warrant discussion, since it avoids the extra
86 simple code which does not warrant discussion, since it avoids the extra
87 manual confirmation.
87 manual confirmation.
88
88
89 # <demo> auto_all
89 # <demo> auto_all
90
90
91 This tag can _only_ be in the first block, and if given it overrides the
91 This tag can _only_ be in the first block, and if given it overrides the
92 individual auto tags to make the whole demo fully automatic (no block asks
92 individual auto tags to make the whole demo fully automatic (no block asks
93 for confirmation). It can also be given at creation time (or the attribute
93 for confirmation). It can also be given at creation time (or the attribute
94 set later) to override what's in the file.
94 set later) to override what's in the file.
95
95
96 While _any_ python file can be run as a Demo instance, if there are no stop
96 While _any_ python file can be run as a Demo instance, if there are no stop
97 tags the whole file will run in a single block (no different that calling
97 tags the whole file will run in a single block (no different that calling
98 first %pycat and then %run). The minimal markup to make this useful is to
98 first %pycat and then %run). The minimal markup to make this useful is to
99 place a set of stop tags; the other tags are only there to let you fine-tune
99 place a set of stop tags; the other tags are only there to let you fine-tune
100 the execution.
100 the execution.
101
101
102 This is probably best explained with the simple example file below. You can
102 This is probably best explained with the simple example file below. You can
103 copy this into a file named ex_demo.py, and try running it via:
103 copy this into a file named ex_demo.py, and try running it via:
104
104
105 from IPython.demo import Demo
105 from IPython.demo import Demo
106 d = Demo('ex_demo.py')
106 d = Demo('ex_demo.py')
107 d() <--- Call the d object (omit the parens if you have autocall set to 2).
107 d() <--- Call the d object (omit the parens if you have autocall set to 2).
108
108
109 Each time you call the demo object, it runs the next block. The demo object
109 Each time you call the demo object, it runs the next block. The demo object
110 has a few useful methods for navigation, like again(), edit(), jump(), seek()
110 has a few useful methods for navigation, like again(), edit(), jump(), seek()
111 and back(). It can be reset for a new run via reset() or reloaded from disk
111 and back(). It can be reset for a new run via reset() or reloaded from disk
112 (in case you've edited the source) via reload(). See their docstrings below.
112 (in case you've edited the source) via reload(). See their docstrings below.
113
113
114
114
115 Example
115 Example
116 =======
116 =======
117
117
118 The following is a very simple example of a valid demo file.
118 The following is a very simple example of a valid demo file.
119
119
120 #################### EXAMPLE DEMO <ex_demo.py> ###############################
120 #################### EXAMPLE DEMO <ex_demo.py> ###############################
121 '''A simple interactive demo to illustrate the use of IPython's Demo class.'''
121 '''A simple interactive demo to illustrate the use of IPython's Demo class.'''
122
122
123 print 'Hello, welcome to an interactive IPython demo.'
123 print 'Hello, welcome to an interactive IPython demo.'
124
124
125 # The mark below defines a block boundary, which is a point where IPython will
125 # The mark below defines a block boundary, which is a point where IPython will
126 # stop execution and return to the interactive prompt. The dashes are actually
126 # stop execution and return to the interactive prompt. The dashes are actually
127 # optional and used only as a visual aid to clearly separate blocks while
127 # optional and used only as a visual aid to clearly separate blocks while
128 editing the demo code.
128 editing the demo code.
129 # <demo> stop
129 # <demo> stop
130
130
131 x = 1
131 x = 1
132 y = 2
132 y = 2
133
133
134 # <demo> stop
134 # <demo> stop
135
135
136 # the mark below makes this block as silent
136 # the mark below makes this block as silent
137 # <demo> silent
137 # <demo> silent
138
138
139 print 'This is a silent block, which gets executed but not printed.'
139 print 'This is a silent block, which gets executed but not printed.'
140
140
141 # <demo> stop
141 # <demo> stop
142 # <demo> auto
142 # <demo> auto
143 print 'This is an automatic block.'
143 print 'This is an automatic block.'
144 print 'It is executed without asking for confirmation, but printed.'
144 print 'It is executed without asking for confirmation, but printed.'
145 z = x+y
145 z = x+y
146
146
147 print 'z=',x
147 print 'z=',x
148
148
149 # <demo> stop
149 # <demo> stop
150 # This is just another normal block.
150 # This is just another normal block.
151 print 'z is now:', z
151 print 'z is now:', z
152
152
153 print 'bye!'
153 print 'bye!'
154 ################### END EXAMPLE DEMO <ex_demo.py> ############################
154 ################### END EXAMPLE DEMO <ex_demo.py> ############################
155 """
155 """
156
156
157 #*****************************************************************************
157 #*****************************************************************************
158 # Copyright (C) 2005-2006 Fernando Perez. <Fernando.Perez@colorado.edu>
158 # Copyright (C) 2005-2006 Fernando Perez. <Fernando.Perez@colorado.edu>
159 #
159 #
160 # Distributed under the terms of the BSD License. The full license is in
160 # Distributed under the terms of the BSD License. The full license is in
161 # the file COPYING, distributed as part of this software.
161 # the file COPYING, distributed as part of this software.
162 #
162 #
163 #*****************************************************************************
163 #*****************************************************************************
164
164
165 import exceptions
165 import exceptions
166 import os
166 import os
167 import re
167 import re
168 import shlex
168 import shlex
169 import sys
169 import sys
170
170
171 from IPython.PyColorize import Parser
171 from IPython.PyColorize import Parser
172 from IPython.genutils import marquee, file_read, file_readlines
172 from IPython.genutils import marquee, file_read, file_readlines
173
173
174 __all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError']
174 __all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError']
175
175
176 class DemoError(exceptions.Exception): pass
176 class DemoError(exceptions.Exception): pass
177
177
178 def re_mark(mark):
178 def re_mark(mark):
179 return re.compile(r'^\s*#\s+<demo>\s+%s\s*$' % mark,re.MULTILINE)
179 return re.compile(r'^\s*#\s+<demo>\s+%s\s*$' % mark,re.MULTILINE)
180
180
181 class Demo(object):
181 class Demo(object):
182
182
183 re_stop = re_mark('-?\s?stop\s?-?')
183 re_stop = re_mark('-*\s?stop\s?-*')
184 re_silent = re_mark('silent')
184 re_silent = re_mark('silent')
185 re_auto = re_mark('auto')
185 re_auto = re_mark('auto')
186 re_auto_all = re_mark('auto_all')
186 re_auto_all = re_mark('auto_all')
187
187
188 def __init__(self,fname,arg_str='',auto_all=None):
188 def __init__(self,fname,arg_str='',auto_all=None):
189 """Make a new demo object. To run the demo, simply call the object.
189 """Make a new demo object. To run the demo, simply call the object.
190
190
191 See the module docstring for full details and an example (you can use
191 See the module docstring for full details and an example (you can use
192 IPython.Demo? in IPython to see it).
192 IPython.Demo? in IPython to see it).
193
193
194 Inputs:
194 Inputs:
195
195
196 - fname = filename.
196 - fname = filename.
197
197
198 Optional inputs:
198 Optional inputs:
199
199
200 - arg_str(''): a string of arguments, internally converted to a list
200 - arg_str(''): a string of arguments, internally converted to a list
201 just like sys.argv, so the demo script can see a similar
201 just like sys.argv, so the demo script can see a similar
202 environment.
202 environment.
203
203
204 - auto_all(None): global flag to run all blocks automatically without
204 - auto_all(None): global flag to run all blocks automatically without
205 confirmation. This attribute overrides the block-level tags and
205 confirmation. This attribute overrides the block-level tags and
206 applies to the whole demo. It is an attribute of the object, and
206 applies to the whole demo. It is an attribute of the object, and
207 can be changed at runtime simply by reassigning it to a boolean
207 can be changed at runtime simply by reassigning it to a boolean
208 value.
208 value.
209 """
209 """
210
210
211 self.fname = fname
211 self.fname = fname
212 self.sys_argv = [fname] + shlex.split(arg_str)
212 self.sys_argv = [fname] + shlex.split(arg_str)
213 self.auto_all = auto_all
213 self.auto_all = auto_all
214
214
215 # get a few things from ipython. While it's a bit ugly design-wise,
215 # get a few things from ipython. While it's a bit ugly design-wise,
216 # it ensures that things like color scheme and the like are always in
216 # it ensures that things like color scheme and the like are always in
217 # sync with the ipython mode being used. This class is only meant to
217 # sync with the ipython mode being used. This class is only meant to
218 # be used inside ipython anyways, so it's OK.
218 # be used inside ipython anyways, so it's OK.
219 self.ip_ns = __IPYTHON__.user_ns
219 self.ip_ns = __IPYTHON__.user_ns
220 self.ip_colorize = __IPYTHON__.pycolorize
220 self.ip_colorize = __IPYTHON__.pycolorize
221 self.ip_showtb = __IPYTHON__.showtraceback
221 self.ip_showtb = __IPYTHON__.showtraceback
222 self.ip_runlines = __IPYTHON__.runlines
222 self.ip_runlines = __IPYTHON__.runlines
223 self.shell = __IPYTHON__
223 self.shell = __IPYTHON__
224
224
225 # load user data and initialize data structures
225 # load user data and initialize data structures
226 self.reload()
226 self.reload()
227
227
228 def reload(self):
228 def reload(self):
229 """Reload source from disk and initialize state."""
229 """Reload source from disk and initialize state."""
230 # read data and parse into blocks
230 # read data and parse into blocks
231 self.src = file_read(self.fname)
231 self.src = file_read(self.fname)
232 src_b = [b.strip() for b in self.re_stop.split(self.src) if b]
232 src_b = [b.strip() for b in self.re_stop.split(self.src) if b]
233 self._silent = [bool(self.re_silent.findall(b)) for b in src_b]
233 self._silent = [bool(self.re_silent.findall(b)) for b in src_b]
234 self._auto = [bool(self.re_auto.findall(b)) for b in src_b]
234 self._auto = [bool(self.re_auto.findall(b)) for b in src_b]
235
235
236 # if auto_all is not given (def. None), we read it from the file
236 # if auto_all is not given (def. None), we read it from the file
237 if self.auto_all is None:
237 if self.auto_all is None:
238 self.auto_all = bool(self.re_auto_all.findall(src_b[0]))
238 self.auto_all = bool(self.re_auto_all.findall(src_b[0]))
239 else:
239 else:
240 self.auto_all = bool(self.auto_all)
240 self.auto_all = bool(self.auto_all)
241
241
242 # Clean the sources from all markup so it doesn't get displayed when
242 # Clean the sources from all markup so it doesn't get displayed when
243 # running the demo
243 # running the demo
244 src_blocks = []
244 src_blocks = []
245 auto_strip = lambda s: self.re_auto.sub('',s)
245 auto_strip = lambda s: self.re_auto.sub('',s)
246 for i,b in enumerate(src_b):
246 for i,b in enumerate(src_b):
247 if self._auto[i]:
247 if self._auto[i]:
248 src_blocks.append(auto_strip(b))
248 src_blocks.append(auto_strip(b))
249 else:
249 else:
250 src_blocks.append(b)
250 src_blocks.append(b)
251 # remove the auto_all marker
251 # remove the auto_all marker
252 src_blocks[0] = self.re_auto_all.sub('',src_blocks[0])
252 src_blocks[0] = self.re_auto_all.sub('',src_blocks[0])
253
253
254 self.nblocks = len(src_blocks)
254 self.nblocks = len(src_blocks)
255 self.src_blocks = src_blocks
255 self.src_blocks = src_blocks
256
256
257 # also build syntax-highlighted source
257 # also build syntax-highlighted source
258 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
258 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
259
259
260 # ensure clean namespace and seek offset
260 # ensure clean namespace and seek offset
261 self.reset()
261 self.reset()
262
262
263 def reset(self):
263 def reset(self):
264 """Reset the namespace and seek pointer to restart the demo"""
264 """Reset the namespace and seek pointer to restart the demo"""
265 self.user_ns = {}
265 self.user_ns = {}
266 self.finished = False
266 self.finished = False
267 self.block_index = 0
267 self.block_index = 0
268
268
269 def _validate_index(self,index):
269 def _validate_index(self,index):
270 if index<0 or index>=self.nblocks:
270 if index<0 or index>=self.nblocks:
271 raise ValueError('invalid block index %s' % index)
271 raise ValueError('invalid block index %s' % index)
272
272
273 def _get_index(self,index):
273 def _get_index(self,index):
274 """Get the current block index, validating and checking status.
274 """Get the current block index, validating and checking status.
275
275
276 Returns None if the demo is finished"""
276 Returns None if the demo is finished"""
277
277
278 if index is None:
278 if index is None:
279 if self.finished:
279 if self.finished:
280 print 'Demo finished. Use reset() if you want to rerun it.'
280 print 'Demo finished. Use reset() if you want to rerun it.'
281 return None
281 return None
282 index = self.block_index
282 index = self.block_index
283 else:
283 else:
284 self._validate_index(index)
284 self._validate_index(index)
285 return index
285 return index
286
286
287 def seek(self,index):
287 def seek(self,index):
288 """Move the current seek pointer to the given block.
288 """Move the current seek pointer to the given block.
289
289
290 You can use negative indices to seek from the end, with identical
290 You can use negative indices to seek from the end, with identical
291 semantics to those of Python lists."""
291 semantics to those of Python lists."""
292 if index<0:
292 if index<0:
293 index = self.nblocks + index
293 index = self.nblocks + index
294 self._validate_index(index)
294 self._validate_index(index)
295 self.block_index = index
295 self.block_index = index
296 self.finished = False
296 self.finished = False
297
297
298 def back(self,num=1):
298 def back(self,num=1):
299 """Move the seek pointer back num blocks (default is 1)."""
299 """Move the seek pointer back num blocks (default is 1)."""
300 self.seek(self.block_index-num)
300 self.seek(self.block_index-num)
301
301
302 def jump(self,num=1):
302 def jump(self,num=1):
303 """Jump a given number of blocks relative to the current one.
303 """Jump a given number of blocks relative to the current one.
304
304
305 The offset can be positive or negative, defaults to 1."""
305 The offset can be positive or negative, defaults to 1."""
306 self.seek(self.block_index+num)
306 self.seek(self.block_index+num)
307
307
308 def again(self):
308 def again(self):
309 """Move the seek pointer back one block and re-execute."""
309 """Move the seek pointer back one block and re-execute."""
310 self.back(1)
310 self.back(1)
311 self()
311 self()
312
312
313 def edit(self,index=None):
313 def edit(self,index=None):
314 """Edit a block.
314 """Edit a block.
315
315
316 If no number is given, use the last block executed.
316 If no number is given, use the last block executed.
317
317
318 This edits the in-memory copy of the demo, it does NOT modify the
318 This edits the in-memory copy of the demo, it does NOT modify the
319 original source file. If you want to do that, simply open the file in
319 original source file. If you want to do that, simply open the file in
320 an editor and use reload() when you make changes to the file. This
320 an editor and use reload() when you make changes to the file. This
321 method is meant to let you change a block during a demonstration for
321 method is meant to let you change a block during a demonstration for
322 explanatory purposes, without damaging your original script."""
322 explanatory purposes, without damaging your original script."""
323
323
324 index = self._get_index(index)
324 index = self._get_index(index)
325 if index is None:
325 if index is None:
326 return
326 return
327 # decrease the index by one (unless we're at the very beginning), so
327 # decrease the index by one (unless we're at the very beginning), so
328 # that the default demo.edit() call opens up the sblock we've last run
328 # that the default demo.edit() call opens up the sblock we've last run
329 if index>0:
329 if index>0:
330 index -= 1
330 index -= 1
331
331
332 filename = self.shell.mktempfile(self.src_blocks[index])
332 filename = self.shell.mktempfile(self.src_blocks[index])
333 self.shell.hooks.editor(filename,1)
333 self.shell.hooks.editor(filename,1)
334 new_block = file_read(filename)
334 new_block = file_read(filename)
335 # update the source and colored block
335 # update the source and colored block
336 self.src_blocks[index] = new_block
336 self.src_blocks[index] = new_block
337 self.src_blocks_colored[index] = self.ip_colorize(new_block)
337 self.src_blocks_colored[index] = self.ip_colorize(new_block)
338 self.block_index = index
338 self.block_index = index
339 # call to run with the newly edited index
339 # call to run with the newly edited index
340 self()
340 self()
341
341
342 def show(self,index=None):
342 def show(self,index=None):
343 """Show a single block on screen"""
343 """Show a single block on screen"""
344
344
345 index = self._get_index(index)
345 index = self._get_index(index)
346 if index is None:
346 if index is None:
347 return
347 return
348
348
349 print self.marquee('<%s> block # %s (%s remaining)' %
349 print self.marquee('<%s> block # %s (%s remaining)' %
350 (self.fname,index,self.nblocks-index-1))
350 (self.fname,index,self.nblocks-index-1))
351 sys.stdout.write(self.src_blocks_colored[index])
351 sys.stdout.write(self.src_blocks_colored[index])
352 sys.stdout.flush()
352 sys.stdout.flush()
353
353
354 def show_all(self):
354 def show_all(self):
355 """Show entire demo on screen, block by block"""
355 """Show entire demo on screen, block by block"""
356
356
357 fname = self.fname
357 fname = self.fname
358 nblocks = self.nblocks
358 nblocks = self.nblocks
359 silent = self._silent
359 silent = self._silent
360 marquee = self.marquee
360 marquee = self.marquee
361 for index,block in enumerate(self.src_blocks_colored):
361 for index,block in enumerate(self.src_blocks_colored):
362 if silent[index]:
362 if silent[index]:
363 print marquee('<%s> SILENT block # %s (%s remaining)' %
363 print marquee('<%s> SILENT block # %s (%s remaining)' %
364 (fname,index,nblocks-index-1))
364 (fname,index,nblocks-index-1))
365 else:
365 else:
366 print marquee('<%s> block # %s (%s remaining)' %
366 print marquee('<%s> block # %s (%s remaining)' %
367 (fname,index,nblocks-index-1))
367 (fname,index,nblocks-index-1))
368 print block,
368 print block,
369 sys.stdout.flush()
369 sys.stdout.flush()
370
370
371 def runlines(self,source):
371 def runlines(self,source):
372 """Execute a string with one or more lines of code"""
372 """Execute a string with one or more lines of code"""
373
373
374 exec source in self.user_ns
374 exec source in self.user_ns
375
375
376 def __call__(self,index=None):
376 def __call__(self,index=None):
377 """run a block of the demo.
377 """run a block of the demo.
378
378
379 If index is given, it should be an integer >=1 and <= nblocks. This
379 If index is given, it should be an integer >=1 and <= nblocks. This
380 means that the calling convention is one off from typical Python
380 means that the calling convention is one off from typical Python
381 lists. The reason for the inconsistency is that the demo always
381 lists. The reason for the inconsistency is that the demo always
382 prints 'Block n/N, and N is the total, so it would be very odd to use
382 prints 'Block n/N, and N is the total, so it would be very odd to use
383 zero-indexing here."""
383 zero-indexing here."""
384
384
385 index = self._get_index(index)
385 index = self._get_index(index)
386 if index is None:
386 if index is None:
387 return
387 return
388 try:
388 try:
389 marquee = self.marquee
389 marquee = self.marquee
390 next_block = self.src_blocks[index]
390 next_block = self.src_blocks[index]
391 self.block_index += 1
391 self.block_index += 1
392 if self._silent[index]:
392 if self._silent[index]:
393 print marquee('Executing silent block # %s (%s remaining)' %
393 print marquee('Executing silent block # %s (%s remaining)' %
394 (index,self.nblocks-index-1))
394 (index,self.nblocks-index-1))
395 else:
395 else:
396 self.pre_cmd()
396 self.pre_cmd()
397 self.show(index)
397 self.show(index)
398 if self.auto_all or self._auto[index]:
398 if self.auto_all or self._auto[index]:
399 print marquee('output:')
399 print marquee('output:')
400 else:
400 else:
401 print marquee('Press <q> to quit, <Enter> to execute...'),
401 print marquee('Press <q> to quit, <Enter> to execute...'),
402 ans = raw_input().strip()
402 ans = raw_input().strip()
403 if ans:
403 if ans:
404 print marquee('Block NOT executed')
404 print marquee('Block NOT executed')
405 return
405 return
406 try:
406 try:
407 save_argv = sys.argv
407 save_argv = sys.argv
408 sys.argv = self.sys_argv
408 sys.argv = self.sys_argv
409 self.runlines(next_block)
409 self.runlines(next_block)
410 self.post_cmd()
410 self.post_cmd()
411 finally:
411 finally:
412 sys.argv = save_argv
412 sys.argv = save_argv
413
413
414 except:
414 except:
415 self.ip_showtb(filename=self.fname)
415 self.ip_showtb(filename=self.fname)
416 else:
416 else:
417 self.ip_ns.update(self.user_ns)
417 self.ip_ns.update(self.user_ns)
418
418
419 if self.block_index == self.nblocks:
419 if self.block_index == self.nblocks:
420 mq1 = self.marquee('END OF DEMO')
420 mq1 = self.marquee('END OF DEMO')
421 if mq1:
421 if mq1:
422 # avoid spurious prints if empty marquees are used
422 # avoid spurious prints if empty marquees are used
423 print
423 print
424 print mq1
424 print mq1
425 print self.marquee('Use reset() if you want to rerun it.')
425 print self.marquee('Use reset() if you want to rerun it.')
426 self.finished = True
426 self.finished = True
427
427
428 # These methods are meant to be overridden by subclasses who may wish to
428 # These methods are meant to be overridden by subclasses who may wish to
429 # customize the behavior of of their demos.
429 # customize the behavior of of their demos.
430 def marquee(self,txt='',width=78,mark='*'):
430 def marquee(self,txt='',width=78,mark='*'):
431 """Return the input string centered in a 'marquee'."""
431 """Return the input string centered in a 'marquee'."""
432 return marquee(txt,width,mark)
432 return marquee(txt,width,mark)
433
433
434 def pre_cmd(self):
434 def pre_cmd(self):
435 """Method called before executing each block."""
435 """Method called before executing each block."""
436 pass
436 pass
437
437
438 def post_cmd(self):
438 def post_cmd(self):
439 """Method called after executing each block."""
439 """Method called after executing each block."""
440 pass
440 pass
441
441
442
442
443 class IPythonDemo(Demo):
443 class IPythonDemo(Demo):
444 """Class for interactive demos with IPython's input processing applied.
444 """Class for interactive demos with IPython's input processing applied.
445
445
446 This subclasses Demo, but instead of executing each block by the Python
446 This subclasses Demo, but instead of executing each block by the Python
447 interpreter (via exec), it actually calls IPython on it, so that any input
447 interpreter (via exec), it actually calls IPython on it, so that any input
448 filters which may be in place are applied to the input block.
448 filters which may be in place are applied to the input block.
449
449
450 If you have an interactive environment which exposes special input
450 If you have an interactive environment which exposes special input
451 processing, you can use this class instead to write demo scripts which
451 processing, you can use this class instead to write demo scripts which
452 operate exactly as if you had typed them interactively. The default Demo
452 operate exactly as if you had typed them interactively. The default Demo
453 class requires the input to be valid, pure Python code.
453 class requires the input to be valid, pure Python code.
454 """
454 """
455
455
456 def runlines(self,source):
456 def runlines(self,source):
457 """Execute a string with one or more lines of code"""
457 """Execute a string with one or more lines of code"""
458
458
459 self.shell.runlines(source)
459 self.shell.runlines(source)
460
460
461 class LineDemo(Demo):
461 class LineDemo(Demo):
462 """Demo where each line is executed as a separate block.
462 """Demo where each line is executed as a separate block.
463
463
464 The input script should be valid Python code.
464 The input script should be valid Python code.
465
465
466 This class doesn't require any markup at all, and it's meant for simple
466 This class doesn't require any markup at all, and it's meant for simple
467 scripts (with no nesting or any kind of indentation) which consist of
467 scripts (with no nesting or any kind of indentation) which consist of
468 multiple lines of input to be executed, one at a time, as if they had been
468 multiple lines of input to be executed, one at a time, as if they had been
469 typed in the interactive prompt."""
469 typed in the interactive prompt."""
470
470
471 def reload(self):
471 def reload(self):
472 """Reload source from disk and initialize state."""
472 """Reload source from disk and initialize state."""
473 # read data and parse into blocks
473 # read data and parse into blocks
474 src_b = [l for l in file_readlines(self.fname) if l.strip()]
474 src_b = [l for l in file_readlines(self.fname) if l.strip()]
475 nblocks = len(src_b)
475 nblocks = len(src_b)
476 self.src = os.linesep.join(file_readlines(self.fname))
476 self.src = os.linesep.join(file_readlines(self.fname))
477 self._silent = [False]*nblocks
477 self._silent = [False]*nblocks
478 self._auto = [True]*nblocks
478 self._auto = [True]*nblocks
479 self.auto_all = True
479 self.auto_all = True
480 self.nblocks = nblocks
480 self.nblocks = nblocks
481 self.src_blocks = src_b
481 self.src_blocks = src_b
482
482
483 # also build syntax-highlighted source
483 # also build syntax-highlighted source
484 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
484 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
485
485
486 # ensure clean namespace and seek offset
486 # ensure clean namespace and seek offset
487 self.reset()
487 self.reset()
488
488
489
489
490 class IPythonLineDemo(IPythonDemo,LineDemo):
490 class IPythonLineDemo(IPythonDemo,LineDemo):
491 """Variant of the LineDemo class whose input is processed by IPython."""
491 """Variant of the LineDemo class whose input is processed by IPython."""
492 pass
492 pass
493
493
494
494
495 class ClearMixin(object):
495 class ClearMixin(object):
496 """Use this mixin to make Demo classes with less visual clutter.
496 """Use this mixin to make Demo classes with less visual clutter.
497
497
498 Demos using this mixin will clear the screen before every block and use
498 Demos using this mixin will clear the screen before every block and use
499 blank marquees.
499 blank marquees.
500
500
501 Note that in order for the methods defined here to actually override those
501 Note that in order for the methods defined here to actually override those
502 of the classes it's mixed with, it must go /first/ in the inheritance
502 of the classes it's mixed with, it must go /first/ in the inheritance
503 tree. For example:
503 tree. For example:
504
504
505 class ClearIPDemo(ClearMixin,IPythonDemo): pass
505 class ClearIPDemo(ClearMixin,IPythonDemo): pass
506
506
507 will provide an IPythonDemo class with the mixin's features.
507 will provide an IPythonDemo class with the mixin's features.
508 """
508 """
509
509
510 def marquee(self,txt='',width=78,mark='*'):
510 def marquee(self,txt='',width=78,mark='*'):
511 """Blank marquee that returns '' no matter what the input."""
511 """Blank marquee that returns '' no matter what the input."""
512 return ''
512 return ''
513
513
514 def pre_cmd(self):
514 def pre_cmd(self):
515 """Method called before executing each block.
515 """Method called before executing each block.
516
516
517 This one simply clears the screen."""
517 This one simply clears the screen."""
518 os.system('clear')
518 os.system('clear')
519
519
520
520
521 class ClearDemo(ClearMixin,Demo):
521 class ClearDemo(ClearMixin,Demo):
522 pass
522 pass
523
523
524
524
525 class ClearIPDemo(ClearMixin,IPythonDemo):
525 class ClearIPDemo(ClearMixin,IPythonDemo):
526 pass
526 pass
@@ -1,272 +1,281 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 """ History related magics and functionality """
3 """ History related magics and functionality """
4
4
5 # Stdlib imports
5 # Stdlib imports
6 import fnmatch
6 import fnmatch
7 import os
7 import os
8
8
9 # IPython imports
9 # IPython imports
10 from IPython.genutils import Term, ask_yes_no
10 from IPython.genutils import Term, ask_yes_no
11 import IPython.ipapi
11
12
12 def magic_history(self, parameter_s = ''):
13 def magic_history(self, parameter_s = ''):
13 """Print input history (_i<n> variables), with most recent last.
14 """Print input history (_i<n> variables), with most recent last.
14
15
15 %history -> print at most 40 inputs (some may be multi-line)\\
16 %history -> print at most 40 inputs (some may be multi-line)\\
16 %history n -> print at most n inputs\\
17 %history n -> print at most n inputs\\
17 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
18 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
18
19
19 Each input's number <n> is shown, and is accessible as the
20 Each input's number <n> is shown, and is accessible as the
20 automatically generated variable _i<n>. Multi-line statements are
21 automatically generated variable _i<n>. Multi-line statements are
21 printed starting at a new line for easy copy/paste.
22 printed starting at a new line for easy copy/paste.
22
23
23
24
24 Options:
25 Options:
25
26
26 -n: do NOT print line numbers. This is useful if you want to get a
27 -n: do NOT print line numbers. This is useful if you want to get a
27 printout of many lines which can be directly pasted into a text
28 printout of many lines which can be directly pasted into a text
28 editor.
29 editor.
29
30
30 This feature is only available if numbered prompts are in use.
31 This feature is only available if numbered prompts are in use.
31
32
32 -t: (default) print the 'translated' history, as IPython understands it.
33 -t: (default) print the 'translated' history, as IPython understands it.
33 IPython filters your input and converts it all into valid Python source
34 IPython filters your input and converts it all into valid Python source
34 before executing it (things like magics or aliases are turned into
35 before executing it (things like magics or aliases are turned into
35 function calls, for example). With this option, you'll see the native
36 function calls, for example). With this option, you'll see the native
36 history instead of the user-entered version: '%cd /' will be seen as
37 history instead of the user-entered version: '%cd /' will be seen as
37 '_ip.magic("%cd /")' instead of '%cd /'.
38 '_ip.magic("%cd /")' instead of '%cd /'.
38
39
39 -r: print the 'raw' history, i.e. the actual commands you typed.
40 -r: print the 'raw' history, i.e. the actual commands you typed.
40
41
41 -g: treat the arg as a pattern to grep for in (full) history.
42 -g: treat the arg as a pattern to grep for in (full) history.
42 This includes the "shadow history" (almost all commands ever written).
43 This includes the "shadow history" (almost all commands ever written).
43 Use '%hist -g' to show full shadow history (may be very long).
44 Use '%hist -g' to show full shadow history (may be very long).
44 In shadow history, every index nuwber starts with 0.
45 In shadow history, every index nuwber starts with 0.
45
46
46 -f FILENAME: instead of printing the output to the screen, redirect it to
47 -f FILENAME: instead of printing the output to the screen, redirect it to
47 the given file. The file is always overwritten, though IPython asks for
48 the given file. The file is always overwritten, though IPython asks for
48 confirmation first if it already exists.
49 confirmation first if it already exists.
49
50
50
51
51 """
52 """
52
53
53 ip = self.api
54 ip = self.api
54 shell = self.shell
55 shell = self.shell
55 if not shell.outputcache.do_full_cache:
56 if not shell.outputcache.do_full_cache:
56 print 'This feature is only available if numbered prompts are in use.'
57 print 'This feature is only available if numbered prompts are in use.'
57 return
58 return
58 opts,args = self.parse_options(parameter_s,'gntsrf:',mode='list')
59 opts,args = self.parse_options(parameter_s,'gntsrf:',mode='list')
59
60
60 # Check if output to specific file was requested.
61 # Check if output to specific file was requested.
61 try:
62 try:
62 outfname = opts['f']
63 outfname = opts['f']
63 except KeyError:
64 except KeyError:
64 outfile = Term.cout
65 outfile = Term.cout
65 # We don't want to close stdout at the end!
66 # We don't want to close stdout at the end!
66 close_at_end = False
67 close_at_end = False
67 else:
68 else:
68 if os.path.exists(outfname):
69 if os.path.exists(outfname):
69 ans = ask_yes_no("File %r exists. Overwrite?" % outfname)
70 ans = ask_yes_no("File %r exists. Overwrite?" % outfname)
70 if not ans:
71 if not ans:
71 print 'Aborting.'
72 print 'Aborting.'
72 return
73 return
73 else:
74 else:
74 outfile = open(outfname,'w')
75 outfile = open(outfname,'w')
75 close_at_end = True
76 close_at_end = True
76
77
77
78
78 if opts.has_key('t'):
79 if opts.has_key('t'):
79 input_hist = shell.input_hist
80 input_hist = shell.input_hist
80 elif opts.has_key('r'):
81 elif opts.has_key('r'):
81 input_hist = shell.input_hist_raw
82 input_hist = shell.input_hist_raw
82 else:
83 else:
83 input_hist = shell.input_hist
84 input_hist = shell.input_hist
84
85
85
86
86 default_length = 40
87 default_length = 40
87 pattern = None
88 pattern = None
88 if opts.has_key('g'):
89 if opts.has_key('g'):
89 init = 1
90 init = 1
90 final = len(input_hist)
91 final = len(input_hist)
91 parts = parameter_s.split(None,1)
92 parts = parameter_s.split(None,1)
92 if len(parts) == 1:
93 if len(parts) == 1:
93 parts += '*'
94 parts += '*'
94 head, pattern = parts
95 head, pattern = parts
95 pattern = "*" + pattern + "*"
96 pattern = "*" + pattern + "*"
96 elif len(args) == 0:
97 elif len(args) == 0:
97 final = len(input_hist)
98 final = len(input_hist)
98 init = max(1,final-default_length)
99 init = max(1,final-default_length)
99 elif len(args) == 1:
100 elif len(args) == 1:
100 final = len(input_hist)
101 final = len(input_hist)
101 init = max(1,final-int(args[0]))
102 init = max(1,final-int(args[0]))
102 elif len(args) == 2:
103 elif len(args) == 2:
103 init,final = map(int,args)
104 init,final = map(int,args)
104 else:
105 else:
105 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
106 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
106 print self.magic_hist.__doc__
107 print self.magic_hist.__doc__
107 return
108 return
108 width = len(str(final))
109 width = len(str(final))
109 line_sep = ['','\n']
110 line_sep = ['','\n']
110 print_nums = not opts.has_key('n')
111 print_nums = not opts.has_key('n')
111
112
112 found = False
113 found = False
113 if pattern is not None:
114 if pattern is not None:
114 sh = ip.IP.shadowhist.all()
115 sh = ip.IP.shadowhist.all()
115 for idx, s in sh:
116 for idx, s in sh:
116 if fnmatch.fnmatch(s, pattern):
117 if fnmatch.fnmatch(s, pattern):
117 print "0%d: %s" %(idx, s)
118 print "0%d: %s" %(idx, s)
118 found = True
119 found = True
119
120
120 if found:
121 if found:
121 print "==="
122 print "==="
122 print "shadow history ends, fetch by %rep <number> (must start with 0)"
123 print "shadow history ends, fetch by %rep <number> (must start with 0)"
123 print "=== start of normal history ==="
124 print "=== start of normal history ==="
124
125
125 for in_num in range(init,final):
126 for in_num in range(init,final):
126 inline = input_hist[in_num]
127 inline = input_hist[in_num]
127 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
128 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
128 continue
129 continue
129
130
130 multiline = int(inline.count('\n') > 1)
131 multiline = int(inline.count('\n') > 1)
131 if print_nums:
132 if print_nums:
132 print >> outfile, \
133 print >> outfile, \
133 '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
134 '%s:%s' % (str(in_num).ljust(width),line_sep[multiline]),
134 print >> outfile, inline,
135 print >> outfile, inline,
135
136
136 if close_at_end:
137 if close_at_end:
137 outfile.close()
138 outfile.close()
138
139
139
140
140
141
141 def magic_hist(self, parameter_s=''):
142 def magic_hist(self, parameter_s=''):
142 """Alternate name for %history."""
143 """Alternate name for %history."""
143 return self.magic_history(parameter_s)
144 return self.magic_history(parameter_s)
144
145
145
146
146
147
147 def rep_f(self, arg):
148 def rep_f(self, arg):
148 r""" Repeat a command, or get command to input line for editing
149 r""" Repeat a command, or get command to input line for editing
149
150
150 - %rep (no arguments):
151 - %rep (no arguments):
151
152
152 Place a string version of last computation result (stored in the special '_'
153 Place a string version of last computation result (stored in the special '_'
153 variable) to the next input prompt. Allows you to create elaborate command
154 variable) to the next input prompt. Allows you to create elaborate command
154 lines without using copy-paste::
155 lines without using copy-paste::
155
156
156 $ l = ["hei", "vaan"]
157 $ l = ["hei", "vaan"]
157 $ "".join(l)
158 $ "".join(l)
158 ==> heivaan
159 ==> heivaan
159 $ %rep
160 $ %rep
160 $ heivaan_ <== cursor blinking
161 $ heivaan_ <== cursor blinking
161
162
162 %rep 45
163 %rep 45
163
164
164 Place history line 45 to next input prompt. Use %hist to find out the
165 Place history line 45 to next input prompt. Use %hist to find out the
165 number.
166 number.
166
167
167 %rep 1-4 6-7 3
168 %rep 1-4 6-7 3
168
169
169 Repeat the specified lines immediately. Input slice syntax is the same as
170 Repeat the specified lines immediately. Input slice syntax is the same as
170 in %macro and %save.
171 in %macro and %save.
171
172
172 %rep foo
173 %rep foo
173
174
174 Place the most recent line that has the substring "foo" to next input.
175 Place the most recent line that has the substring "foo" to next input.
175 (e.g. 'svn ci -m foobar').
176 (e.g. 'svn ci -m foobar').
176
177
177 """
178 """
178
179
179
180
180 opts,args = self.parse_options(arg,'',mode='list')
181 opts,args = self.parse_options(arg,'',mode='list')
181 ip = self.api
182 ip = self.api
182 if not args:
183 if not args:
183 ip.set_next_input(str(ip.user_ns["_"]))
184 ip.set_next_input(str(ip.user_ns["_"]))
184 return
185 return
185
186
186 if len(args) == 1 and not '-' in args[0]:
187 if len(args) == 1 and not '-' in args[0]:
187 arg = args[0]
188 arg = args[0]
188 if len(arg) > 1 and arg.startswith('0'):
189 if len(arg) > 1 and arg.startswith('0'):
189 # get from shadow hist
190 # get from shadow hist
190 num = int(arg[1:])
191 num = int(arg[1:])
191 line = self.shadowhist.get(num)
192 line = self.shadowhist.get(num)
192 ip.set_next_input(str(line))
193 ip.set_next_input(str(line))
193 return
194 return
194 try:
195 try:
195 num = int(args[0])
196 num = int(args[0])
196 ip.set_next_input(str(ip.IP.input_hist_raw[num]).rstrip())
197 ip.set_next_input(str(ip.IP.input_hist_raw[num]).rstrip())
197 return
198 return
198 except ValueError:
199 except ValueError:
199 pass
200 pass
200
201
201 for h in reversed(self.shell.input_hist_raw):
202 for h in reversed(self.shell.input_hist_raw):
202 if 'rep' in h:
203 if 'rep' in h:
203 continue
204 continue
204 if fnmatch.fnmatch(h,'*' + arg + '*'):
205 if fnmatch.fnmatch(h,'*' + arg + '*'):
205 ip.set_next_input(str(h).rstrip())
206 ip.set_next_input(str(h).rstrip())
206 return
207 return
207
208
208
209
209 try:
210 try:
210 lines = self.extract_input_slices(args, True)
211 lines = self.extract_input_slices(args, True)
211 print "lines",lines
212 print "lines",lines
212 ip.runlines(lines)
213 ip.runlines(lines)
213 except ValueError:
214 except ValueError:
214 print "Not found in recent history:", args
215 print "Not found in recent history:", args
215
216
216
217
217
218
218 _sentinel = object()
219 _sentinel = object()
219
220
220 class ShadowHist:
221 class ShadowHist:
221 def __init__(self,db):
222 def __init__(self,db):
222 # cmd => idx mapping
223 # cmd => idx mapping
223 self.curidx = 0
224 self.curidx = 0
224 self.db = db
225 self.db = db
226 self.disabled = False
225
227
226 def inc_idx(self):
228 def inc_idx(self):
227 idx = self.db.get('shadowhist_idx', 1)
229 idx = self.db.get('shadowhist_idx', 1)
228 self.db['shadowhist_idx'] = idx + 1
230 self.db['shadowhist_idx'] = idx + 1
229 return idx
231 return idx
230
232
231 def add(self, ent):
233 def add(self, ent):
234 if self.disabled:
235 return
236 try:
232 old = self.db.hget('shadowhist', ent, _sentinel)
237 old = self.db.hget('shadowhist', ent, _sentinel)
233 if old is not _sentinel:
238 if old is not _sentinel:
234 return
239 return
235 newidx = self.inc_idx()
240 newidx = self.inc_idx()
236 #print "new",newidx # dbg
241 #print "new",newidx # dbg
237 self.db.hset('shadowhist',ent, newidx)
242 self.db.hset('shadowhist',ent, newidx)
243 except:
244 IPython.ipapi.get().IP.showtraceback()
245 print "WARNING: disabling shadow history"
246 self.disabled = True
238
247
239 def all(self):
248 def all(self):
240 d = self.db.hdict('shadowhist')
249 d = self.db.hdict('shadowhist')
241 items = [(i,s) for (s,i) in d.items()]
250 items = [(i,s) for (s,i) in d.items()]
242 items.sort()
251 items.sort()
243 return items
252 return items
244
253
245 def get(self, idx):
254 def get(self, idx):
246 all = self.all()
255 all = self.all()
247
256
248 for k, v in all:
257 for k, v in all:
249 #print k,v
258 #print k,v
250 if k == idx:
259 if k == idx:
251 return v
260 return v
252
261
253 def test_shist():
262 def test_shist():
254 from IPython.Extensions import pickleshare
263 from IPython.Extensions import pickleshare
255 db = pickleshare.PickleShareDB('~/shist')
264 db = pickleshare.PickleShareDB('~/shist')
256 s = ShadowHist(db)
265 s = ShadowHist(db)
257 s.add('hello')
266 s.add('hello')
258 s.add('world')
267 s.add('world')
259 s.add('hello')
268 s.add('hello')
260 s.add('hello')
269 s.add('hello')
261 s.add('karhu')
270 s.add('karhu')
262 print "all",s.all()
271 print "all",s.all()
263 print s.get(2)
272 print s.get(2)
264
273
265 def init_ipython(ip):
274 def init_ipython(ip):
266 ip.expose_magic("rep",rep_f)
275 ip.expose_magic("rep",rep_f)
267 ip.expose_magic("hist",magic_hist)
276 ip.expose_magic("hist",magic_hist)
268 ip.expose_magic("history",magic_history)
277 ip.expose_magic("history",magic_history)
269
278
270 import ipy_completers
279 import ipy_completers
271 ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
280 ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
272 #test_shist()
281 #test_shist()
@@ -1,249 +1,252 b''
1 """hooks for IPython.
1 """hooks for IPython.
2
2
3 In Python, it is possible to overwrite any method of any object if you really
3 In Python, it is possible to overwrite any method of any object if you really
4 want to. But IPython exposes a few 'hooks', methods which are _designed_ to
4 want to. But IPython exposes a few 'hooks', methods which are _designed_ to
5 be overwritten by users for customization purposes. This module defines the
5 be overwritten by users for customization purposes. This module defines the
6 default versions of all such hooks, which get used by IPython if not
6 default versions of all such hooks, which get used by IPython if not
7 overridden by the user.
7 overridden by the user.
8
8
9 hooks are simple functions, but they should be declared with 'self' as their
9 hooks are simple functions, but they should be declared with 'self' as their
10 first argument, because when activated they are registered into IPython as
10 first argument, because when activated they are registered into IPython as
11 instance methods. The self argument will be the IPython running instance
11 instance methods. The self argument will be the IPython running instance
12 itself, so hooks have full access to the entire IPython object.
12 itself, so hooks have full access to the entire IPython object.
13
13
14 If you wish to define a new hook and activate it, you need to put the
14 If you wish to define a new hook and activate it, you need to put the
15 necessary code into a python file which can be either imported or execfile()'d
15 necessary code into a python file which can be either imported or execfile()'d
16 from within your ipythonrc configuration.
16 from within your ipythonrc configuration.
17
17
18 For example, suppose that you have a module called 'myiphooks' in your
18 For example, suppose that you have a module called 'myiphooks' in your
19 PYTHONPATH, which contains the following definition:
19 PYTHONPATH, which contains the following definition:
20
20
21 import os
21 import os
22 import IPython.ipapi
22 import IPython.ipapi
23 ip = IPython.ipapi.get()
23 ip = IPython.ipapi.get()
24
24
25 def calljed(self,filename, linenum):
25 def calljed(self,filename, linenum):
26 "My editor hook calls the jed editor directly."
26 "My editor hook calls the jed editor directly."
27 print "Calling my own editor, jed ..."
27 print "Calling my own editor, jed ..."
28 os.system('jed +%d %s' % (linenum,filename))
28 if os.system('jed +%d %s' % (linenum,filename)) != 0:
29 raise ipapi.TryNext()
29
30
30 ip.set_hook('editor', calljed)
31 ip.set_hook('editor', calljed)
31
32
32 You can then enable the functionality by doing 'import myiphooks'
33 You can then enable the functionality by doing 'import myiphooks'
33 somewhere in your configuration files or ipython command line.
34 somewhere in your configuration files or ipython command line.
34
35
35 $Id: hooks.py 2998 2008-01-31 10:06:04Z vivainio $"""
36 $Id: hooks.py 2998 2008-01-31 10:06:04Z vivainio $"""
36
37
37 #*****************************************************************************
38 #*****************************************************************************
38 # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu>
39 # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu>
39 #
40 #
40 # Distributed under the terms of the BSD License. The full license is in
41 # Distributed under the terms of the BSD License. The full license is in
41 # the file COPYING, distributed as part of this software.
42 # the file COPYING, distributed as part of this software.
42 #*****************************************************************************
43 #*****************************************************************************
43
44
44 from IPython import Release
45 from IPython import Release
45 from IPython import ipapi
46 from IPython import ipapi
46 __author__ = '%s <%s>' % Release.authors['Fernando']
47 __author__ = '%s <%s>' % Release.authors['Fernando']
47 __license__ = Release.license
48 __license__ = Release.license
48 __version__ = Release.version
49 __version__ = Release.version
49
50
50 import os,bisect
51 import os,bisect
51 from genutils import Term,shell
52 from genutils import Term,shell
52 from pprint import PrettyPrinter
53 from pprint import PrettyPrinter
53
54
54 # List here all the default hooks. For now it's just the editor functions
55 # List here all the default hooks. For now it's just the editor functions
55 # but over time we'll move here all the public API for user-accessible things.
56 # but over time we'll move here all the public API for user-accessible things.
56 # vds: >>
57 # vds: >>
57 __all__ = ['editor', 'fix_error_editor', 'synchronize_with_editor', 'result_display',
58 __all__ = ['editor', 'fix_error_editor', 'synchronize_with_editor', 'result_display',
58 'input_prefilter', 'shutdown_hook', 'late_startup_hook',
59 'input_prefilter', 'shutdown_hook', 'late_startup_hook',
59 'generate_prompt', 'generate_output_prompt','shell_hook',
60 'generate_prompt', 'generate_output_prompt','shell_hook',
60 'show_in_pager','pre_prompt_hook', 'pre_runcode_hook']
61 'show_in_pager','pre_prompt_hook', 'pre_runcode_hook']
61 # vds: <<
62 # vds: <<
62
63
63 pformat = PrettyPrinter().pformat
64 pformat = PrettyPrinter().pformat
64
65
65 def editor(self,filename, linenum=None):
66 def editor(self,filename, linenum=None):
66 """Open the default editor at the given filename and linenumber.
67 """Open the default editor at the given filename and linenumber.
67
68
68 This is IPython's default editor hook, you can use it as an example to
69 This is IPython's default editor hook, you can use it as an example to
69 write your own modified one. To set your own editor function as the
70 write your own modified one. To set your own editor function as the
70 new editor hook, call ip.set_hook('editor',yourfunc)."""
71 new editor hook, call ip.set_hook('editor',yourfunc)."""
71
72
72 # IPython configures a default editor at startup by reading $EDITOR from
73 # IPython configures a default editor at startup by reading $EDITOR from
73 # the environment, and falling back on vi (unix) or notepad (win32).
74 # the environment, and falling back on vi (unix) or notepad (win32).
74 editor = self.rc.editor
75 editor = self.rc.editor
75
76
76 # marker for at which line to open the file (for existing objects)
77 # marker for at which line to open the file (for existing objects)
77 if linenum is None or editor=='notepad':
78 if linenum is None or editor=='notepad':
78 linemark = ''
79 linemark = ''
79 else:
80 else:
80 linemark = '+%d' % int(linenum)
81 linemark = '+%d' % int(linenum)
81
82
82 # Enclose in quotes if necessary and legal
83 # Enclose in quotes if necessary and legal
83 if ' ' in editor and os.path.isfile(editor) and editor[0] != '"':
84 if ' ' in editor and os.path.isfile(editor) and editor[0] != '"':
84 editor = '"%s"' % editor
85 editor = '"%s"' % editor
85
86
86 # Call the actual editor
87 # Call the actual editor
87 os.system('%s %s %s' % (editor,linemark,filename))
88 if os.system('%s %s %s' % (editor,linemark,filename)) != 0:
89 raise ipapi.TryNext()
88
90
89 import tempfile
91 import tempfile
90 def fix_error_editor(self,filename,linenum,column,msg):
92 def fix_error_editor(self,filename,linenum,column,msg):
91 """Open the editor at the given filename, linenumber, column and
93 """Open the editor at the given filename, linenumber, column and
92 show an error message. This is used for correcting syntax errors.
94 show an error message. This is used for correcting syntax errors.
93 The current implementation only has special support for the VIM editor,
95 The current implementation only has special support for the VIM editor,
94 and falls back on the 'editor' hook if VIM is not used.
96 and falls back on the 'editor' hook if VIM is not used.
95
97
96 Call ip.set_hook('fix_error_editor',youfunc) to use your own function,
98 Call ip.set_hook('fix_error_editor',youfunc) to use your own function,
97 """
99 """
98 def vim_quickfix_file():
100 def vim_quickfix_file():
99 t = tempfile.NamedTemporaryFile()
101 t = tempfile.NamedTemporaryFile()
100 t.write('%s:%d:%d:%s\n' % (filename,linenum,column,msg))
102 t.write('%s:%d:%d:%s\n' % (filename,linenum,column,msg))
101 t.flush()
103 t.flush()
102 return t
104 return t
103 if os.path.basename(self.rc.editor) != 'vim':
105 if os.path.basename(self.rc.editor) != 'vim':
104 self.hooks.editor(filename,linenum)
106 self.hooks.editor(filename,linenum)
105 return
107 return
106 t = vim_quickfix_file()
108 t = vim_quickfix_file()
107 try:
109 try:
108 os.system('vim --cmd "set errorformat=%f:%l:%c:%m" -q ' + t.name)
110 if os.system('vim --cmd "set errorformat=%f:%l:%c:%m" -q ' + t.name):
111 raise ipapi.TryNext()
109 finally:
112 finally:
110 t.close()
113 t.close()
111
114
112 # vds: >>
115 # vds: >>
113 def synchronize_with_editor(self, filename, linenum, column):
116 def synchronize_with_editor(self, filename, linenum, column):
114 pass
117 pass
115 # vds: <<
118 # vds: <<
116
119
117 class CommandChainDispatcher:
120 class CommandChainDispatcher:
118 """ Dispatch calls to a chain of commands until some func can handle it
121 """ Dispatch calls to a chain of commands until some func can handle it
119
122
120 Usage: instantiate, execute "add" to add commands (with optional
123 Usage: instantiate, execute "add" to add commands (with optional
121 priority), execute normally via f() calling mechanism.
124 priority), execute normally via f() calling mechanism.
122
125
123 """
126 """
124 def __init__(self,commands=None):
127 def __init__(self,commands=None):
125 if commands is None:
128 if commands is None:
126 self.chain = []
129 self.chain = []
127 else:
130 else:
128 self.chain = commands
131 self.chain = commands
129
132
130
133
131 def __call__(self,*args, **kw):
134 def __call__(self,*args, **kw):
132 """ Command chain is called just like normal func.
135 """ Command chain is called just like normal func.
133
136
134 This will call all funcs in chain with the same args as were given to this
137 This will call all funcs in chain with the same args as were given to this
135 function, and return the result of first func that didn't raise
138 function, and return the result of first func that didn't raise
136 TryNext """
139 TryNext """
137
140
138 for prio,cmd in self.chain:
141 for prio,cmd in self.chain:
139 #print "prio",prio,"cmd",cmd #dbg
142 #print "prio",prio,"cmd",cmd #dbg
140 try:
143 try:
141 ret = cmd(*args, **kw)
144 ret = cmd(*args, **kw)
142 return ret
145 return ret
143 except ipapi.TryNext, exc:
146 except ipapi.TryNext, exc:
144 if exc.args or exc.kwargs:
147 if exc.args or exc.kwargs:
145 args = exc.args
148 args = exc.args
146 kw = exc.kwargs
149 kw = exc.kwargs
147 # if no function will accept it, raise TryNext up to the caller
150 # if no function will accept it, raise TryNext up to the caller
148 raise ipapi.TryNext
151 raise ipapi.TryNext
149
152
150 def __str__(self):
153 def __str__(self):
151 return str(self.chain)
154 return str(self.chain)
152
155
153 def add(self, func, priority=0):
156 def add(self, func, priority=0):
154 """ Add a func to the cmd chain with given priority """
157 """ Add a func to the cmd chain with given priority """
155 bisect.insort(self.chain,(priority,func))
158 bisect.insort(self.chain,(priority,func))
156
159
157 def __iter__(self):
160 def __iter__(self):
158 """ Return all objects in chain.
161 """ Return all objects in chain.
159
162
160 Handy if the objects are not callable.
163 Handy if the objects are not callable.
161 """
164 """
162 return iter(self.chain)
165 return iter(self.chain)
163
166
164 def result_display(self,arg):
167 def result_display(self,arg):
165 """ Default display hook.
168 """ Default display hook.
166
169
167 Called for displaying the result to the user.
170 Called for displaying the result to the user.
168 """
171 """
169
172
170 if self.rc.pprint:
173 if self.rc.pprint:
171 out = pformat(arg)
174 out = pformat(arg)
172 if '\n' in out:
175 if '\n' in out:
173 # So that multi-line strings line up with the left column of
176 # So that multi-line strings line up with the left column of
174 # the screen, instead of having the output prompt mess up
177 # the screen, instead of having the output prompt mess up
175 # their first line.
178 # their first line.
176 Term.cout.write('\n')
179 Term.cout.write('\n')
177 print >>Term.cout, out
180 print >>Term.cout, out
178 else:
181 else:
179 # By default, the interactive prompt uses repr() to display results,
182 # By default, the interactive prompt uses repr() to display results,
180 # so we should honor this. Users who'd rather use a different
183 # so we should honor this. Users who'd rather use a different
181 # mechanism can easily override this hook.
184 # mechanism can easily override this hook.
182 print >>Term.cout, repr(arg)
185 print >>Term.cout, repr(arg)
183 # the default display hook doesn't manipulate the value to put in history
186 # the default display hook doesn't manipulate the value to put in history
184 return None
187 return None
185
188
186 def input_prefilter(self,line):
189 def input_prefilter(self,line):
187 """ Default input prefilter
190 """ Default input prefilter
188
191
189 This returns the line as unchanged, so that the interpreter
192 This returns the line as unchanged, so that the interpreter
190 knows that nothing was done and proceeds with "classic" prefiltering
193 knows that nothing was done and proceeds with "classic" prefiltering
191 (%magics, !shell commands etc.).
194 (%magics, !shell commands etc.).
192
195
193 Note that leading whitespace is not passed to this hook. Prefilter
196 Note that leading whitespace is not passed to this hook. Prefilter
194 can't alter indentation.
197 can't alter indentation.
195
198
196 """
199 """
197 #print "attempt to rewrite",line #dbg
200 #print "attempt to rewrite",line #dbg
198 return line
201 return line
199
202
200 def shutdown_hook(self):
203 def shutdown_hook(self):
201 """ default shutdown hook
204 """ default shutdown hook
202
205
203 Typically, shotdown hooks should raise TryNext so all shutdown ops are done
206 Typically, shotdown hooks should raise TryNext so all shutdown ops are done
204 """
207 """
205
208
206 #print "default shutdown hook ok" # dbg
209 #print "default shutdown hook ok" # dbg
207 return
210 return
208
211
209 def late_startup_hook(self):
212 def late_startup_hook(self):
210 """ Executed after ipython has been constructed and configured
213 """ Executed after ipython has been constructed and configured
211
214
212 """
215 """
213 #print "default startup hook ok" # dbg
216 #print "default startup hook ok" # dbg
214
217
215 def generate_prompt(self, is_continuation):
218 def generate_prompt(self, is_continuation):
216 """ calculate and return a string with the prompt to display """
219 """ calculate and return a string with the prompt to display """
217 ip = self.api
220 ip = self.api
218 if is_continuation:
221 if is_continuation:
219 return str(ip.IP.outputcache.prompt2)
222 return str(ip.IP.outputcache.prompt2)
220 return str(ip.IP.outputcache.prompt1)
223 return str(ip.IP.outputcache.prompt1)
221
224
222 def generate_output_prompt(self):
225 def generate_output_prompt(self):
223 ip = self.api
226 ip = self.api
224 return str(ip.IP.outputcache.prompt_out)
227 return str(ip.IP.outputcache.prompt_out)
225
228
226 def shell_hook(self,cmd):
229 def shell_hook(self,cmd):
227 """ Run system/shell command a'la os.system() """
230 """ Run system/shell command a'la os.system() """
228
231
229 shell(cmd, header=self.rc.system_header, verbose=self.rc.system_verbose)
232 shell(cmd, header=self.rc.system_header, verbose=self.rc.system_verbose)
230
233
231 def show_in_pager(self,s):
234 def show_in_pager(self,s):
232 """ Run a string through pager """
235 """ Run a string through pager """
233 # raising TryNext here will use the default paging functionality
236 # raising TryNext here will use the default paging functionality
234 raise ipapi.TryNext
237 raise ipapi.TryNext
235
238
236 def pre_prompt_hook(self):
239 def pre_prompt_hook(self):
237 """ Run before displaying the next prompt
240 """ Run before displaying the next prompt
238
241
239 Use this e.g. to display output from asynchronous operations (in order
242 Use this e.g. to display output from asynchronous operations (in order
240 to not mess up text entry)
243 to not mess up text entry)
241 """
244 """
242
245
243 return None
246 return None
244
247
245 def pre_runcode_hook(self):
248 def pre_runcode_hook(self):
246 """ Executed before running the (prefiltered) code in IPython """
249 """ Executed before running the (prefiltered) code in IPython """
247 return None
250 return None
248
251
249
252
@@ -1,2686 +1,2695 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 IPython -- An enhanced Interactive Python
3 IPython -- An enhanced Interactive Python
4
4
5 Requires Python 2.3 or newer.
5 Requires Python 2.3 or newer.
6
6
7 This file contains all the classes and helper functions specific to IPython.
7 This file contains all the classes and helper functions specific to IPython.
8
8
9 """
9 """
10
10
11 #*****************************************************************************
11 #*****************************************************************************
12 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
12 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
13 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
13 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
14 #
14 #
15 # Distributed under the terms of the BSD License. The full license is in
15 # Distributed under the terms of the BSD License. The full license is in
16 # the file COPYING, distributed as part of this software.
16 # the file COPYING, distributed as part of this software.
17 #
17 #
18 # Note: this code originally subclassed code.InteractiveConsole from the
18 # Note: this code originally subclassed code.InteractiveConsole from the
19 # Python standard library. Over time, all of that class has been copied
19 # Python standard library. Over time, all of that class has been copied
20 # verbatim here for modifications which could not be accomplished by
20 # verbatim here for modifications which could not be accomplished by
21 # subclassing. At this point, there are no dependencies at all on the code
21 # subclassing. At this point, there are no dependencies at all on the code
22 # module anymore (it is not even imported). The Python License (sec. 2)
22 # module anymore (it is not even imported). The Python License (sec. 2)
23 # allows for this, but it's always nice to acknowledge credit where credit is
23 # allows for this, but it's always nice to acknowledge credit where credit is
24 # due.
24 # due.
25 #*****************************************************************************
25 #*****************************************************************************
26
26
27 #****************************************************************************
27 #****************************************************************************
28 # Modules and globals
28 # Modules and globals
29
29
30 from IPython import Release
30 from IPython import Release
31 __author__ = '%s <%s>\n%s <%s>' % \
31 __author__ = '%s <%s>\n%s <%s>' % \
32 ( Release.authors['Janko'] + Release.authors['Fernando'] )
32 ( Release.authors['Janko'] + Release.authors['Fernando'] )
33 __license__ = Release.license
33 __license__ = Release.license
34 __version__ = Release.version
34 __version__ = Release.version
35
35
36 # Python standard modules
36 # Python standard modules
37 import __main__
37 import __main__
38 import __builtin__
38 import __builtin__
39 import StringIO
39 import StringIO
40 import bdb
40 import bdb
41 import cPickle as pickle
41 import cPickle as pickle
42 import codeop
42 import codeop
43 import exceptions
43 import exceptions
44 import glob
44 import glob
45 import inspect
45 import inspect
46 import keyword
46 import keyword
47 import new
47 import new
48 import os
48 import os
49 import pydoc
49 import pydoc
50 import re
50 import re
51 import shutil
51 import shutil
52 import string
52 import string
53 import sys
53 import sys
54 import tempfile
54 import tempfile
55 import traceback
55 import traceback
56 import types
56 import types
57 import warnings
57 import warnings
58 warnings.filterwarnings('ignore', r'.*sets module*')
58 warnings.filterwarnings('ignore', r'.*sets module*')
59 from sets import Set
59 from sets import Set
60 from pprint import pprint, pformat
60 from pprint import pprint, pformat
61
61
62 # IPython's own modules
62 # IPython's own modules
63 #import IPython
63 #import IPython
64 from IPython import Debugger,OInspect,PyColorize,ultraTB
64 from IPython import Debugger,OInspect,PyColorize,ultraTB
65 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
65 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
66 from IPython.Extensions import pickleshare
66 from IPython.Extensions import pickleshare
67 from IPython.FakeModule import FakeModule
67 from IPython.FakeModule import FakeModule
68 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
68 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
69 from IPython.Logger import Logger
69 from IPython.Logger import Logger
70 from IPython.Magic import Magic
70 from IPython.Magic import Magic
71 from IPython.Prompts import CachedOutput
71 from IPython.Prompts import CachedOutput
72 from IPython.ipstruct import Struct
72 from IPython.ipstruct import Struct
73 from IPython.background_jobs import BackgroundJobManager
73 from IPython.background_jobs import BackgroundJobManager
74 from IPython.usage import cmd_line_usage,interactive_usage
74 from IPython.usage import cmd_line_usage,interactive_usage
75 from IPython.genutils import *
75 from IPython.genutils import *
76 from IPython.strdispatch import StrDispatch
76 from IPython.strdispatch import StrDispatch
77 import IPython.ipapi
77 import IPython.ipapi
78 import IPython.history
78 import IPython.history
79 import IPython.prefilter as prefilter
79 import IPython.prefilter as prefilter
80 import IPython.shadowns
80 import IPython.shadowns
81 # Globals
81 # Globals
82
82
83 # store the builtin raw_input globally, and use this always, in case user code
83 # store the builtin raw_input globally, and use this always, in case user code
84 # overwrites it (like wx.py.PyShell does)
84 # overwrites it (like wx.py.PyShell does)
85 raw_input_original = raw_input
85 raw_input_original = raw_input
86
86
87 # compiled regexps for autoindent management
87 # compiled regexps for autoindent management
88 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
88 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
89
89
90
90
91 #****************************************************************************
91 #****************************************************************************
92 # Some utility function definitions
92 # Some utility function definitions
93
93
94 ini_spaces_re = re.compile(r'^(\s+)')
94 ini_spaces_re = re.compile(r'^(\s+)')
95
95
96 def num_ini_spaces(strng):
96 def num_ini_spaces(strng):
97 """Return the number of initial spaces in a string"""
97 """Return the number of initial spaces in a string"""
98
98
99 ini_spaces = ini_spaces_re.match(strng)
99 ini_spaces = ini_spaces_re.match(strng)
100 if ini_spaces:
100 if ini_spaces:
101 return ini_spaces.end()
101 return ini_spaces.end()
102 else:
102 else:
103 return 0
103 return 0
104
104
105 def softspace(file, newvalue):
105 def softspace(file, newvalue):
106 """Copied from code.py, to remove the dependency"""
106 """Copied from code.py, to remove the dependency"""
107
107
108 oldvalue = 0
108 oldvalue = 0
109 try:
109 try:
110 oldvalue = file.softspace
110 oldvalue = file.softspace
111 except AttributeError:
111 except AttributeError:
112 pass
112 pass
113 try:
113 try:
114 file.softspace = newvalue
114 file.softspace = newvalue
115 except (AttributeError, TypeError):
115 except (AttributeError, TypeError):
116 # "attribute-less object" or "read-only attributes"
116 # "attribute-less object" or "read-only attributes"
117 pass
117 pass
118 return oldvalue
118 return oldvalue
119
119
120
120
121 #****************************************************************************
121 #****************************************************************************
122 # Local use exceptions
122 # Local use exceptions
123 class SpaceInInput(exceptions.Exception): pass
123 class SpaceInInput(exceptions.Exception): pass
124
124
125
125
126 #****************************************************************************
126 #****************************************************************************
127 # Local use classes
127 # Local use classes
128 class Bunch: pass
128 class Bunch: pass
129
129
130 class Undefined: pass
130 class Undefined: pass
131
131
132 class Quitter(object):
132 class Quitter(object):
133 """Simple class to handle exit, similar to Python 2.5's.
133 """Simple class to handle exit, similar to Python 2.5's.
134
134
135 It handles exiting in an ipython-safe manner, which the one in Python 2.5
135 It handles exiting in an ipython-safe manner, which the one in Python 2.5
136 doesn't do (obviously, since it doesn't know about ipython)."""
136 doesn't do (obviously, since it doesn't know about ipython)."""
137
137
138 def __init__(self,shell,name):
138 def __init__(self,shell,name):
139 self.shell = shell
139 self.shell = shell
140 self.name = name
140 self.name = name
141
141
142 def __repr__(self):
142 def __repr__(self):
143 return 'Type %s() to exit.' % self.name
143 return 'Type %s() to exit.' % self.name
144 __str__ = __repr__
144 __str__ = __repr__
145
145
146 def __call__(self):
146 def __call__(self):
147 self.shell.exit()
147 self.shell.exit()
148
148
149 class InputList(list):
149 class InputList(list):
150 """Class to store user input.
150 """Class to store user input.
151
151
152 It's basically a list, but slices return a string instead of a list, thus
152 It's basically a list, but slices return a string instead of a list, thus
153 allowing things like (assuming 'In' is an instance):
153 allowing things like (assuming 'In' is an instance):
154
154
155 exec In[4:7]
155 exec In[4:7]
156
156
157 or
157 or
158
158
159 exec In[5:9] + In[14] + In[21:25]"""
159 exec In[5:9] + In[14] + In[21:25]"""
160
160
161 def __getslice__(self,i,j):
161 def __getslice__(self,i,j):
162 return ''.join(list.__getslice__(self,i,j))
162 return ''.join(list.__getslice__(self,i,j))
163
163
164 class SyntaxTB(ultraTB.ListTB):
164 class SyntaxTB(ultraTB.ListTB):
165 """Extension which holds some state: the last exception value"""
165 """Extension which holds some state: the last exception value"""
166
166
167 def __init__(self,color_scheme = 'NoColor'):
167 def __init__(self,color_scheme = 'NoColor'):
168 ultraTB.ListTB.__init__(self,color_scheme)
168 ultraTB.ListTB.__init__(self,color_scheme)
169 self.last_syntax_error = None
169 self.last_syntax_error = None
170
170
171 def __call__(self, etype, value, elist):
171 def __call__(self, etype, value, elist):
172 self.last_syntax_error = value
172 self.last_syntax_error = value
173 ultraTB.ListTB.__call__(self,etype,value,elist)
173 ultraTB.ListTB.__call__(self,etype,value,elist)
174
174
175 def clear_err_state(self):
175 def clear_err_state(self):
176 """Return the current error state and clear it"""
176 """Return the current error state and clear it"""
177 e = self.last_syntax_error
177 e = self.last_syntax_error
178 self.last_syntax_error = None
178 self.last_syntax_error = None
179 return e
179 return e
180
180
181 #****************************************************************************
181 #****************************************************************************
182 # Main IPython class
182 # Main IPython class
183
183
184 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
184 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
185 # until a full rewrite is made. I've cleaned all cross-class uses of
185 # until a full rewrite is made. I've cleaned all cross-class uses of
186 # attributes and methods, but too much user code out there relies on the
186 # attributes and methods, but too much user code out there relies on the
187 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
187 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
188 #
188 #
189 # But at least now, all the pieces have been separated and we could, in
189 # But at least now, all the pieces have been separated and we could, in
190 # principle, stop using the mixin. This will ease the transition to the
190 # principle, stop using the mixin. This will ease the transition to the
191 # chainsaw branch.
191 # chainsaw branch.
192
192
193 # For reference, the following is the list of 'self.foo' uses in the Magic
193 # For reference, the following is the list of 'self.foo' uses in the Magic
194 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
194 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
195 # class, to prevent clashes.
195 # class, to prevent clashes.
196
196
197 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
197 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
198 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
198 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
199 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
199 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
200 # 'self.value']
200 # 'self.value']
201
201
202 class InteractiveShell(object,Magic):
202 class InteractiveShell(object,Magic):
203 """An enhanced console for Python."""
203 """An enhanced console for Python."""
204
204
205 # class attribute to indicate whether the class supports threads or not.
205 # class attribute to indicate whether the class supports threads or not.
206 # Subclasses with thread support should override this as needed.
206 # Subclasses with thread support should override this as needed.
207 isthreaded = False
207 isthreaded = False
208
208
209 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
209 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
210 user_ns=None,user_global_ns=None,banner2='',
210 user_ns=None,user_global_ns=None,banner2='',
211 custom_exceptions=((),None),embedded=False):
211 custom_exceptions=((),None),embedded=False):
212
212
213 # log system
213 # log system
214 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
214 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
215
215
216 # Job manager (for jobs run as background threads)
216 # Job manager (for jobs run as background threads)
217 self.jobs = BackgroundJobManager()
217 self.jobs = BackgroundJobManager()
218
218
219 # Store the actual shell's name
219 # Store the actual shell's name
220 self.name = name
220 self.name = name
221 self.more = False
221 self.more = False
222
222
223 # We need to know whether the instance is meant for embedding, since
223 # We need to know whether the instance is meant for embedding, since
224 # global/local namespaces need to be handled differently in that case
224 # global/local namespaces need to be handled differently in that case
225 self.embedded = embedded
225 self.embedded = embedded
226 if embedded:
226 if embedded:
227 # Control variable so users can, from within the embedded instance,
227 # Control variable so users can, from within the embedded instance,
228 # permanently deactivate it.
228 # permanently deactivate it.
229 self.embedded_active = True
229 self.embedded_active = True
230
230
231 # command compiler
231 # command compiler
232 self.compile = codeop.CommandCompiler()
232 self.compile = codeop.CommandCompiler()
233
233
234 # User input buffer
234 # User input buffer
235 self.buffer = []
235 self.buffer = []
236
236
237 # Default name given in compilation of code
237 # Default name given in compilation of code
238 self.filename = '<ipython console>'
238 self.filename = '<ipython console>'
239
239
240 # Install our own quitter instead of the builtins. For python2.3-2.4,
240 # Install our own quitter instead of the builtins. For python2.3-2.4,
241 # this brings in behavior like 2.5, and for 2.5 it's identical.
241 # this brings in behavior like 2.5, and for 2.5 it's identical.
242 __builtin__.exit = Quitter(self,'exit')
242 __builtin__.exit = Quitter(self,'exit')
243 __builtin__.quit = Quitter(self,'quit')
243 __builtin__.quit = Quitter(self,'quit')
244
244
245 # Make an empty namespace, which extension writers can rely on both
245 # Make an empty namespace, which extension writers can rely on both
246 # existing and NEVER being used by ipython itself. This gives them a
246 # existing and NEVER being used by ipython itself. This gives them a
247 # convenient location for storing additional information and state
247 # convenient location for storing additional information and state
248 # their extensions may require, without fear of collisions with other
248 # their extensions may require, without fear of collisions with other
249 # ipython names that may develop later.
249 # ipython names that may develop later.
250 self.meta = Struct()
250 self.meta = Struct()
251
251
252 # Create the namespace where the user will operate. user_ns is
252 # Create the namespace where the user will operate. user_ns is
253 # normally the only one used, and it is passed to the exec calls as
253 # normally the only one used, and it is passed to the exec calls as
254 # the locals argument. But we do carry a user_global_ns namespace
254 # the locals argument. But we do carry a user_global_ns namespace
255 # given as the exec 'globals' argument, This is useful in embedding
255 # given as the exec 'globals' argument, This is useful in embedding
256 # situations where the ipython shell opens in a context where the
256 # situations where the ipython shell opens in a context where the
257 # distinction between locals and globals is meaningful. For
257 # distinction between locals and globals is meaningful. For
258 # non-embedded contexts, it is just the same object as the user_ns dict.
258 # non-embedded contexts, it is just the same object as the user_ns dict.
259
259
260 # FIXME. For some strange reason, __builtins__ is showing up at user
260 # FIXME. For some strange reason, __builtins__ is showing up at user
261 # level as a dict instead of a module. This is a manual fix, but I
261 # level as a dict instead of a module. This is a manual fix, but I
262 # should really track down where the problem is coming from. Alex
262 # should really track down where the problem is coming from. Alex
263 # Schmolck reported this problem first.
263 # Schmolck reported this problem first.
264
264
265 # A useful post by Alex Martelli on this topic:
265 # A useful post by Alex Martelli on this topic:
266 # Re: inconsistent value from __builtins__
266 # Re: inconsistent value from __builtins__
267 # Von: Alex Martelli <aleaxit@yahoo.com>
267 # Von: Alex Martelli <aleaxit@yahoo.com>
268 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
268 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
269 # Gruppen: comp.lang.python
269 # Gruppen: comp.lang.python
270
270
271 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
271 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
272 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
272 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
273 # > <type 'dict'>
273 # > <type 'dict'>
274 # > >>> print type(__builtins__)
274 # > >>> print type(__builtins__)
275 # > <type 'module'>
275 # > <type 'module'>
276 # > Is this difference in return value intentional?
276 # > Is this difference in return value intentional?
277
277
278 # Well, it's documented that '__builtins__' can be either a dictionary
278 # Well, it's documented that '__builtins__' can be either a dictionary
279 # or a module, and it's been that way for a long time. Whether it's
279 # or a module, and it's been that way for a long time. Whether it's
280 # intentional (or sensible), I don't know. In any case, the idea is
280 # intentional (or sensible), I don't know. In any case, the idea is
281 # that if you need to access the built-in namespace directly, you
281 # that if you need to access the built-in namespace directly, you
282 # should start with "import __builtin__" (note, no 's') which will
282 # should start with "import __builtin__" (note, no 's') which will
283 # definitely give you a module. Yeah, it's somewhat confusing:-(.
283 # definitely give you a module. Yeah, it's somewhat confusing:-(.
284
284
285 # These routines return properly built dicts as needed by the rest of
285 # These routines return properly built dicts as needed by the rest of
286 # the code, and can also be used by extension writers to generate
286 # the code, and can also be used by extension writers to generate
287 # properly initialized namespaces.
287 # properly initialized namespaces.
288 user_ns, user_global_ns = IPython.ipapi.make_user_namespaces(user_ns,
288 user_ns, user_global_ns = IPython.ipapi.make_user_namespaces(user_ns,
289 user_global_ns)
289 user_global_ns)
290
290
291 # Assign namespaces
291 # Assign namespaces
292 # This is the namespace where all normal user variables live
292 # This is the namespace where all normal user variables live
293 self.user_ns = user_ns
293 self.user_ns = user_ns
294 self.user_global_ns = user_global_ns
294 self.user_global_ns = user_global_ns
295 # A namespace to keep track of internal data structures to prevent
295 # A namespace to keep track of internal data structures to prevent
296 # them from cluttering user-visible stuff. Will be updated later
296 # them from cluttering user-visible stuff. Will be updated later
297 self.internal_ns = {}
297 self.internal_ns = {}
298
298
299 # Namespace of system aliases. Each entry in the alias
299 # Namespace of system aliases. Each entry in the alias
300 # table must be a 2-tuple of the form (N,name), where N is the number
300 # table must be a 2-tuple of the form (N,name), where N is the number
301 # of positional arguments of the alias.
301 # of positional arguments of the alias.
302 self.alias_table = {}
302 self.alias_table = {}
303
303
304 # A table holding all the namespaces IPython deals with, so that
304 # A table holding all the namespaces IPython deals with, so that
305 # introspection facilities can search easily.
305 # introspection facilities can search easily.
306 self.ns_table = {'user':user_ns,
306 self.ns_table = {'user':user_ns,
307 'user_global':user_global_ns,
307 'user_global':user_global_ns,
308 'alias':self.alias_table,
308 'alias':self.alias_table,
309 'internal':self.internal_ns,
309 'internal':self.internal_ns,
310 'builtin':__builtin__.__dict__
310 'builtin':__builtin__.__dict__
311 }
311 }
312 # The user namespace MUST have a pointer to the shell itself.
312 # The user namespace MUST have a pointer to the shell itself.
313 self.user_ns[name] = self
313 self.user_ns[name] = self
314
314
315 # We need to insert into sys.modules something that looks like a
315 # We need to insert into sys.modules something that looks like a
316 # module but which accesses the IPython namespace, for shelve and
316 # module but which accesses the IPython namespace, for shelve and
317 # pickle to work interactively. Normally they rely on getting
317 # pickle to work interactively. Normally they rely on getting
318 # everything out of __main__, but for embedding purposes each IPython
318 # everything out of __main__, but for embedding purposes each IPython
319 # instance has its own private namespace, so we can't go shoving
319 # instance has its own private namespace, so we can't go shoving
320 # everything into __main__.
320 # everything into __main__.
321
321
322 # note, however, that we should only do this for non-embedded
322 # note, however, that we should only do this for non-embedded
323 # ipythons, which really mimic the __main__.__dict__ with their own
323 # ipythons, which really mimic the __main__.__dict__ with their own
324 # namespace. Embedded instances, on the other hand, should not do
324 # namespace. Embedded instances, on the other hand, should not do
325 # this because they need to manage the user local/global namespaces
325 # this because they need to manage the user local/global namespaces
326 # only, but they live within a 'normal' __main__ (meaning, they
326 # only, but they live within a 'normal' __main__ (meaning, they
327 # shouldn't overtake the execution environment of the script they're
327 # shouldn't overtake the execution environment of the script they're
328 # embedded in).
328 # embedded in).
329
329
330 if not embedded:
330 if not embedded:
331 try:
331 try:
332 main_name = self.user_ns['__name__']
332 main_name = self.user_ns['__name__']
333 except KeyError:
333 except KeyError:
334 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
334 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
335 else:
335 else:
336 #print "pickle hack in place" # dbg
336 #print "pickle hack in place" # dbg
337 #print 'main_name:',main_name # dbg
337 #print 'main_name:',main_name # dbg
338 sys.modules[main_name] = FakeModule(self.user_ns)
338 sys.modules[main_name] = FakeModule(self.user_ns)
339
339
340 # Now that FakeModule produces a real module, we've run into a nasty
340 # Now that FakeModule produces a real module, we've run into a nasty
341 # problem: after script execution (via %run), the module where the user
341 # problem: after script execution (via %run), the module where the user
342 # code ran is deleted. Now that this object is a true module (needed
342 # code ran is deleted. Now that this object is a true module (needed
343 # so docetst and other tools work correctly), the Python module
343 # so docetst and other tools work correctly), the Python module
344 # teardown mechanism runs over it, and sets to None every variable
344 # teardown mechanism runs over it, and sets to None every variable
345 # present in that module. This means that later calls to functions
345 # present in that module. This means that later calls to functions
346 # defined in the script (which have become interactively visible after
346 # defined in the script (which have become interactively visible after
347 # script exit) fail, because they hold references to objects that have
347 # script exit) fail, because they hold references to objects that have
348 # become overwritten into None. The only solution I see right now is
348 # become overwritten into None. The only solution I see right now is
349 # to protect every FakeModule used by %run by holding an internal
349 # to protect every FakeModule used by %run by holding an internal
350 # reference to it. This private list will be used for that. The
350 # reference to it. This private list will be used for that. The
351 # %reset command will flush it as well.
351 # %reset command will flush it as well.
352 self._user_main_modules = []
352 self._user_main_modules = []
353
353
354 # List of input with multi-line handling.
354 # List of input with multi-line handling.
355 # Fill its zero entry, user counter starts at 1
355 # Fill its zero entry, user counter starts at 1
356 self.input_hist = InputList(['\n'])
356 self.input_hist = InputList(['\n'])
357 # This one will hold the 'raw' input history, without any
357 # This one will hold the 'raw' input history, without any
358 # pre-processing. This will allow users to retrieve the input just as
358 # pre-processing. This will allow users to retrieve the input just as
359 # it was exactly typed in by the user, with %hist -r.
359 # it was exactly typed in by the user, with %hist -r.
360 self.input_hist_raw = InputList(['\n'])
360 self.input_hist_raw = InputList(['\n'])
361
361
362 # list of visited directories
362 # list of visited directories
363 try:
363 try:
364 self.dir_hist = [os.getcwd()]
364 self.dir_hist = [os.getcwd()]
365 except OSError:
365 except OSError:
366 self.dir_hist = []
366 self.dir_hist = []
367
367
368 # dict of output history
368 # dict of output history
369 self.output_hist = {}
369 self.output_hist = {}
370
370
371 # Get system encoding at startup time. Certain terminals (like Emacs
371 # Get system encoding at startup time. Certain terminals (like Emacs
372 # under Win32 have it set to None, and we need to have a known valid
372 # under Win32 have it set to None, and we need to have a known valid
373 # encoding to use in the raw_input() method
373 # encoding to use in the raw_input() method
374 try:
374 try:
375 self.stdin_encoding = sys.stdin.encoding or 'ascii'
375 self.stdin_encoding = sys.stdin.encoding or 'ascii'
376 except AttributeError:
376 except AttributeError:
377 self.stdin_encoding = 'ascii'
377 self.stdin_encoding = 'ascii'
378
378
379 # dict of things NOT to alias (keywords, builtins and some magics)
379 # dict of things NOT to alias (keywords, builtins and some magics)
380 no_alias = {}
380 no_alias = {}
381 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
381 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
382 for key in keyword.kwlist + no_alias_magics:
382 for key in keyword.kwlist + no_alias_magics:
383 no_alias[key] = 1
383 no_alias[key] = 1
384 no_alias.update(__builtin__.__dict__)
384 no_alias.update(__builtin__.__dict__)
385 self.no_alias = no_alias
385 self.no_alias = no_alias
386
386
387 # make global variables for user access to these
387 # make global variables for user access to these
388 self.user_ns['_ih'] = self.input_hist
388 self.user_ns['_ih'] = self.input_hist
389 self.user_ns['_oh'] = self.output_hist
389 self.user_ns['_oh'] = self.output_hist
390 self.user_ns['_dh'] = self.dir_hist
390 self.user_ns['_dh'] = self.dir_hist
391
391
392 # user aliases to input and output histories
392 # user aliases to input and output histories
393 self.user_ns['In'] = self.input_hist
393 self.user_ns['In'] = self.input_hist
394 self.user_ns['Out'] = self.output_hist
394 self.user_ns['Out'] = self.output_hist
395
395
396 self.user_ns['_sh'] = IPython.shadowns
396 self.user_ns['_sh'] = IPython.shadowns
397 # Object variable to store code object waiting execution. This is
397 # Object variable to store code object waiting execution. This is
398 # used mainly by the multithreaded shells, but it can come in handy in
398 # used mainly by the multithreaded shells, but it can come in handy in
399 # other situations. No need to use a Queue here, since it's a single
399 # other situations. No need to use a Queue here, since it's a single
400 # item which gets cleared once run.
400 # item which gets cleared once run.
401 self.code_to_run = None
401 self.code_to_run = None
402
402
403 # escapes for automatic behavior on the command line
403 # escapes for automatic behavior on the command line
404 self.ESC_SHELL = '!'
404 self.ESC_SHELL = '!'
405 self.ESC_SH_CAP = '!!'
405 self.ESC_SH_CAP = '!!'
406 self.ESC_HELP = '?'
406 self.ESC_HELP = '?'
407 self.ESC_MAGIC = '%'
407 self.ESC_MAGIC = '%'
408 self.ESC_QUOTE = ','
408 self.ESC_QUOTE = ','
409 self.ESC_QUOTE2 = ';'
409 self.ESC_QUOTE2 = ';'
410 self.ESC_PAREN = '/'
410 self.ESC_PAREN = '/'
411
411
412 # And their associated handlers
412 # And their associated handlers
413 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
413 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
414 self.ESC_QUOTE : self.handle_auto,
414 self.ESC_QUOTE : self.handle_auto,
415 self.ESC_QUOTE2 : self.handle_auto,
415 self.ESC_QUOTE2 : self.handle_auto,
416 self.ESC_MAGIC : self.handle_magic,
416 self.ESC_MAGIC : self.handle_magic,
417 self.ESC_HELP : self.handle_help,
417 self.ESC_HELP : self.handle_help,
418 self.ESC_SHELL : self.handle_shell_escape,
418 self.ESC_SHELL : self.handle_shell_escape,
419 self.ESC_SH_CAP : self.handle_shell_escape,
419 self.ESC_SH_CAP : self.handle_shell_escape,
420 }
420 }
421
421
422 # class initializations
422 # class initializations
423 Magic.__init__(self,self)
423 Magic.__init__(self,self)
424
424
425 # Python source parser/formatter for syntax highlighting
425 # Python source parser/formatter for syntax highlighting
426 pyformat = PyColorize.Parser().format
426 pyformat = PyColorize.Parser().format
427 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
427 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
428
428
429 # hooks holds pointers used for user-side customizations
429 # hooks holds pointers used for user-side customizations
430 self.hooks = Struct()
430 self.hooks = Struct()
431
431
432 self.strdispatchers = {}
432 self.strdispatchers = {}
433
433
434 # Set all default hooks, defined in the IPython.hooks module.
434 # Set all default hooks, defined in the IPython.hooks module.
435 hooks = IPython.hooks
435 hooks = IPython.hooks
436 for hook_name in hooks.__all__:
436 for hook_name in hooks.__all__:
437 # default hooks have priority 100, i.e. low; user hooks should have
437 # default hooks have priority 100, i.e. low; user hooks should have
438 # 0-100 priority
438 # 0-100 priority
439 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
439 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
440 #print "bound hook",hook_name
440 #print "bound hook",hook_name
441
441
442 # Flag to mark unconditional exit
442 # Flag to mark unconditional exit
443 self.exit_now = False
443 self.exit_now = False
444
444
445 self.usage_min = """\
445 self.usage_min = """\
446 An enhanced console for Python.
446 An enhanced console for Python.
447 Some of its features are:
447 Some of its features are:
448 - Readline support if the readline library is present.
448 - Readline support if the readline library is present.
449 - Tab completion in the local namespace.
449 - Tab completion in the local namespace.
450 - Logging of input, see command-line options.
450 - Logging of input, see command-line options.
451 - System shell escape via ! , eg !ls.
451 - System shell escape via ! , eg !ls.
452 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
452 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
453 - Keeps track of locally defined variables via %who, %whos.
453 - Keeps track of locally defined variables via %who, %whos.
454 - Show object information with a ? eg ?x or x? (use ?? for more info).
454 - Show object information with a ? eg ?x or x? (use ?? for more info).
455 """
455 """
456 if usage: self.usage = usage
456 if usage: self.usage = usage
457 else: self.usage = self.usage_min
457 else: self.usage = self.usage_min
458
458
459 # Storage
459 # Storage
460 self.rc = rc # This will hold all configuration information
460 self.rc = rc # This will hold all configuration information
461 self.pager = 'less'
461 self.pager = 'less'
462 # temporary files used for various purposes. Deleted at exit.
462 # temporary files used for various purposes. Deleted at exit.
463 self.tempfiles = []
463 self.tempfiles = []
464
464
465 # Keep track of readline usage (later set by init_readline)
465 # Keep track of readline usage (later set by init_readline)
466 self.has_readline = False
466 self.has_readline = False
467
467
468 # template for logfile headers. It gets resolved at runtime by the
468 # template for logfile headers. It gets resolved at runtime by the
469 # logstart method.
469 # logstart method.
470 self.loghead_tpl = \
470 self.loghead_tpl = \
471 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
471 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
472 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
472 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
473 #log# opts = %s
473 #log# opts = %s
474 #log# args = %s
474 #log# args = %s
475 #log# It is safe to make manual edits below here.
475 #log# It is safe to make manual edits below here.
476 #log#-----------------------------------------------------------------------
476 #log#-----------------------------------------------------------------------
477 """
477 """
478 # for pushd/popd management
478 # for pushd/popd management
479 try:
479 try:
480 self.home_dir = get_home_dir()
480 self.home_dir = get_home_dir()
481 except HomeDirError,msg:
481 except HomeDirError,msg:
482 fatal(msg)
482 fatal(msg)
483
483
484 self.dir_stack = []
484 self.dir_stack = []
485
485
486 # Functions to call the underlying shell.
486 # Functions to call the underlying shell.
487
487
488 # The first is similar to os.system, but it doesn't return a value,
488 # The first is similar to os.system, but it doesn't return a value,
489 # and it allows interpolation of variables in the user's namespace.
489 # and it allows interpolation of variables in the user's namespace.
490 self.system = lambda cmd: \
490 self.system = lambda cmd: \
491 self.hooks.shell_hook(self.var_expand(cmd,depth=2))
491 self.hooks.shell_hook(self.var_expand(cmd,depth=2))
492
492
493 # These are for getoutput and getoutputerror:
493 # These are for getoutput and getoutputerror:
494 self.getoutput = lambda cmd: \
494 self.getoutput = lambda cmd: \
495 getoutput(self.var_expand(cmd,depth=2),
495 getoutput(self.var_expand(cmd,depth=2),
496 header=self.rc.system_header,
496 header=self.rc.system_header,
497 verbose=self.rc.system_verbose)
497 verbose=self.rc.system_verbose)
498
498
499 self.getoutputerror = lambda cmd: \
499 self.getoutputerror = lambda cmd: \
500 getoutputerror(self.var_expand(cmd,depth=2),
500 getoutputerror(self.var_expand(cmd,depth=2),
501 header=self.rc.system_header,
501 header=self.rc.system_header,
502 verbose=self.rc.system_verbose)
502 verbose=self.rc.system_verbose)
503
503
504
504
505 # keep track of where we started running (mainly for crash post-mortem)
505 # keep track of where we started running (mainly for crash post-mortem)
506 self.starting_dir = os.getcwd()
506 self.starting_dir = os.getcwd()
507
507
508 # Various switches which can be set
508 # Various switches which can be set
509 self.CACHELENGTH = 5000 # this is cheap, it's just text
509 self.CACHELENGTH = 5000 # this is cheap, it's just text
510 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
510 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
511 self.banner2 = banner2
511 self.banner2 = banner2
512
512
513 # TraceBack handlers:
513 # TraceBack handlers:
514
514
515 # Syntax error handler.
515 # Syntax error handler.
516 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
516 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
517
517
518 # The interactive one is initialized with an offset, meaning we always
518 # The interactive one is initialized with an offset, meaning we always
519 # want to remove the topmost item in the traceback, which is our own
519 # want to remove the topmost item in the traceback, which is our own
520 # internal code. Valid modes: ['Plain','Context','Verbose']
520 # internal code. Valid modes: ['Plain','Context','Verbose']
521 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
521 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
522 color_scheme='NoColor',
522 color_scheme='NoColor',
523 tb_offset = 1)
523 tb_offset = 1)
524
524
525 # IPython itself shouldn't crash. This will produce a detailed
525 # IPython itself shouldn't crash. This will produce a detailed
526 # post-mortem if it does. But we only install the crash handler for
526 # post-mortem if it does. But we only install the crash handler for
527 # non-threaded shells, the threaded ones use a normal verbose reporter
527 # non-threaded shells, the threaded ones use a normal verbose reporter
528 # and lose the crash handler. This is because exceptions in the main
528 # and lose the crash handler. This is because exceptions in the main
529 # thread (such as in GUI code) propagate directly to sys.excepthook,
529 # thread (such as in GUI code) propagate directly to sys.excepthook,
530 # and there's no point in printing crash dumps for every user exception.
530 # and there's no point in printing crash dumps for every user exception.
531 if self.isthreaded:
531 if self.isthreaded:
532 ipCrashHandler = ultraTB.FormattedTB()
532 ipCrashHandler = ultraTB.FormattedTB()
533 else:
533 else:
534 from IPython import CrashHandler
534 from IPython import CrashHandler
535 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
535 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
536 self.set_crash_handler(ipCrashHandler)
536 self.set_crash_handler(ipCrashHandler)
537
537
538 # and add any custom exception handlers the user may have specified
538 # and add any custom exception handlers the user may have specified
539 self.set_custom_exc(*custom_exceptions)
539 self.set_custom_exc(*custom_exceptions)
540
540
541 # indentation management
541 # indentation management
542 self.autoindent = False
542 self.autoindent = False
543 self.indent_current_nsp = 0
543 self.indent_current_nsp = 0
544
544
545 # Make some aliases automatically
545 # Make some aliases automatically
546 # Prepare list of shell aliases to auto-define
546 # Prepare list of shell aliases to auto-define
547 if os.name == 'posix':
547 if os.name == 'posix':
548 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
548 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
549 'mv mv -i','rm rm -i','cp cp -i',
549 'mv mv -i','rm rm -i','cp cp -i',
550 'cat cat','less less','clear clear',
550 'cat cat','less less','clear clear',
551 # a better ls
551 # a better ls
552 'ls ls -F',
552 'ls ls -F',
553 # long ls
553 # long ls
554 'll ls -lF')
554 'll ls -lF')
555 # Extra ls aliases with color, which need special treatment on BSD
555 # Extra ls aliases with color, which need special treatment on BSD
556 # variants
556 # variants
557 ls_extra = ( # color ls
557 ls_extra = ( # color ls
558 'lc ls -F -o --color',
558 'lc ls -F -o --color',
559 # ls normal files only
559 # ls normal files only
560 'lf ls -F -o --color %l | grep ^-',
560 'lf ls -F -o --color %l | grep ^-',
561 # ls symbolic links
561 # ls symbolic links
562 'lk ls -F -o --color %l | grep ^l',
562 'lk ls -F -o --color %l | grep ^l',
563 # directories or links to directories,
563 # directories or links to directories,
564 'ldir ls -F -o --color %l | grep /$',
564 'ldir ls -F -o --color %l | grep /$',
565 # things which are executable
565 # things which are executable
566 'lx ls -F -o --color %l | grep ^-..x',
566 'lx ls -F -o --color %l | grep ^-..x',
567 )
567 )
568 # The BSDs don't ship GNU ls, so they don't understand the
568 # The BSDs don't ship GNU ls, so they don't understand the
569 # --color switch out of the box
569 # --color switch out of the box
570 if 'bsd' in sys.platform:
570 if 'bsd' in sys.platform:
571 ls_extra = ( # ls normal files only
571 ls_extra = ( # ls normal files only
572 'lf ls -lF | grep ^-',
572 'lf ls -lF | grep ^-',
573 # ls symbolic links
573 # ls symbolic links
574 'lk ls -lF | grep ^l',
574 'lk ls -lF | grep ^l',
575 # directories or links to directories,
575 # directories or links to directories,
576 'ldir ls -lF | grep /$',
576 'ldir ls -lF | grep /$',
577 # things which are executable
577 # things which are executable
578 'lx ls -lF | grep ^-..x',
578 'lx ls -lF | grep ^-..x',
579 )
579 )
580 auto_alias = auto_alias + ls_extra
580 auto_alias = auto_alias + ls_extra
581 elif os.name in ['nt','dos']:
581 elif os.name in ['nt','dos']:
582 auto_alias = ('ls dir /on',
582 auto_alias = ('ls dir /on',
583 'ddir dir /ad /on', 'ldir dir /ad /on',
583 'ddir dir /ad /on', 'ldir dir /ad /on',
584 'mkdir mkdir','rmdir rmdir','echo echo',
584 'mkdir mkdir','rmdir rmdir','echo echo',
585 'ren ren','cls cls','copy copy')
585 'ren ren','cls cls','copy copy')
586 else:
586 else:
587 auto_alias = ()
587 auto_alias = ()
588 self.auto_alias = [s.split(None,1) for s in auto_alias]
588 self.auto_alias = [s.split(None,1) for s in auto_alias]
589
589
590
590
591 # Produce a public API instance
591 # Produce a public API instance
592 self.api = IPython.ipapi.IPApi(self)
592 self.api = IPython.ipapi.IPApi(self)
593
593
594 # Call the actual (public) initializer
594 # Call the actual (public) initializer
595 self.init_auto_alias()
595 self.init_auto_alias()
596
596
597 # track which builtins we add, so we can clean up later
597 # track which builtins we add, so we can clean up later
598 self.builtins_added = {}
598 self.builtins_added = {}
599 # This method will add the necessary builtins for operation, but
599 # This method will add the necessary builtins for operation, but
600 # tracking what it did via the builtins_added dict.
600 # tracking what it did via the builtins_added dict.
601
601
602 #TODO: remove this, redundant
602 #TODO: remove this, redundant
603 self.add_builtins()
603 self.add_builtins()
604
604
605
605
606
606
607
607
608 # end __init__
608 # end __init__
609
609
610 def var_expand(self,cmd,depth=0):
610 def var_expand(self,cmd,depth=0):
611 """Expand python variables in a string.
611 """Expand python variables in a string.
612
612
613 The depth argument indicates how many frames above the caller should
613 The depth argument indicates how many frames above the caller should
614 be walked to look for the local namespace where to expand variables.
614 be walked to look for the local namespace where to expand variables.
615
615
616 The global namespace for expansion is always the user's interactive
616 The global namespace for expansion is always the user's interactive
617 namespace.
617 namespace.
618 """
618 """
619
619
620 return str(ItplNS(cmd,
620 return str(ItplNS(cmd,
621 self.user_ns, # globals
621 self.user_ns, # globals
622 # Skip our own frame in searching for locals:
622 # Skip our own frame in searching for locals:
623 sys._getframe(depth+1).f_locals # locals
623 sys._getframe(depth+1).f_locals # locals
624 ))
624 ))
625
625
626 def pre_config_initialization(self):
626 def pre_config_initialization(self):
627 """Pre-configuration init method
627 """Pre-configuration init method
628
628
629 This is called before the configuration files are processed to
629 This is called before the configuration files are processed to
630 prepare the services the config files might need.
630 prepare the services the config files might need.
631
631
632 self.rc already has reasonable default values at this point.
632 self.rc already has reasonable default values at this point.
633 """
633 """
634 rc = self.rc
634 rc = self.rc
635 try:
635 try:
636 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
636 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
637 except exceptions.UnicodeDecodeError:
637 except exceptions.UnicodeDecodeError:
638 print "Your ipythondir can't be decoded to unicode!"
638 print "Your ipythondir can't be decoded to unicode!"
639 print "Please set HOME environment variable to something that"
639 print "Please set HOME environment variable to something that"
640 print r"only has ASCII characters, e.g. c:\home"
640 print r"only has ASCII characters, e.g. c:\home"
641 print "Now it is",rc.ipythondir
641 print "Now it is",rc.ipythondir
642 sys.exit()
642 sys.exit()
643 self.shadowhist = IPython.history.ShadowHist(self.db)
643 self.shadowhist = IPython.history.ShadowHist(self.db)
644
644
645
645
646 def post_config_initialization(self):
646 def post_config_initialization(self):
647 """Post configuration init method
647 """Post configuration init method
648
648
649 This is called after the configuration files have been processed to
649 This is called after the configuration files have been processed to
650 'finalize' the initialization."""
650 'finalize' the initialization."""
651
651
652 rc = self.rc
652 rc = self.rc
653
653
654 # Object inspector
654 # Object inspector
655 self.inspector = OInspect.Inspector(OInspect.InspectColors,
655 self.inspector = OInspect.Inspector(OInspect.InspectColors,
656 PyColorize.ANSICodeColors,
656 PyColorize.ANSICodeColors,
657 'NoColor',
657 'NoColor',
658 rc.object_info_string_level)
658 rc.object_info_string_level)
659
659
660 self.rl_next_input = None
660 self.rl_next_input = None
661 self.rl_do_indent = False
661 self.rl_do_indent = False
662 # Load readline proper
662 # Load readline proper
663 if rc.readline:
663 if rc.readline:
664 self.init_readline()
664 self.init_readline()
665
665
666
666
667 # local shortcut, this is used a LOT
667 # local shortcut, this is used a LOT
668 self.log = self.logger.log
668 self.log = self.logger.log
669
669
670 # Initialize cache, set in/out prompts and printing system
670 # Initialize cache, set in/out prompts and printing system
671 self.outputcache = CachedOutput(self,
671 self.outputcache = CachedOutput(self,
672 rc.cache_size,
672 rc.cache_size,
673 rc.pprint,
673 rc.pprint,
674 input_sep = rc.separate_in,
674 input_sep = rc.separate_in,
675 output_sep = rc.separate_out,
675 output_sep = rc.separate_out,
676 output_sep2 = rc.separate_out2,
676 output_sep2 = rc.separate_out2,
677 ps1 = rc.prompt_in1,
677 ps1 = rc.prompt_in1,
678 ps2 = rc.prompt_in2,
678 ps2 = rc.prompt_in2,
679 ps_out = rc.prompt_out,
679 ps_out = rc.prompt_out,
680 pad_left = rc.prompts_pad_left)
680 pad_left = rc.prompts_pad_left)
681
681
682 # user may have over-ridden the default print hook:
682 # user may have over-ridden the default print hook:
683 try:
683 try:
684 self.outputcache.__class__.display = self.hooks.display
684 self.outputcache.__class__.display = self.hooks.display
685 except AttributeError:
685 except AttributeError:
686 pass
686 pass
687
687
688 # I don't like assigning globally to sys, because it means when
688 # I don't like assigning globally to sys, because it means when
689 # embedding instances, each embedded instance overrides the previous
689 # embedding instances, each embedded instance overrides the previous
690 # choice. But sys.displayhook seems to be called internally by exec,
690 # choice. But sys.displayhook seems to be called internally by exec,
691 # so I don't see a way around it. We first save the original and then
691 # so I don't see a way around it. We first save the original and then
692 # overwrite it.
692 # overwrite it.
693 self.sys_displayhook = sys.displayhook
693 self.sys_displayhook = sys.displayhook
694 sys.displayhook = self.outputcache
694 sys.displayhook = self.outputcache
695
695
696 # Do a proper resetting of doctest, including the necessary displayhook
696 # Do a proper resetting of doctest, including the necessary displayhook
697 # monkeypatching
697 # monkeypatching
698 try:
698 try:
699 doctest_reload()
699 doctest_reload()
700 except ImportError:
700 except ImportError:
701 warn("doctest module does not exist.")
701 warn("doctest module does not exist.")
702
702
703 # Set user colors (don't do it in the constructor above so that it
703 # Set user colors (don't do it in the constructor above so that it
704 # doesn't crash if colors option is invalid)
704 # doesn't crash if colors option is invalid)
705 self.magic_colors(rc.colors)
705 self.magic_colors(rc.colors)
706
706
707 # Set calling of pdb on exceptions
707 # Set calling of pdb on exceptions
708 self.call_pdb = rc.pdb
708 self.call_pdb = rc.pdb
709
709
710 # Load user aliases
710 # Load user aliases
711 for alias in rc.alias:
711 for alias in rc.alias:
712 self.magic_alias(alias)
712 self.magic_alias(alias)
713
713
714 self.hooks.late_startup_hook()
714 self.hooks.late_startup_hook()
715
715
716 for cmd in self.rc.autoexec:
716 for cmd in self.rc.autoexec:
717 #print "autoexec>",cmd #dbg
717 #print "autoexec>",cmd #dbg
718 self.api.runlines(cmd)
718 self.api.runlines(cmd)
719
719
720 batchrun = False
720 batchrun = False
721 for batchfile in [path(arg) for arg in self.rc.args
721 for batchfile in [path(arg) for arg in self.rc.args
722 if arg.lower().endswith('.ipy')]:
722 if arg.lower().endswith('.ipy')]:
723 if not batchfile.isfile():
723 if not batchfile.isfile():
724 print "No such batch file:", batchfile
724 print "No such batch file:", batchfile
725 continue
725 continue
726 self.api.runlines(batchfile.text())
726 self.api.runlines(batchfile.text())
727 batchrun = True
727 batchrun = True
728 # without -i option, exit after running the batch file
728 # without -i option, exit after running the batch file
729 if batchrun and not self.rc.interact:
729 if batchrun and not self.rc.interact:
730 self.ask_exit()
730 self.ask_exit()
731
731
732 def add_builtins(self):
732 def add_builtins(self):
733 """Store ipython references into the builtin namespace.
733 """Store ipython references into the builtin namespace.
734
734
735 Some parts of ipython operate via builtins injected here, which hold a
735 Some parts of ipython operate via builtins injected here, which hold a
736 reference to IPython itself."""
736 reference to IPython itself."""
737
737
738 # TODO: deprecate all of these, they are unsafe
738 # TODO: deprecate all of these, they are unsafe
739 builtins_new = dict(__IPYTHON__ = self,
739 builtins_new = dict(__IPYTHON__ = self,
740 ip_set_hook = self.set_hook,
740 ip_set_hook = self.set_hook,
741 jobs = self.jobs,
741 jobs = self.jobs,
742 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
742 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
743 ipalias = wrap_deprecated(self.ipalias),
743 ipalias = wrap_deprecated(self.ipalias),
744 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
744 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
745 #_ip = self.api
745 #_ip = self.api
746 )
746 )
747 for biname,bival in builtins_new.items():
747 for biname,bival in builtins_new.items():
748 try:
748 try:
749 # store the orignal value so we can restore it
749 # store the orignal value so we can restore it
750 self.builtins_added[biname] = __builtin__.__dict__[biname]
750 self.builtins_added[biname] = __builtin__.__dict__[biname]
751 except KeyError:
751 except KeyError:
752 # or mark that it wasn't defined, and we'll just delete it at
752 # or mark that it wasn't defined, and we'll just delete it at
753 # cleanup
753 # cleanup
754 self.builtins_added[biname] = Undefined
754 self.builtins_added[biname] = Undefined
755 __builtin__.__dict__[biname] = bival
755 __builtin__.__dict__[biname] = bival
756
756
757 # Keep in the builtins a flag for when IPython is active. We set it
757 # Keep in the builtins a flag for when IPython is active. We set it
758 # with setdefault so that multiple nested IPythons don't clobber one
758 # with setdefault so that multiple nested IPythons don't clobber one
759 # another. Each will increase its value by one upon being activated,
759 # another. Each will increase its value by one upon being activated,
760 # which also gives us a way to determine the nesting level.
760 # which also gives us a way to determine the nesting level.
761 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
761 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
762
762
763 def clean_builtins(self):
763 def clean_builtins(self):
764 """Remove any builtins which might have been added by add_builtins, or
764 """Remove any builtins which might have been added by add_builtins, or
765 restore overwritten ones to their previous values."""
765 restore overwritten ones to their previous values."""
766 for biname,bival in self.builtins_added.items():
766 for biname,bival in self.builtins_added.items():
767 if bival is Undefined:
767 if bival is Undefined:
768 del __builtin__.__dict__[biname]
768 del __builtin__.__dict__[biname]
769 else:
769 else:
770 __builtin__.__dict__[biname] = bival
770 __builtin__.__dict__[biname] = bival
771 self.builtins_added.clear()
771 self.builtins_added.clear()
772
772
773 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
773 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
774 """set_hook(name,hook) -> sets an internal IPython hook.
774 """set_hook(name,hook) -> sets an internal IPython hook.
775
775
776 IPython exposes some of its internal API as user-modifiable hooks. By
776 IPython exposes some of its internal API as user-modifiable hooks. By
777 adding your function to one of these hooks, you can modify IPython's
777 adding your function to one of these hooks, you can modify IPython's
778 behavior to call at runtime your own routines."""
778 behavior to call at runtime your own routines."""
779
779
780 # At some point in the future, this should validate the hook before it
780 # At some point in the future, this should validate the hook before it
781 # accepts it. Probably at least check that the hook takes the number
781 # accepts it. Probably at least check that the hook takes the number
782 # of args it's supposed to.
782 # of args it's supposed to.
783
783
784 f = new.instancemethod(hook,self,self.__class__)
784 f = new.instancemethod(hook,self,self.__class__)
785
785
786 # check if the hook is for strdispatcher first
786 # check if the hook is for strdispatcher first
787 if str_key is not None:
787 if str_key is not None:
788 sdp = self.strdispatchers.get(name, StrDispatch())
788 sdp = self.strdispatchers.get(name, StrDispatch())
789 sdp.add_s(str_key, f, priority )
789 sdp.add_s(str_key, f, priority )
790 self.strdispatchers[name] = sdp
790 self.strdispatchers[name] = sdp
791 return
791 return
792 if re_key is not None:
792 if re_key is not None:
793 sdp = self.strdispatchers.get(name, StrDispatch())
793 sdp = self.strdispatchers.get(name, StrDispatch())
794 sdp.add_re(re.compile(re_key), f, priority )
794 sdp.add_re(re.compile(re_key), f, priority )
795 self.strdispatchers[name] = sdp
795 self.strdispatchers[name] = sdp
796 return
796 return
797
797
798 dp = getattr(self.hooks, name, None)
798 dp = getattr(self.hooks, name, None)
799 if name not in IPython.hooks.__all__:
799 if name not in IPython.hooks.__all__:
800 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
800 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
801 if not dp:
801 if not dp:
802 dp = IPython.hooks.CommandChainDispatcher()
802 dp = IPython.hooks.CommandChainDispatcher()
803
803
804 try:
804 try:
805 dp.add(f,priority)
805 dp.add(f,priority)
806 except AttributeError:
806 except AttributeError:
807 # it was not commandchain, plain old func - replace
807 # it was not commandchain, plain old func - replace
808 dp = f
808 dp = f
809
809
810 setattr(self.hooks,name, dp)
810 setattr(self.hooks,name, dp)
811
811
812
812
813 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
813 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
814
814
815 def set_crash_handler(self,crashHandler):
815 def set_crash_handler(self,crashHandler):
816 """Set the IPython crash handler.
816 """Set the IPython crash handler.
817
817
818 This must be a callable with a signature suitable for use as
818 This must be a callable with a signature suitable for use as
819 sys.excepthook."""
819 sys.excepthook."""
820
820
821 # Install the given crash handler as the Python exception hook
821 # Install the given crash handler as the Python exception hook
822 sys.excepthook = crashHandler
822 sys.excepthook = crashHandler
823
823
824 # The instance will store a pointer to this, so that runtime code
824 # The instance will store a pointer to this, so that runtime code
825 # (such as magics) can access it. This is because during the
825 # (such as magics) can access it. This is because during the
826 # read-eval loop, it gets temporarily overwritten (to deal with GUI
826 # read-eval loop, it gets temporarily overwritten (to deal with GUI
827 # frameworks).
827 # frameworks).
828 self.sys_excepthook = sys.excepthook
828 self.sys_excepthook = sys.excepthook
829
829
830
830
831 def set_custom_exc(self,exc_tuple,handler):
831 def set_custom_exc(self,exc_tuple,handler):
832 """set_custom_exc(exc_tuple,handler)
832 """set_custom_exc(exc_tuple,handler)
833
833
834 Set a custom exception handler, which will be called if any of the
834 Set a custom exception handler, which will be called if any of the
835 exceptions in exc_tuple occur in the mainloop (specifically, in the
835 exceptions in exc_tuple occur in the mainloop (specifically, in the
836 runcode() method.
836 runcode() method.
837
837
838 Inputs:
838 Inputs:
839
839
840 - exc_tuple: a *tuple* of valid exceptions to call the defined
840 - exc_tuple: a *tuple* of valid exceptions to call the defined
841 handler for. It is very important that you use a tuple, and NOT A
841 handler for. It is very important that you use a tuple, and NOT A
842 LIST here, because of the way Python's except statement works. If
842 LIST here, because of the way Python's except statement works. If
843 you only want to trap a single exception, use a singleton tuple:
843 you only want to trap a single exception, use a singleton tuple:
844
844
845 exc_tuple == (MyCustomException,)
845 exc_tuple == (MyCustomException,)
846
846
847 - handler: this must be defined as a function with the following
847 - handler: this must be defined as a function with the following
848 basic interface: def my_handler(self,etype,value,tb).
848 basic interface: def my_handler(self,etype,value,tb).
849
849
850 This will be made into an instance method (via new.instancemethod)
850 This will be made into an instance method (via new.instancemethod)
851 of IPython itself, and it will be called if any of the exceptions
851 of IPython itself, and it will be called if any of the exceptions
852 listed in the exc_tuple are caught. If the handler is None, an
852 listed in the exc_tuple are caught. If the handler is None, an
853 internal basic one is used, which just prints basic info.
853 internal basic one is used, which just prints basic info.
854
854
855 WARNING: by putting in your own exception handler into IPython's main
855 WARNING: by putting in your own exception handler into IPython's main
856 execution loop, you run a very good chance of nasty crashes. This
856 execution loop, you run a very good chance of nasty crashes. This
857 facility should only be used if you really know what you are doing."""
857 facility should only be used if you really know what you are doing."""
858
858
859 assert type(exc_tuple)==type(()) , \
859 assert type(exc_tuple)==type(()) , \
860 "The custom exceptions must be given AS A TUPLE."
860 "The custom exceptions must be given AS A TUPLE."
861
861
862 def dummy_handler(self,etype,value,tb):
862 def dummy_handler(self,etype,value,tb):
863 print '*** Simple custom exception handler ***'
863 print '*** Simple custom exception handler ***'
864 print 'Exception type :',etype
864 print 'Exception type :',etype
865 print 'Exception value:',value
865 print 'Exception value:',value
866 print 'Traceback :',tb
866 print 'Traceback :',tb
867 print 'Source code :','\n'.join(self.buffer)
867 print 'Source code :','\n'.join(self.buffer)
868
868
869 if handler is None: handler = dummy_handler
869 if handler is None: handler = dummy_handler
870
870
871 self.CustomTB = new.instancemethod(handler,self,self.__class__)
871 self.CustomTB = new.instancemethod(handler,self,self.__class__)
872 self.custom_exceptions = exc_tuple
872 self.custom_exceptions = exc_tuple
873
873
874 def set_custom_completer(self,completer,pos=0):
874 def set_custom_completer(self,completer,pos=0):
875 """set_custom_completer(completer,pos=0)
875 """set_custom_completer(completer,pos=0)
876
876
877 Adds a new custom completer function.
877 Adds a new custom completer function.
878
878
879 The position argument (defaults to 0) is the index in the completers
879 The position argument (defaults to 0) is the index in the completers
880 list where you want the completer to be inserted."""
880 list where you want the completer to be inserted."""
881
881
882 newcomp = new.instancemethod(completer,self.Completer,
882 newcomp = new.instancemethod(completer,self.Completer,
883 self.Completer.__class__)
883 self.Completer.__class__)
884 self.Completer.matchers.insert(pos,newcomp)
884 self.Completer.matchers.insert(pos,newcomp)
885
885
886 def set_completer(self):
886 def set_completer(self):
887 """reset readline's completer to be our own."""
887 """reset readline's completer to be our own."""
888 self.readline.set_completer(self.Completer.complete)
888 self.readline.set_completer(self.Completer.complete)
889
889
890 def _get_call_pdb(self):
890 def _get_call_pdb(self):
891 return self._call_pdb
891 return self._call_pdb
892
892
893 def _set_call_pdb(self,val):
893 def _set_call_pdb(self,val):
894
894
895 if val not in (0,1,False,True):
895 if val not in (0,1,False,True):
896 raise ValueError,'new call_pdb value must be boolean'
896 raise ValueError,'new call_pdb value must be boolean'
897
897
898 # store value in instance
898 # store value in instance
899 self._call_pdb = val
899 self._call_pdb = val
900
900
901 # notify the actual exception handlers
901 # notify the actual exception handlers
902 self.InteractiveTB.call_pdb = val
902 self.InteractiveTB.call_pdb = val
903 if self.isthreaded:
903 if self.isthreaded:
904 try:
904 try:
905 self.sys_excepthook.call_pdb = val
905 self.sys_excepthook.call_pdb = val
906 except:
906 except:
907 warn('Failed to activate pdb for threaded exception handler')
907 warn('Failed to activate pdb for threaded exception handler')
908
908
909 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
909 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
910 'Control auto-activation of pdb at exceptions')
910 'Control auto-activation of pdb at exceptions')
911
911
912
912
913 # These special functions get installed in the builtin namespace, to
913 # These special functions get installed in the builtin namespace, to
914 # provide programmatic (pure python) access to magics, aliases and system
914 # provide programmatic (pure python) access to magics, aliases and system
915 # calls. This is important for logging, user scripting, and more.
915 # calls. This is important for logging, user scripting, and more.
916
916
917 # We are basically exposing, via normal python functions, the three
917 # We are basically exposing, via normal python functions, the three
918 # mechanisms in which ipython offers special call modes (magics for
918 # mechanisms in which ipython offers special call modes (magics for
919 # internal control, aliases for direct system access via pre-selected
919 # internal control, aliases for direct system access via pre-selected
920 # names, and !cmd for calling arbitrary system commands).
920 # names, and !cmd for calling arbitrary system commands).
921
921
922 def ipmagic(self,arg_s):
922 def ipmagic(self,arg_s):
923 """Call a magic function by name.
923 """Call a magic function by name.
924
924
925 Input: a string containing the name of the magic function to call and any
925 Input: a string containing the name of the magic function to call and any
926 additional arguments to be passed to the magic.
926 additional arguments to be passed to the magic.
927
927
928 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
928 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
929 prompt:
929 prompt:
930
930
931 In[1]: %name -opt foo bar
931 In[1]: %name -opt foo bar
932
932
933 To call a magic without arguments, simply use ipmagic('name').
933 To call a magic without arguments, simply use ipmagic('name').
934
934
935 This provides a proper Python function to call IPython's magics in any
935 This provides a proper Python function to call IPython's magics in any
936 valid Python code you can type at the interpreter, including loops and
936 valid Python code you can type at the interpreter, including loops and
937 compound statements. It is added by IPython to the Python builtin
937 compound statements. It is added by IPython to the Python builtin
938 namespace upon initialization."""
938 namespace upon initialization."""
939
939
940 args = arg_s.split(' ',1)
940 args = arg_s.split(' ',1)
941 magic_name = args[0]
941 magic_name = args[0]
942 magic_name = magic_name.lstrip(self.ESC_MAGIC)
942 magic_name = magic_name.lstrip(self.ESC_MAGIC)
943
943
944 try:
944 try:
945 magic_args = args[1]
945 magic_args = args[1]
946 except IndexError:
946 except IndexError:
947 magic_args = ''
947 magic_args = ''
948 fn = getattr(self,'magic_'+magic_name,None)
948 fn = getattr(self,'magic_'+magic_name,None)
949 if fn is None:
949 if fn is None:
950 error("Magic function `%s` not found." % magic_name)
950 error("Magic function `%s` not found." % magic_name)
951 else:
951 else:
952 magic_args = self.var_expand(magic_args,1)
952 magic_args = self.var_expand(magic_args,1)
953 return fn(magic_args)
953 return fn(magic_args)
954
954
955 def ipalias(self,arg_s):
955 def ipalias(self,arg_s):
956 """Call an alias by name.
956 """Call an alias by name.
957
957
958 Input: a string containing the name of the alias to call and any
958 Input: a string containing the name of the alias to call and any
959 additional arguments to be passed to the magic.
959 additional arguments to be passed to the magic.
960
960
961 ipalias('name -opt foo bar') is equivalent to typing at the ipython
961 ipalias('name -opt foo bar') is equivalent to typing at the ipython
962 prompt:
962 prompt:
963
963
964 In[1]: name -opt foo bar
964 In[1]: name -opt foo bar
965
965
966 To call an alias without arguments, simply use ipalias('name').
966 To call an alias without arguments, simply use ipalias('name').
967
967
968 This provides a proper Python function to call IPython's aliases in any
968 This provides a proper Python function to call IPython's aliases in any
969 valid Python code you can type at the interpreter, including loops and
969 valid Python code you can type at the interpreter, including loops and
970 compound statements. It is added by IPython to the Python builtin
970 compound statements. It is added by IPython to the Python builtin
971 namespace upon initialization."""
971 namespace upon initialization."""
972
972
973 args = arg_s.split(' ',1)
973 args = arg_s.split(' ',1)
974 alias_name = args[0]
974 alias_name = args[0]
975 try:
975 try:
976 alias_args = args[1]
976 alias_args = args[1]
977 except IndexError:
977 except IndexError:
978 alias_args = ''
978 alias_args = ''
979 if alias_name in self.alias_table:
979 if alias_name in self.alias_table:
980 self.call_alias(alias_name,alias_args)
980 self.call_alias(alias_name,alias_args)
981 else:
981 else:
982 error("Alias `%s` not found." % alias_name)
982 error("Alias `%s` not found." % alias_name)
983
983
984 def ipsystem(self,arg_s):
984 def ipsystem(self,arg_s):
985 """Make a system call, using IPython."""
985 """Make a system call, using IPython."""
986
986
987 self.system(arg_s)
987 self.system(arg_s)
988
988
989 def complete(self,text):
989 def complete(self,text):
990 """Return a sorted list of all possible completions on text.
990 """Return a sorted list of all possible completions on text.
991
991
992 Inputs:
992 Inputs:
993
993
994 - text: a string of text to be completed on.
994 - text: a string of text to be completed on.
995
995
996 This is a wrapper around the completion mechanism, similar to what
996 This is a wrapper around the completion mechanism, similar to what
997 readline does at the command line when the TAB key is hit. By
997 readline does at the command line when the TAB key is hit. By
998 exposing it as a method, it can be used by other non-readline
998 exposing it as a method, it can be used by other non-readline
999 environments (such as GUIs) for text completion.
999 environments (such as GUIs) for text completion.
1000
1000
1001 Simple usage example:
1001 Simple usage example:
1002
1002
1003 In [7]: x = 'hello'
1003 In [7]: x = 'hello'
1004
1004
1005 In [8]: x
1005 In [8]: x
1006 Out[8]: 'hello'
1006 Out[8]: 'hello'
1007
1007
1008 In [9]: print x
1008 In [9]: print x
1009 hello
1009 hello
1010
1010
1011 In [10]: _ip.IP.complete('x.l')
1011 In [10]: _ip.IP.complete('x.l')
1012 Out[10]: ['x.ljust', 'x.lower', 'x.lstrip']
1012 Out[10]: ['x.ljust', 'x.lower', 'x.lstrip']
1013 """
1013 """
1014
1014
1015 complete = self.Completer.complete
1015 complete = self.Completer.complete
1016 state = 0
1016 state = 0
1017 # use a dict so we get unique keys, since ipyhton's multiple
1017 # use a dict so we get unique keys, since ipyhton's multiple
1018 # completers can return duplicates. When we make 2.4 a requirement,
1018 # completers can return duplicates. When we make 2.4 a requirement,
1019 # start using sets instead, which are faster.
1019 # start using sets instead, which are faster.
1020 comps = {}
1020 comps = {}
1021 while True:
1021 while True:
1022 newcomp = complete(text,state,line_buffer=text)
1022 newcomp = complete(text,state,line_buffer=text)
1023 if newcomp is None:
1023 if newcomp is None:
1024 break
1024 break
1025 comps[newcomp] = 1
1025 comps[newcomp] = 1
1026 state += 1
1026 state += 1
1027 outcomps = comps.keys()
1027 outcomps = comps.keys()
1028 outcomps.sort()
1028 outcomps.sort()
1029 #print "T:",text,"OC:",outcomps # dbg
1029 #print "T:",text,"OC:",outcomps # dbg
1030 #print "vars:",self.user_ns.keys()
1030 #print "vars:",self.user_ns.keys()
1031 return outcomps
1031 return outcomps
1032
1032
1033 def set_completer_frame(self, frame=None):
1033 def set_completer_frame(self, frame=None):
1034 if frame:
1034 if frame:
1035 self.Completer.namespace = frame.f_locals
1035 self.Completer.namespace = frame.f_locals
1036 self.Completer.global_namespace = frame.f_globals
1036 self.Completer.global_namespace = frame.f_globals
1037 else:
1037 else:
1038 self.Completer.namespace = self.user_ns
1038 self.Completer.namespace = self.user_ns
1039 self.Completer.global_namespace = self.user_global_ns
1039 self.Completer.global_namespace = self.user_global_ns
1040
1040
1041 def init_auto_alias(self):
1041 def init_auto_alias(self):
1042 """Define some aliases automatically.
1042 """Define some aliases automatically.
1043
1043
1044 These are ALL parameter-less aliases"""
1044 These are ALL parameter-less aliases"""
1045
1045
1046 for alias,cmd in self.auto_alias:
1046 for alias,cmd in self.auto_alias:
1047 self.getapi().defalias(alias,cmd)
1047 self.getapi().defalias(alias,cmd)
1048
1048
1049
1049
1050 def alias_table_validate(self,verbose=0):
1050 def alias_table_validate(self,verbose=0):
1051 """Update information about the alias table.
1051 """Update information about the alias table.
1052
1052
1053 In particular, make sure no Python keywords/builtins are in it."""
1053 In particular, make sure no Python keywords/builtins are in it."""
1054
1054
1055 no_alias = self.no_alias
1055 no_alias = self.no_alias
1056 for k in self.alias_table.keys():
1056 for k in self.alias_table.keys():
1057 if k in no_alias:
1057 if k in no_alias:
1058 del self.alias_table[k]
1058 del self.alias_table[k]
1059 if verbose:
1059 if verbose:
1060 print ("Deleting alias <%s>, it's a Python "
1060 print ("Deleting alias <%s>, it's a Python "
1061 "keyword or builtin." % k)
1061 "keyword or builtin." % k)
1062
1062
1063 def set_autoindent(self,value=None):
1063 def set_autoindent(self,value=None):
1064 """Set the autoindent flag, checking for readline support.
1064 """Set the autoindent flag, checking for readline support.
1065
1065
1066 If called with no arguments, it acts as a toggle."""
1066 If called with no arguments, it acts as a toggle."""
1067
1067
1068 if not self.has_readline:
1068 if not self.has_readline:
1069 if os.name == 'posix':
1069 if os.name == 'posix':
1070 warn("The auto-indent feature requires the readline library")
1070 warn("The auto-indent feature requires the readline library")
1071 self.autoindent = 0
1071 self.autoindent = 0
1072 return
1072 return
1073 if value is None:
1073 if value is None:
1074 self.autoindent = not self.autoindent
1074 self.autoindent = not self.autoindent
1075 else:
1075 else:
1076 self.autoindent = value
1076 self.autoindent = value
1077
1077
1078 def rc_set_toggle(self,rc_field,value=None):
1078 def rc_set_toggle(self,rc_field,value=None):
1079 """Set or toggle a field in IPython's rc config. structure.
1079 """Set or toggle a field in IPython's rc config. structure.
1080
1080
1081 If called with no arguments, it acts as a toggle.
1081 If called with no arguments, it acts as a toggle.
1082
1082
1083 If called with a non-existent field, the resulting AttributeError
1083 If called with a non-existent field, the resulting AttributeError
1084 exception will propagate out."""
1084 exception will propagate out."""
1085
1085
1086 rc_val = getattr(self.rc,rc_field)
1086 rc_val = getattr(self.rc,rc_field)
1087 if value is None:
1087 if value is None:
1088 value = not rc_val
1088 value = not rc_val
1089 setattr(self.rc,rc_field,value)
1089 setattr(self.rc,rc_field,value)
1090
1090
1091 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1091 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1092 """Install the user configuration directory.
1092 """Install the user configuration directory.
1093
1093
1094 Can be called when running for the first time or to upgrade the user's
1094 Can be called when running for the first time or to upgrade the user's
1095 .ipython/ directory with the mode parameter. Valid modes are 'install'
1095 .ipython/ directory with the mode parameter. Valid modes are 'install'
1096 and 'upgrade'."""
1096 and 'upgrade'."""
1097
1097
1098 def wait():
1098 def wait():
1099 try:
1099 try:
1100 raw_input("Please press <RETURN> to start IPython.")
1100 raw_input("Please press <RETURN> to start IPython.")
1101 except EOFError:
1101 except EOFError:
1102 print >> Term.cout
1102 print >> Term.cout
1103 print '*'*70
1103 print '*'*70
1104
1104
1105 cwd = os.getcwd() # remember where we started
1105 cwd = os.getcwd() # remember where we started
1106 glb = glob.glob
1106 glb = glob.glob
1107 print '*'*70
1107 print '*'*70
1108 if mode == 'install':
1108 if mode == 'install':
1109 print \
1109 print \
1110 """Welcome to IPython. I will try to create a personal configuration directory
1110 """Welcome to IPython. I will try to create a personal configuration directory
1111 where you can customize many aspects of IPython's functionality in:\n"""
1111 where you can customize many aspects of IPython's functionality in:\n"""
1112 else:
1112 else:
1113 print 'I am going to upgrade your configuration in:'
1113 print 'I am going to upgrade your configuration in:'
1114
1114
1115 print ipythondir
1115 print ipythondir
1116
1116
1117 rcdirend = os.path.join('IPython','UserConfig')
1117 rcdirend = os.path.join('IPython','UserConfig')
1118 cfg = lambda d: os.path.join(d,rcdirend)
1118 cfg = lambda d: os.path.join(d,rcdirend)
1119 try:
1119 try:
1120 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1120 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1121 print "Initializing from configuration",rcdir
1121 print "Initializing from configuration",rcdir
1122 except IndexError:
1122 except IndexError:
1123 warning = """
1123 warning = """
1124 Installation error. IPython's directory was not found.
1124 Installation error. IPython's directory was not found.
1125
1125
1126 Check the following:
1126 Check the following:
1127
1127
1128 The ipython/IPython directory should be in a directory belonging to your
1128 The ipython/IPython directory should be in a directory belonging to your
1129 PYTHONPATH environment variable (that is, it should be in a directory
1129 PYTHONPATH environment variable (that is, it should be in a directory
1130 belonging to sys.path). You can copy it explicitly there or just link to it.
1130 belonging to sys.path). You can copy it explicitly there or just link to it.
1131
1131
1132 IPython will create a minimal default configuration for you.
1132 IPython will create a minimal default configuration for you.
1133
1133
1134 """
1134 """
1135 warn(warning)
1135 warn(warning)
1136 wait()
1136 wait()
1137
1137
1138 if sys.platform =='win32':
1138 if sys.platform =='win32':
1139 inif = 'ipythonrc.ini'
1139 inif = 'ipythonrc.ini'
1140 else:
1140 else:
1141 inif = 'ipythonrc'
1141 inif = 'ipythonrc'
1142 minimal_setup = {'ipy_user_conf.py' : 'import ipy_defaults', inif : '# intentionally left blank' }
1142 minimal_setup = {'ipy_user_conf.py' : 'import ipy_defaults', inif : '# intentionally left blank' }
1143 os.makedirs(ipythondir, mode = 0777)
1143 os.makedirs(ipythondir, mode = 0777)
1144 for f, cont in minimal_setup.items():
1144 for f, cont in minimal_setup.items():
1145 open(ipythondir + '/' + f,'w').write(cont)
1145 open(ipythondir + '/' + f,'w').write(cont)
1146
1146
1147 return
1147 return
1148
1148
1149 if mode == 'install':
1149 if mode == 'install':
1150 try:
1150 try:
1151 shutil.copytree(rcdir,ipythondir)
1151 shutil.copytree(rcdir,ipythondir)
1152 os.chdir(ipythondir)
1152 os.chdir(ipythondir)
1153 rc_files = glb("ipythonrc*")
1153 rc_files = glb("ipythonrc*")
1154 for rc_file in rc_files:
1154 for rc_file in rc_files:
1155 os.rename(rc_file,rc_file+rc_suffix)
1155 os.rename(rc_file,rc_file+rc_suffix)
1156 except:
1156 except:
1157 warning = """
1157 warning = """
1158
1158
1159 There was a problem with the installation:
1159 There was a problem with the installation:
1160 %s
1160 %s
1161 Try to correct it or contact the developers if you think it's a bug.
1161 Try to correct it or contact the developers if you think it's a bug.
1162 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1162 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1163 warn(warning)
1163 warn(warning)
1164 wait()
1164 wait()
1165 return
1165 return
1166
1166
1167 elif mode == 'upgrade':
1167 elif mode == 'upgrade':
1168 try:
1168 try:
1169 os.chdir(ipythondir)
1169 os.chdir(ipythondir)
1170 except:
1170 except:
1171 print """
1171 print """
1172 Can not upgrade: changing to directory %s failed. Details:
1172 Can not upgrade: changing to directory %s failed. Details:
1173 %s
1173 %s
1174 """ % (ipythondir,sys.exc_info()[1])
1174 """ % (ipythondir,sys.exc_info()[1])
1175 wait()
1175 wait()
1176 return
1176 return
1177 else:
1177 else:
1178 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1178 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1179 for new_full_path in sources:
1179 for new_full_path in sources:
1180 new_filename = os.path.basename(new_full_path)
1180 new_filename = os.path.basename(new_full_path)
1181 if new_filename.startswith('ipythonrc'):
1181 if new_filename.startswith('ipythonrc'):
1182 new_filename = new_filename + rc_suffix
1182 new_filename = new_filename + rc_suffix
1183 # The config directory should only contain files, skip any
1183 # The config directory should only contain files, skip any
1184 # directories which may be there (like CVS)
1184 # directories which may be there (like CVS)
1185 if os.path.isdir(new_full_path):
1185 if os.path.isdir(new_full_path):
1186 continue
1186 continue
1187 if os.path.exists(new_filename):
1187 if os.path.exists(new_filename):
1188 old_file = new_filename+'.old'
1188 old_file = new_filename+'.old'
1189 if os.path.exists(old_file):
1189 if os.path.exists(old_file):
1190 os.remove(old_file)
1190 os.remove(old_file)
1191 os.rename(new_filename,old_file)
1191 os.rename(new_filename,old_file)
1192 shutil.copy(new_full_path,new_filename)
1192 shutil.copy(new_full_path,new_filename)
1193 else:
1193 else:
1194 raise ValueError,'unrecognized mode for install:',`mode`
1194 raise ValueError,'unrecognized mode for install:',`mode`
1195
1195
1196 # Fix line-endings to those native to each platform in the config
1196 # Fix line-endings to those native to each platform in the config
1197 # directory.
1197 # directory.
1198 try:
1198 try:
1199 os.chdir(ipythondir)
1199 os.chdir(ipythondir)
1200 except:
1200 except:
1201 print """
1201 print """
1202 Problem: changing to directory %s failed.
1202 Problem: changing to directory %s failed.
1203 Details:
1203 Details:
1204 %s
1204 %s
1205
1205
1206 Some configuration files may have incorrect line endings. This should not
1206 Some configuration files may have incorrect line endings. This should not
1207 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1207 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1208 wait()
1208 wait()
1209 else:
1209 else:
1210 for fname in glb('ipythonrc*'):
1210 for fname in glb('ipythonrc*'):
1211 try:
1211 try:
1212 native_line_ends(fname,backup=0)
1212 native_line_ends(fname,backup=0)
1213 except IOError:
1213 except IOError:
1214 pass
1214 pass
1215
1215
1216 if mode == 'install':
1216 if mode == 'install':
1217 print """
1217 print """
1218 Successful installation!
1218 Successful installation!
1219
1219
1220 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1220 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1221 IPython manual (there are both HTML and PDF versions supplied with the
1221 IPython manual (there are both HTML and PDF versions supplied with the
1222 distribution) to make sure that your system environment is properly configured
1222 distribution) to make sure that your system environment is properly configured
1223 to take advantage of IPython's features.
1223 to take advantage of IPython's features.
1224
1224
1225 Important note: the configuration system has changed! The old system is
1225 Important note: the configuration system has changed! The old system is
1226 still in place, but its setting may be partly overridden by the settings in
1226 still in place, but its setting may be partly overridden by the settings in
1227 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1227 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1228 if some of the new settings bother you.
1228 if some of the new settings bother you.
1229
1229
1230 """
1230 """
1231 else:
1231 else:
1232 print """
1232 print """
1233 Successful upgrade!
1233 Successful upgrade!
1234
1234
1235 All files in your directory:
1235 All files in your directory:
1236 %(ipythondir)s
1236 %(ipythondir)s
1237 which would have been overwritten by the upgrade were backed up with a .old
1237 which would have been overwritten by the upgrade were backed up with a .old
1238 extension. If you had made particular customizations in those files you may
1238 extension. If you had made particular customizations in those files you may
1239 want to merge them back into the new files.""" % locals()
1239 want to merge them back into the new files.""" % locals()
1240 wait()
1240 wait()
1241 os.chdir(cwd)
1241 os.chdir(cwd)
1242 # end user_setup()
1242 # end user_setup()
1243
1243
1244 def atexit_operations(self):
1244 def atexit_operations(self):
1245 """This will be executed at the time of exit.
1245 """This will be executed at the time of exit.
1246
1246
1247 Saving of persistent data should be performed here. """
1247 Saving of persistent data should be performed here. """
1248
1248
1249 #print '*** IPython exit cleanup ***' # dbg
1249 #print '*** IPython exit cleanup ***' # dbg
1250 # input history
1250 # input history
1251 self.savehist()
1251 self.savehist()
1252
1252
1253 # Cleanup all tempfiles left around
1253 # Cleanup all tempfiles left around
1254 for tfile in self.tempfiles:
1254 for tfile in self.tempfiles:
1255 try:
1255 try:
1256 os.unlink(tfile)
1256 os.unlink(tfile)
1257 except OSError:
1257 except OSError:
1258 pass
1258 pass
1259
1259
1260 self.hooks.shutdown_hook()
1260 self.hooks.shutdown_hook()
1261
1261
1262 def savehist(self):
1262 def savehist(self):
1263 """Save input history to a file (via readline library)."""
1263 """Save input history to a file (via readline library)."""
1264
1264
1265 if not self.has_readline:
1265 if not self.has_readline:
1266 return
1266 return
1267
1267
1268 try:
1268 try:
1269 self.readline.write_history_file(self.histfile)
1269 self.readline.write_history_file(self.histfile)
1270 except:
1270 except:
1271 print 'Unable to save IPython command history to file: ' + \
1271 print 'Unable to save IPython command history to file: ' + \
1272 `self.histfile`
1272 `self.histfile`
1273
1273
1274 def reloadhist(self):
1274 def reloadhist(self):
1275 """Reload the input history from disk file."""
1275 """Reload the input history from disk file."""
1276
1276
1277 if self.has_readline:
1277 if self.has_readline:
1278 try:
1278 try:
1279 self.readline.clear_history()
1279 self.readline.clear_history()
1280 self.readline.read_history_file(self.shell.histfile)
1280 self.readline.read_history_file(self.shell.histfile)
1281 except AttributeError:
1281 except AttributeError:
1282 pass
1282 pass
1283
1283
1284
1284
1285 def history_saving_wrapper(self, func):
1285 def history_saving_wrapper(self, func):
1286 """ Wrap func for readline history saving
1286 """ Wrap func for readline history saving
1287
1287
1288 Convert func into callable that saves & restores
1288 Convert func into callable that saves & restores
1289 history around the call """
1289 history around the call """
1290
1290
1291 if not self.has_readline:
1291 if not self.has_readline:
1292 return func
1292 return func
1293
1293
1294 def wrapper():
1294 def wrapper():
1295 self.savehist()
1295 self.savehist()
1296 try:
1296 try:
1297 func()
1297 func()
1298 finally:
1298 finally:
1299 readline.read_history_file(self.histfile)
1299 readline.read_history_file(self.histfile)
1300 return wrapper
1300 return wrapper
1301
1301
1302
1302
1303 def pre_readline(self):
1303 def pre_readline(self):
1304 """readline hook to be used at the start of each line.
1304 """readline hook to be used at the start of each line.
1305
1305
1306 Currently it handles auto-indent only."""
1306 Currently it handles auto-indent only."""
1307
1307
1308 #debugx('self.indent_current_nsp','pre_readline:')
1308 #debugx('self.indent_current_nsp','pre_readline:')
1309
1309
1310 if self.rl_do_indent:
1310 if self.rl_do_indent:
1311 self.readline.insert_text(self.indent_current_str())
1311 self.readline.insert_text(self.indent_current_str())
1312 if self.rl_next_input is not None:
1312 if self.rl_next_input is not None:
1313 self.readline.insert_text(self.rl_next_input)
1313 self.readline.insert_text(self.rl_next_input)
1314 self.rl_next_input = None
1314 self.rl_next_input = None
1315
1315
1316 def init_readline(self):
1316 def init_readline(self):
1317 """Command history completion/saving/reloading."""
1317 """Command history completion/saving/reloading."""
1318
1318
1319
1319
1320 import IPython.rlineimpl as readline
1320 import IPython.rlineimpl as readline
1321
1321
1322 if not readline.have_readline:
1322 if not readline.have_readline:
1323 self.has_readline = 0
1323 self.has_readline = 0
1324 self.readline = None
1324 self.readline = None
1325 # no point in bugging windows users with this every time:
1325 # no point in bugging windows users with this every time:
1326 warn('Readline services not available on this platform.')
1326 warn('Readline services not available on this platform.')
1327 else:
1327 else:
1328 sys.modules['readline'] = readline
1328 sys.modules['readline'] = readline
1329 import atexit
1329 import atexit
1330 from IPython.completer import IPCompleter
1330 from IPython.completer import IPCompleter
1331 self.Completer = IPCompleter(self,
1331 self.Completer = IPCompleter(self,
1332 self.user_ns,
1332 self.user_ns,
1333 self.user_global_ns,
1333 self.user_global_ns,
1334 self.rc.readline_omit__names,
1334 self.rc.readline_omit__names,
1335 self.alias_table)
1335 self.alias_table)
1336 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1336 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1337 self.strdispatchers['complete_command'] = sdisp
1337 self.strdispatchers['complete_command'] = sdisp
1338 self.Completer.custom_completers = sdisp
1338 self.Completer.custom_completers = sdisp
1339 # Platform-specific configuration
1339 # Platform-specific configuration
1340 if os.name == 'nt':
1340 if os.name == 'nt':
1341 self.readline_startup_hook = readline.set_pre_input_hook
1341 self.readline_startup_hook = readline.set_pre_input_hook
1342 else:
1342 else:
1343 self.readline_startup_hook = readline.set_startup_hook
1343 self.readline_startup_hook = readline.set_startup_hook
1344
1344
1345 # Load user's initrc file (readline config)
1345 # Load user's initrc file (readline config)
1346 # Or if libedit is used, load editrc.
1346 # Or if libedit is used, load editrc.
1347 inputrc_name = os.environ.get('INPUTRC')
1347 inputrc_name = os.environ.get('INPUTRC')
1348 if inputrc_name is None:
1348 if inputrc_name is None:
1349 home_dir = get_home_dir()
1349 home_dir = get_home_dir()
1350 if home_dir is not None:
1350 if home_dir is not None:
1351 inputrc_name = '.inputrc'
1351 inputrc_name = '.inputrc'
1352 if readline.uses_libedit:
1352 if readline.uses_libedit:
1353 inputrc_name = '.editrc'
1353 inputrc_name = '.editrc'
1354 inputrc_name = os.path.join(home_dir, inputrc_name)
1354 inputrc_name = os.path.join(home_dir, inputrc_name)
1355 if os.path.isfile(inputrc_name):
1355 if os.path.isfile(inputrc_name):
1356 try:
1356 try:
1357 readline.read_init_file(inputrc_name)
1357 readline.read_init_file(inputrc_name)
1358 except:
1358 except:
1359 warn('Problems reading readline initialization file <%s>'
1359 warn('Problems reading readline initialization file <%s>'
1360 % inputrc_name)
1360 % inputrc_name)
1361
1361
1362 self.has_readline = 1
1362 self.has_readline = 1
1363 self.readline = readline
1363 self.readline = readline
1364 # save this in sys so embedded copies can restore it properly
1364 # save this in sys so embedded copies can restore it properly
1365 sys.ipcompleter = self.Completer.complete
1365 sys.ipcompleter = self.Completer.complete
1366 self.set_completer()
1366 self.set_completer()
1367
1367
1368 # Configure readline according to user's prefs
1368 # Configure readline according to user's prefs
1369 # This is only done if GNU readline is being used. If libedit
1369 # This is only done if GNU readline is being used. If libedit
1370 # is being used (as on Leopard) the readline config is
1370 # is being used (as on Leopard) the readline config is
1371 # not run as the syntax for libedit is different.
1371 # not run as the syntax for libedit is different.
1372 if not readline.uses_libedit:
1372 if not readline.uses_libedit:
1373 for rlcommand in self.rc.readline_parse_and_bind:
1373 for rlcommand in self.rc.readline_parse_and_bind:
1374 readline.parse_and_bind(rlcommand)
1374 readline.parse_and_bind(rlcommand)
1375
1375
1376 # remove some chars from the delimiters list
1376 # remove some chars from the delimiters list
1377 delims = readline.get_completer_delims()
1377 delims = readline.get_completer_delims()
1378 delims = delims.translate(string._idmap,
1378 delims = delims.translate(string._idmap,
1379 self.rc.readline_remove_delims)
1379 self.rc.readline_remove_delims)
1380 readline.set_completer_delims(delims)
1380 readline.set_completer_delims(delims)
1381 # otherwise we end up with a monster history after a while:
1381 # otherwise we end up with a monster history after a while:
1382 readline.set_history_length(1000)
1382 readline.set_history_length(1000)
1383 try:
1383 try:
1384 #print '*** Reading readline history' # dbg
1384 #print '*** Reading readline history' # dbg
1385 readline.read_history_file(self.histfile)
1385 readline.read_history_file(self.histfile)
1386 except IOError:
1386 except IOError:
1387 pass # It doesn't exist yet.
1387 pass # It doesn't exist yet.
1388
1388
1389 atexit.register(self.atexit_operations)
1389 atexit.register(self.atexit_operations)
1390 del atexit
1390 del atexit
1391
1391
1392 # Configure auto-indent for all platforms
1392 # Configure auto-indent for all platforms
1393 self.set_autoindent(self.rc.autoindent)
1393 self.set_autoindent(self.rc.autoindent)
1394
1394
1395 def ask_yes_no(self,prompt,default=True):
1395 def ask_yes_no(self,prompt,default=True):
1396 if self.rc.quiet:
1396 if self.rc.quiet:
1397 return True
1397 return True
1398 return ask_yes_no(prompt,default)
1398 return ask_yes_no(prompt,default)
1399
1399
1400 def _should_recompile(self,e):
1400 def _should_recompile(self,e):
1401 """Utility routine for edit_syntax_error"""
1401 """Utility routine for edit_syntax_error"""
1402
1402
1403 if e.filename in ('<ipython console>','<input>','<string>',
1403 if e.filename in ('<ipython console>','<input>','<string>',
1404 '<console>','<BackgroundJob compilation>',
1404 '<console>','<BackgroundJob compilation>',
1405 None):
1405 None):
1406
1406
1407 return False
1407 return False
1408 try:
1408 try:
1409 if (self.rc.autoedit_syntax and
1409 if (self.rc.autoedit_syntax and
1410 not self.ask_yes_no('Return to editor to correct syntax error? '
1410 not self.ask_yes_no('Return to editor to correct syntax error? '
1411 '[Y/n] ','y')):
1411 '[Y/n] ','y')):
1412 return False
1412 return False
1413 except EOFError:
1413 except EOFError:
1414 return False
1414 return False
1415
1415
1416 def int0(x):
1416 def int0(x):
1417 try:
1417 try:
1418 return int(x)
1418 return int(x)
1419 except TypeError:
1419 except TypeError:
1420 return 0
1420 return 0
1421 # always pass integer line and offset values to editor hook
1421 # always pass integer line and offset values to editor hook
1422 try:
1422 self.hooks.fix_error_editor(e.filename,
1423 self.hooks.fix_error_editor(e.filename,
1423 int0(e.lineno),int0(e.offset),e.msg)
1424 int0(e.lineno),int0(e.offset),e.msg)
1425 except IPython.ipapi.TryNext:
1426 warn('Could not open editor')
1427 return False
1424 return True
1428 return True
1425
1429
1426 def edit_syntax_error(self):
1430 def edit_syntax_error(self):
1427 """The bottom half of the syntax error handler called in the main loop.
1431 """The bottom half of the syntax error handler called in the main loop.
1428
1432
1429 Loop until syntax error is fixed or user cancels.
1433 Loop until syntax error is fixed or user cancels.
1430 """
1434 """
1431
1435
1432 while self.SyntaxTB.last_syntax_error:
1436 while self.SyntaxTB.last_syntax_error:
1433 # copy and clear last_syntax_error
1437 # copy and clear last_syntax_error
1434 err = self.SyntaxTB.clear_err_state()
1438 err = self.SyntaxTB.clear_err_state()
1435 if not self._should_recompile(err):
1439 if not self._should_recompile(err):
1436 return
1440 return
1437 try:
1441 try:
1438 # may set last_syntax_error again if a SyntaxError is raised
1442 # may set last_syntax_error again if a SyntaxError is raised
1439 self.safe_execfile(err.filename,self.user_ns)
1443 self.safe_execfile(err.filename,self.user_ns)
1440 except:
1444 except:
1441 self.showtraceback()
1445 self.showtraceback()
1442 else:
1446 else:
1443 try:
1447 try:
1444 f = file(err.filename)
1448 f = file(err.filename)
1445 try:
1449 try:
1446 sys.displayhook(f.read())
1450 sys.displayhook(f.read())
1447 finally:
1451 finally:
1448 f.close()
1452 f.close()
1449 except:
1453 except:
1450 self.showtraceback()
1454 self.showtraceback()
1451
1455
1452 def showsyntaxerror(self, filename=None):
1456 def showsyntaxerror(self, filename=None):
1453 """Display the syntax error that just occurred.
1457 """Display the syntax error that just occurred.
1454
1458
1455 This doesn't display a stack trace because there isn't one.
1459 This doesn't display a stack trace because there isn't one.
1456
1460
1457 If a filename is given, it is stuffed in the exception instead
1461 If a filename is given, it is stuffed in the exception instead
1458 of what was there before (because Python's parser always uses
1462 of what was there before (because Python's parser always uses
1459 "<string>" when reading from a string).
1463 "<string>" when reading from a string).
1460 """
1464 """
1461 etype, value, last_traceback = sys.exc_info()
1465 etype, value, last_traceback = sys.exc_info()
1462
1466
1463 # See note about these variables in showtraceback() below
1467 # See note about these variables in showtraceback() below
1464 sys.last_type = etype
1468 sys.last_type = etype
1465 sys.last_value = value
1469 sys.last_value = value
1466 sys.last_traceback = last_traceback
1470 sys.last_traceback = last_traceback
1467
1471
1468 if filename and etype is SyntaxError:
1472 if filename and etype is SyntaxError:
1469 # Work hard to stuff the correct filename in the exception
1473 # Work hard to stuff the correct filename in the exception
1470 try:
1474 try:
1471 msg, (dummy_filename, lineno, offset, line) = value
1475 msg, (dummy_filename, lineno, offset, line) = value
1472 except:
1476 except:
1473 # Not the format we expect; leave it alone
1477 # Not the format we expect; leave it alone
1474 pass
1478 pass
1475 else:
1479 else:
1476 # Stuff in the right filename
1480 # Stuff in the right filename
1477 try:
1481 try:
1478 # Assume SyntaxError is a class exception
1482 # Assume SyntaxError is a class exception
1479 value = SyntaxError(msg, (filename, lineno, offset, line))
1483 value = SyntaxError(msg, (filename, lineno, offset, line))
1480 except:
1484 except:
1481 # If that failed, assume SyntaxError is a string
1485 # If that failed, assume SyntaxError is a string
1482 value = msg, (filename, lineno, offset, line)
1486 value = msg, (filename, lineno, offset, line)
1483 self.SyntaxTB(etype,value,[])
1487 self.SyntaxTB(etype,value,[])
1484
1488
1485 def debugger(self,force=False):
1489 def debugger(self,force=False):
1486 """Call the pydb/pdb debugger.
1490 """Call the pydb/pdb debugger.
1487
1491
1488 Keywords:
1492 Keywords:
1489
1493
1490 - force(False): by default, this routine checks the instance call_pdb
1494 - force(False): by default, this routine checks the instance call_pdb
1491 flag and does not actually invoke the debugger if the flag is false.
1495 flag and does not actually invoke the debugger if the flag is false.
1492 The 'force' option forces the debugger to activate even if the flag
1496 The 'force' option forces the debugger to activate even if the flag
1493 is false.
1497 is false.
1494 """
1498 """
1495
1499
1496 if not (force or self.call_pdb):
1500 if not (force or self.call_pdb):
1497 return
1501 return
1498
1502
1499 if not hasattr(sys,'last_traceback'):
1503 if not hasattr(sys,'last_traceback'):
1500 error('No traceback has been produced, nothing to debug.')
1504 error('No traceback has been produced, nothing to debug.')
1501 return
1505 return
1502
1506
1503 # use pydb if available
1507 # use pydb if available
1504 if Debugger.has_pydb:
1508 if Debugger.has_pydb:
1505 from pydb import pm
1509 from pydb import pm
1506 else:
1510 else:
1507 # fallback to our internal debugger
1511 # fallback to our internal debugger
1508 pm = lambda : self.InteractiveTB.debugger(force=True)
1512 pm = lambda : self.InteractiveTB.debugger(force=True)
1509 self.history_saving_wrapper(pm)()
1513 self.history_saving_wrapper(pm)()
1510
1514
1511 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1515 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1512 """Display the exception that just occurred.
1516 """Display the exception that just occurred.
1513
1517
1514 If nothing is known about the exception, this is the method which
1518 If nothing is known about the exception, this is the method which
1515 should be used throughout the code for presenting user tracebacks,
1519 should be used throughout the code for presenting user tracebacks,
1516 rather than directly invoking the InteractiveTB object.
1520 rather than directly invoking the InteractiveTB object.
1517
1521
1518 A specific showsyntaxerror() also exists, but this method can take
1522 A specific showsyntaxerror() also exists, but this method can take
1519 care of calling it if needed, so unless you are explicitly catching a
1523 care of calling it if needed, so unless you are explicitly catching a
1520 SyntaxError exception, don't try to analyze the stack manually and
1524 SyntaxError exception, don't try to analyze the stack manually and
1521 simply call this method."""
1525 simply call this method."""
1522
1526
1523
1527
1524 # Though this won't be called by syntax errors in the input line,
1528 # Though this won't be called by syntax errors in the input line,
1525 # there may be SyntaxError cases whith imported code.
1529 # there may be SyntaxError cases whith imported code.
1526
1530
1527 try:
1531 try:
1528 if exc_tuple is None:
1532 if exc_tuple is None:
1529 etype, value, tb = sys.exc_info()
1533 etype, value, tb = sys.exc_info()
1530 else:
1534 else:
1531 etype, value, tb = exc_tuple
1535 etype, value, tb = exc_tuple
1532
1536
1533 if etype is SyntaxError:
1537 if etype is SyntaxError:
1534 self.showsyntaxerror(filename)
1538 self.showsyntaxerror(filename)
1535 elif etype is IPython.ipapi.UsageError:
1539 elif etype is IPython.ipapi.UsageError:
1536 print "UsageError:", value
1540 print "UsageError:", value
1537 else:
1541 else:
1538 # WARNING: these variables are somewhat deprecated and not
1542 # WARNING: these variables are somewhat deprecated and not
1539 # necessarily safe to use in a threaded environment, but tools
1543 # necessarily safe to use in a threaded environment, but tools
1540 # like pdb depend on their existence, so let's set them. If we
1544 # like pdb depend on their existence, so let's set them. If we
1541 # find problems in the field, we'll need to revisit their use.
1545 # find problems in the field, we'll need to revisit their use.
1542 sys.last_type = etype
1546 sys.last_type = etype
1543 sys.last_value = value
1547 sys.last_value = value
1544 sys.last_traceback = tb
1548 sys.last_traceback = tb
1545
1549
1546 if etype in self.custom_exceptions:
1550 if etype in self.custom_exceptions:
1547 self.CustomTB(etype,value,tb)
1551 self.CustomTB(etype,value,tb)
1548 else:
1552 else:
1549 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1553 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1550 if self.InteractiveTB.call_pdb and self.has_readline:
1554 if self.InteractiveTB.call_pdb and self.has_readline:
1551 # pdb mucks up readline, fix it back
1555 # pdb mucks up readline, fix it back
1552 self.set_completer()
1556 self.set_completer()
1553 except KeyboardInterrupt:
1557 except KeyboardInterrupt:
1554 self.write("\nKeyboardInterrupt\n")
1558 self.write("\nKeyboardInterrupt\n")
1555
1559
1556
1560
1557
1561
1558 def mainloop(self,banner=None):
1562 def mainloop(self,banner=None):
1559 """Creates the local namespace and starts the mainloop.
1563 """Creates the local namespace and starts the mainloop.
1560
1564
1561 If an optional banner argument is given, it will override the
1565 If an optional banner argument is given, it will override the
1562 internally created default banner."""
1566 internally created default banner."""
1563
1567
1564 if self.rc.c: # Emulate Python's -c option
1568 if self.rc.c: # Emulate Python's -c option
1565 self.exec_init_cmd()
1569 self.exec_init_cmd()
1566 if banner is None:
1570 if banner is None:
1567 if not self.rc.banner:
1571 if not self.rc.banner:
1568 banner = ''
1572 banner = ''
1569 # banner is string? Use it directly!
1573 # banner is string? Use it directly!
1570 elif isinstance(self.rc.banner,basestring):
1574 elif isinstance(self.rc.banner,basestring):
1571 banner = self.rc.banner
1575 banner = self.rc.banner
1572 else:
1576 else:
1573 banner = self.BANNER+self.banner2
1577 banner = self.BANNER+self.banner2
1574
1578
1579 # if you run stuff with -c <cmd>, raw hist is not updated
1580 # ensure that it's in sync
1581 if len(self.input_hist) != len (self.input_hist_raw):
1582 self.input_hist_raw = InputList(self.input_hist)
1583
1575 while 1:
1584 while 1:
1576 try:
1585 try:
1577 self.interact(banner)
1586 self.interact(banner)
1578 #self.interact_with_readline()
1587 #self.interact_with_readline()
1579 # XXX for testing of a readline-decoupled repl loop, call interact_with_readline above
1588 # XXX for testing of a readline-decoupled repl loop, call interact_with_readline above
1580
1589
1581 break
1590 break
1582 except KeyboardInterrupt:
1591 except KeyboardInterrupt:
1583 # this should not be necessary, but KeyboardInterrupt
1592 # this should not be necessary, but KeyboardInterrupt
1584 # handling seems rather unpredictable...
1593 # handling seems rather unpredictable...
1585 self.write("\nKeyboardInterrupt in interact()\n")
1594 self.write("\nKeyboardInterrupt in interact()\n")
1586
1595
1587 def exec_init_cmd(self):
1596 def exec_init_cmd(self):
1588 """Execute a command given at the command line.
1597 """Execute a command given at the command line.
1589
1598
1590 This emulates Python's -c option."""
1599 This emulates Python's -c option."""
1591
1600
1592 #sys.argv = ['-c']
1601 #sys.argv = ['-c']
1593 self.push(self.prefilter(self.rc.c, False))
1602 self.push(self.prefilter(self.rc.c, False))
1594 if not self.rc.interact:
1603 if not self.rc.interact:
1595 self.ask_exit()
1604 self.ask_exit()
1596
1605
1597 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1606 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1598 """Embeds IPython into a running python program.
1607 """Embeds IPython into a running python program.
1599
1608
1600 Input:
1609 Input:
1601
1610
1602 - header: An optional header message can be specified.
1611 - header: An optional header message can be specified.
1603
1612
1604 - local_ns, global_ns: working namespaces. If given as None, the
1613 - local_ns, global_ns: working namespaces. If given as None, the
1605 IPython-initialized one is updated with __main__.__dict__, so that
1614 IPython-initialized one is updated with __main__.__dict__, so that
1606 program variables become visible but user-specific configuration
1615 program variables become visible but user-specific configuration
1607 remains possible.
1616 remains possible.
1608
1617
1609 - stack_depth: specifies how many levels in the stack to go to
1618 - stack_depth: specifies how many levels in the stack to go to
1610 looking for namespaces (when local_ns and global_ns are None). This
1619 looking for namespaces (when local_ns and global_ns are None). This
1611 allows an intermediate caller to make sure that this function gets
1620 allows an intermediate caller to make sure that this function gets
1612 the namespace from the intended level in the stack. By default (0)
1621 the namespace from the intended level in the stack. By default (0)
1613 it will get its locals and globals from the immediate caller.
1622 it will get its locals and globals from the immediate caller.
1614
1623
1615 Warning: it's possible to use this in a program which is being run by
1624 Warning: it's possible to use this in a program which is being run by
1616 IPython itself (via %run), but some funny things will happen (a few
1625 IPython itself (via %run), but some funny things will happen (a few
1617 globals get overwritten). In the future this will be cleaned up, as
1626 globals get overwritten). In the future this will be cleaned up, as
1618 there is no fundamental reason why it can't work perfectly."""
1627 there is no fundamental reason why it can't work perfectly."""
1619
1628
1620 # Get locals and globals from caller
1629 # Get locals and globals from caller
1621 if local_ns is None or global_ns is None:
1630 if local_ns is None or global_ns is None:
1622 call_frame = sys._getframe(stack_depth).f_back
1631 call_frame = sys._getframe(stack_depth).f_back
1623
1632
1624 if local_ns is None:
1633 if local_ns is None:
1625 local_ns = call_frame.f_locals
1634 local_ns = call_frame.f_locals
1626 if global_ns is None:
1635 if global_ns is None:
1627 global_ns = call_frame.f_globals
1636 global_ns = call_frame.f_globals
1628
1637
1629 # Update namespaces and fire up interpreter
1638 # Update namespaces and fire up interpreter
1630
1639
1631 # The global one is easy, we can just throw it in
1640 # The global one is easy, we can just throw it in
1632 self.user_global_ns = global_ns
1641 self.user_global_ns = global_ns
1633
1642
1634 # but the user/local one is tricky: ipython needs it to store internal
1643 # but the user/local one is tricky: ipython needs it to store internal
1635 # data, but we also need the locals. We'll copy locals in the user
1644 # data, but we also need the locals. We'll copy locals in the user
1636 # one, but will track what got copied so we can delete them at exit.
1645 # one, but will track what got copied so we can delete them at exit.
1637 # This is so that a later embedded call doesn't see locals from a
1646 # This is so that a later embedded call doesn't see locals from a
1638 # previous call (which most likely existed in a separate scope).
1647 # previous call (which most likely existed in a separate scope).
1639 local_varnames = local_ns.keys()
1648 local_varnames = local_ns.keys()
1640 self.user_ns.update(local_ns)
1649 self.user_ns.update(local_ns)
1641 #self.user_ns['local_ns'] = local_ns # dbg
1650 #self.user_ns['local_ns'] = local_ns # dbg
1642
1651
1643 # Patch for global embedding to make sure that things don't overwrite
1652 # Patch for global embedding to make sure that things don't overwrite
1644 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1653 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1645 # FIXME. Test this a bit more carefully (the if.. is new)
1654 # FIXME. Test this a bit more carefully (the if.. is new)
1646 if local_ns is None and global_ns is None:
1655 if local_ns is None and global_ns is None:
1647 self.user_global_ns.update(__main__.__dict__)
1656 self.user_global_ns.update(__main__.__dict__)
1648
1657
1649 # make sure the tab-completer has the correct frame information, so it
1658 # make sure the tab-completer has the correct frame information, so it
1650 # actually completes using the frame's locals/globals
1659 # actually completes using the frame's locals/globals
1651 self.set_completer_frame()
1660 self.set_completer_frame()
1652
1661
1653 # before activating the interactive mode, we need to make sure that
1662 # before activating the interactive mode, we need to make sure that
1654 # all names in the builtin namespace needed by ipython point to
1663 # all names in the builtin namespace needed by ipython point to
1655 # ourselves, and not to other instances.
1664 # ourselves, and not to other instances.
1656 self.add_builtins()
1665 self.add_builtins()
1657
1666
1658 self.interact(header)
1667 self.interact(header)
1659
1668
1660 # now, purge out the user namespace from anything we might have added
1669 # now, purge out the user namespace from anything we might have added
1661 # from the caller's local namespace
1670 # from the caller's local namespace
1662 delvar = self.user_ns.pop
1671 delvar = self.user_ns.pop
1663 for var in local_varnames:
1672 for var in local_varnames:
1664 delvar(var,None)
1673 delvar(var,None)
1665 # and clean builtins we may have overridden
1674 # and clean builtins we may have overridden
1666 self.clean_builtins()
1675 self.clean_builtins()
1667
1676
1668 def interact_prompt(self):
1677 def interact_prompt(self):
1669 """ Print the prompt (in read-eval-print loop)
1678 """ Print the prompt (in read-eval-print loop)
1670
1679
1671 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1680 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1672 used in standard IPython flow.
1681 used in standard IPython flow.
1673 """
1682 """
1674 if self.more:
1683 if self.more:
1675 try:
1684 try:
1676 prompt = self.hooks.generate_prompt(True)
1685 prompt = self.hooks.generate_prompt(True)
1677 except:
1686 except:
1678 self.showtraceback()
1687 self.showtraceback()
1679 if self.autoindent:
1688 if self.autoindent:
1680 self.rl_do_indent = True
1689 self.rl_do_indent = True
1681
1690
1682 else:
1691 else:
1683 try:
1692 try:
1684 prompt = self.hooks.generate_prompt(False)
1693 prompt = self.hooks.generate_prompt(False)
1685 except:
1694 except:
1686 self.showtraceback()
1695 self.showtraceback()
1687 self.write(prompt)
1696 self.write(prompt)
1688
1697
1689 def interact_handle_input(self,line):
1698 def interact_handle_input(self,line):
1690 """ Handle the input line (in read-eval-print loop)
1699 """ Handle the input line (in read-eval-print loop)
1691
1700
1692 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1701 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1693 used in standard IPython flow.
1702 used in standard IPython flow.
1694 """
1703 """
1695 if line.lstrip() == line:
1704 if line.lstrip() == line:
1696 self.shadowhist.add(line.strip())
1705 self.shadowhist.add(line.strip())
1697 lineout = self.prefilter(line,self.more)
1706 lineout = self.prefilter(line,self.more)
1698
1707
1699 if line.strip():
1708 if line.strip():
1700 if self.more:
1709 if self.more:
1701 self.input_hist_raw[-1] += '%s\n' % line
1710 self.input_hist_raw[-1] += '%s\n' % line
1702 else:
1711 else:
1703 self.input_hist_raw.append('%s\n' % line)
1712 self.input_hist_raw.append('%s\n' % line)
1704
1713
1705
1714
1706 self.more = self.push(lineout)
1715 self.more = self.push(lineout)
1707 if (self.SyntaxTB.last_syntax_error and
1716 if (self.SyntaxTB.last_syntax_error and
1708 self.rc.autoedit_syntax):
1717 self.rc.autoedit_syntax):
1709 self.edit_syntax_error()
1718 self.edit_syntax_error()
1710
1719
1711 def interact_with_readline(self):
1720 def interact_with_readline(self):
1712 """ Demo of using interact_handle_input, interact_prompt
1721 """ Demo of using interact_handle_input, interact_prompt
1713
1722
1714 This is the main read-eval-print loop. If you need to implement your own (e.g. for GUI),
1723 This is the main read-eval-print loop. If you need to implement your own (e.g. for GUI),
1715 it should work like this.
1724 it should work like this.
1716 """
1725 """
1717 self.readline_startup_hook(self.pre_readline)
1726 self.readline_startup_hook(self.pre_readline)
1718 while not self.exit_now:
1727 while not self.exit_now:
1719 self.interact_prompt()
1728 self.interact_prompt()
1720 if self.more:
1729 if self.more:
1721 self.rl_do_indent = True
1730 self.rl_do_indent = True
1722 else:
1731 else:
1723 self.rl_do_indent = False
1732 self.rl_do_indent = False
1724 line = raw_input_original().decode(self.stdin_encoding)
1733 line = raw_input_original().decode(self.stdin_encoding)
1725 self.interact_handle_input(line)
1734 self.interact_handle_input(line)
1726
1735
1727
1736
1728 def interact(self, banner=None):
1737 def interact(self, banner=None):
1729 """Closely emulate the interactive Python console.
1738 """Closely emulate the interactive Python console.
1730
1739
1731 The optional banner argument specify the banner to print
1740 The optional banner argument specify the banner to print
1732 before the first interaction; by default it prints a banner
1741 before the first interaction; by default it prints a banner
1733 similar to the one printed by the real Python interpreter,
1742 similar to the one printed by the real Python interpreter,
1734 followed by the current class name in parentheses (so as not
1743 followed by the current class name in parentheses (so as not
1735 to confuse this with the real interpreter -- since it's so
1744 to confuse this with the real interpreter -- since it's so
1736 close!).
1745 close!).
1737
1746
1738 """
1747 """
1739
1748
1740 if self.exit_now:
1749 if self.exit_now:
1741 # batch run -> do not interact
1750 # batch run -> do not interact
1742 return
1751 return
1743 cprt = 'Type "copyright", "credits" or "license" for more information.'
1752 cprt = 'Type "copyright", "credits" or "license" for more information.'
1744 if banner is None:
1753 if banner is None:
1745 self.write("Python %s on %s\n%s\n(%s)\n" %
1754 self.write("Python %s on %s\n%s\n(%s)\n" %
1746 (sys.version, sys.platform, cprt,
1755 (sys.version, sys.platform, cprt,
1747 self.__class__.__name__))
1756 self.__class__.__name__))
1748 else:
1757 else:
1749 self.write(banner)
1758 self.write(banner)
1750
1759
1751 more = 0
1760 more = 0
1752
1761
1753 # Mark activity in the builtins
1762 # Mark activity in the builtins
1754 __builtin__.__dict__['__IPYTHON__active'] += 1
1763 __builtin__.__dict__['__IPYTHON__active'] += 1
1755
1764
1756 if self.has_readline:
1765 if self.has_readline:
1757 self.readline_startup_hook(self.pre_readline)
1766 self.readline_startup_hook(self.pre_readline)
1758 # exit_now is set by a call to %Exit or %Quit, through the
1767 # exit_now is set by a call to %Exit or %Quit, through the
1759 # ask_exit callback.
1768 # ask_exit callback.
1760
1769
1761 while not self.exit_now:
1770 while not self.exit_now:
1762 self.hooks.pre_prompt_hook()
1771 self.hooks.pre_prompt_hook()
1763 if more:
1772 if more:
1764 try:
1773 try:
1765 prompt = self.hooks.generate_prompt(True)
1774 prompt = self.hooks.generate_prompt(True)
1766 except:
1775 except:
1767 self.showtraceback()
1776 self.showtraceback()
1768 if self.autoindent:
1777 if self.autoindent:
1769 self.rl_do_indent = True
1778 self.rl_do_indent = True
1770
1779
1771 else:
1780 else:
1772 try:
1781 try:
1773 prompt = self.hooks.generate_prompt(False)
1782 prompt = self.hooks.generate_prompt(False)
1774 except:
1783 except:
1775 self.showtraceback()
1784 self.showtraceback()
1776 try:
1785 try:
1777 line = self.raw_input(prompt,more)
1786 line = self.raw_input(prompt,more)
1778 if self.exit_now:
1787 if self.exit_now:
1779 # quick exit on sys.std[in|out] close
1788 # quick exit on sys.std[in|out] close
1780 break
1789 break
1781 if self.autoindent:
1790 if self.autoindent:
1782 self.rl_do_indent = False
1791 self.rl_do_indent = False
1783
1792
1784 except KeyboardInterrupt:
1793 except KeyboardInterrupt:
1785 #double-guard against keyboardinterrupts during kbdint handling
1794 #double-guard against keyboardinterrupts during kbdint handling
1786 try:
1795 try:
1787 self.write('\nKeyboardInterrupt\n')
1796 self.write('\nKeyboardInterrupt\n')
1788 self.resetbuffer()
1797 self.resetbuffer()
1789 # keep cache in sync with the prompt counter:
1798 # keep cache in sync with the prompt counter:
1790 self.outputcache.prompt_count -= 1
1799 self.outputcache.prompt_count -= 1
1791
1800
1792 if self.autoindent:
1801 if self.autoindent:
1793 self.indent_current_nsp = 0
1802 self.indent_current_nsp = 0
1794 more = 0
1803 more = 0
1795 except KeyboardInterrupt:
1804 except KeyboardInterrupt:
1796 pass
1805 pass
1797 except EOFError:
1806 except EOFError:
1798 if self.autoindent:
1807 if self.autoindent:
1799 self.rl_do_indent = False
1808 self.rl_do_indent = False
1800 self.readline_startup_hook(None)
1809 self.readline_startup_hook(None)
1801 self.write('\n')
1810 self.write('\n')
1802 self.exit()
1811 self.exit()
1803 except bdb.BdbQuit:
1812 except bdb.BdbQuit:
1804 warn('The Python debugger has exited with a BdbQuit exception.\n'
1813 warn('The Python debugger has exited with a BdbQuit exception.\n'
1805 'Because of how pdb handles the stack, it is impossible\n'
1814 'Because of how pdb handles the stack, it is impossible\n'
1806 'for IPython to properly format this particular exception.\n'
1815 'for IPython to properly format this particular exception.\n'
1807 'IPython will resume normal operation.')
1816 'IPython will resume normal operation.')
1808 except:
1817 except:
1809 # exceptions here are VERY RARE, but they can be triggered
1818 # exceptions here are VERY RARE, but they can be triggered
1810 # asynchronously by signal handlers, for example.
1819 # asynchronously by signal handlers, for example.
1811 self.showtraceback()
1820 self.showtraceback()
1812 else:
1821 else:
1813 more = self.push(line)
1822 more = self.push(line)
1814 if (self.SyntaxTB.last_syntax_error and
1823 if (self.SyntaxTB.last_syntax_error and
1815 self.rc.autoedit_syntax):
1824 self.rc.autoedit_syntax):
1816 self.edit_syntax_error()
1825 self.edit_syntax_error()
1817
1826
1818 # We are off again...
1827 # We are off again...
1819 __builtin__.__dict__['__IPYTHON__active'] -= 1
1828 __builtin__.__dict__['__IPYTHON__active'] -= 1
1820
1829
1821 def excepthook(self, etype, value, tb):
1830 def excepthook(self, etype, value, tb):
1822 """One more defense for GUI apps that call sys.excepthook.
1831 """One more defense for GUI apps that call sys.excepthook.
1823
1832
1824 GUI frameworks like wxPython trap exceptions and call
1833 GUI frameworks like wxPython trap exceptions and call
1825 sys.excepthook themselves. I guess this is a feature that
1834 sys.excepthook themselves. I guess this is a feature that
1826 enables them to keep running after exceptions that would
1835 enables them to keep running after exceptions that would
1827 otherwise kill their mainloop. This is a bother for IPython
1836 otherwise kill their mainloop. This is a bother for IPython
1828 which excepts to catch all of the program exceptions with a try:
1837 which excepts to catch all of the program exceptions with a try:
1829 except: statement.
1838 except: statement.
1830
1839
1831 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1840 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1832 any app directly invokes sys.excepthook, it will look to the user like
1841 any app directly invokes sys.excepthook, it will look to the user like
1833 IPython crashed. In order to work around this, we can disable the
1842 IPython crashed. In order to work around this, we can disable the
1834 CrashHandler and replace it with this excepthook instead, which prints a
1843 CrashHandler and replace it with this excepthook instead, which prints a
1835 regular traceback using our InteractiveTB. In this fashion, apps which
1844 regular traceback using our InteractiveTB. In this fashion, apps which
1836 call sys.excepthook will generate a regular-looking exception from
1845 call sys.excepthook will generate a regular-looking exception from
1837 IPython, and the CrashHandler will only be triggered by real IPython
1846 IPython, and the CrashHandler will only be triggered by real IPython
1838 crashes.
1847 crashes.
1839
1848
1840 This hook should be used sparingly, only in places which are not likely
1849 This hook should be used sparingly, only in places which are not likely
1841 to be true IPython errors.
1850 to be true IPython errors.
1842 """
1851 """
1843 self.showtraceback((etype,value,tb),tb_offset=0)
1852 self.showtraceback((etype,value,tb),tb_offset=0)
1844
1853
1845 def expand_aliases(self,fn,rest):
1854 def expand_aliases(self,fn,rest):
1846 """ Expand multiple levels of aliases:
1855 """ Expand multiple levels of aliases:
1847
1856
1848 if:
1857 if:
1849
1858
1850 alias foo bar /tmp
1859 alias foo bar /tmp
1851 alias baz foo
1860 alias baz foo
1852
1861
1853 then:
1862 then:
1854
1863
1855 baz huhhahhei -> bar /tmp huhhahhei
1864 baz huhhahhei -> bar /tmp huhhahhei
1856
1865
1857 """
1866 """
1858 line = fn + " " + rest
1867 line = fn + " " + rest
1859
1868
1860 done = Set()
1869 done = Set()
1861 while 1:
1870 while 1:
1862 pre,fn,rest = prefilter.splitUserInput(line,
1871 pre,fn,rest = prefilter.splitUserInput(line,
1863 prefilter.shell_line_split)
1872 prefilter.shell_line_split)
1864 if fn in self.alias_table:
1873 if fn in self.alias_table:
1865 if fn in done:
1874 if fn in done:
1866 warn("Cyclic alias definition, repeated '%s'" % fn)
1875 warn("Cyclic alias definition, repeated '%s'" % fn)
1867 return ""
1876 return ""
1868 done.add(fn)
1877 done.add(fn)
1869
1878
1870 l2 = self.transform_alias(fn,rest)
1879 l2 = self.transform_alias(fn,rest)
1871 # dir -> dir
1880 # dir -> dir
1872 # print "alias",line, "->",l2 #dbg
1881 # print "alias",line, "->",l2 #dbg
1873 if l2 == line:
1882 if l2 == line:
1874 break
1883 break
1875 # ls -> ls -F should not recurse forever
1884 # ls -> ls -F should not recurse forever
1876 if l2.split(None,1)[0] == line.split(None,1)[0]:
1885 if l2.split(None,1)[0] == line.split(None,1)[0]:
1877 line = l2
1886 line = l2
1878 break
1887 break
1879
1888
1880 line=l2
1889 line=l2
1881
1890
1882
1891
1883 # print "al expand to",line #dbg
1892 # print "al expand to",line #dbg
1884 else:
1893 else:
1885 break
1894 break
1886
1895
1887 return line
1896 return line
1888
1897
1889 def transform_alias(self, alias,rest=''):
1898 def transform_alias(self, alias,rest=''):
1890 """ Transform alias to system command string.
1899 """ Transform alias to system command string.
1891 """
1900 """
1892 trg = self.alias_table[alias]
1901 trg = self.alias_table[alias]
1893
1902
1894 nargs,cmd = trg
1903 nargs,cmd = trg
1895 # print trg #dbg
1904 # print trg #dbg
1896 if ' ' in cmd and os.path.isfile(cmd):
1905 if ' ' in cmd and os.path.isfile(cmd):
1897 cmd = '"%s"' % cmd
1906 cmd = '"%s"' % cmd
1898
1907
1899 # Expand the %l special to be the user's input line
1908 # Expand the %l special to be the user's input line
1900 if cmd.find('%l') >= 0:
1909 if cmd.find('%l') >= 0:
1901 cmd = cmd.replace('%l',rest)
1910 cmd = cmd.replace('%l',rest)
1902 rest = ''
1911 rest = ''
1903 if nargs==0:
1912 if nargs==0:
1904 # Simple, argument-less aliases
1913 # Simple, argument-less aliases
1905 cmd = '%s %s' % (cmd,rest)
1914 cmd = '%s %s' % (cmd,rest)
1906 else:
1915 else:
1907 # Handle aliases with positional arguments
1916 # Handle aliases with positional arguments
1908 args = rest.split(None,nargs)
1917 args = rest.split(None,nargs)
1909 if len(args)< nargs:
1918 if len(args)< nargs:
1910 error('Alias <%s> requires %s arguments, %s given.' %
1919 error('Alias <%s> requires %s arguments, %s given.' %
1911 (alias,nargs,len(args)))
1920 (alias,nargs,len(args)))
1912 return None
1921 return None
1913 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1922 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1914 # Now call the macro, evaluating in the user's namespace
1923 # Now call the macro, evaluating in the user's namespace
1915 #print 'new command: <%r>' % cmd # dbg
1924 #print 'new command: <%r>' % cmd # dbg
1916 return cmd
1925 return cmd
1917
1926
1918 def call_alias(self,alias,rest=''):
1927 def call_alias(self,alias,rest=''):
1919 """Call an alias given its name and the rest of the line.
1928 """Call an alias given its name and the rest of the line.
1920
1929
1921 This is only used to provide backwards compatibility for users of
1930 This is only used to provide backwards compatibility for users of
1922 ipalias(), use of which is not recommended for anymore."""
1931 ipalias(), use of which is not recommended for anymore."""
1923
1932
1924 # Now call the macro, evaluating in the user's namespace
1933 # Now call the macro, evaluating in the user's namespace
1925 cmd = self.transform_alias(alias, rest)
1934 cmd = self.transform_alias(alias, rest)
1926 try:
1935 try:
1927 self.system(cmd)
1936 self.system(cmd)
1928 except:
1937 except:
1929 self.showtraceback()
1938 self.showtraceback()
1930
1939
1931 def indent_current_str(self):
1940 def indent_current_str(self):
1932 """return the current level of indentation as a string"""
1941 """return the current level of indentation as a string"""
1933 return self.indent_current_nsp * ' '
1942 return self.indent_current_nsp * ' '
1934
1943
1935 def autoindent_update(self,line):
1944 def autoindent_update(self,line):
1936 """Keep track of the indent level."""
1945 """Keep track of the indent level."""
1937
1946
1938 #debugx('line')
1947 #debugx('line')
1939 #debugx('self.indent_current_nsp')
1948 #debugx('self.indent_current_nsp')
1940 if self.autoindent:
1949 if self.autoindent:
1941 if line:
1950 if line:
1942 inisp = num_ini_spaces(line)
1951 inisp = num_ini_spaces(line)
1943 if inisp < self.indent_current_nsp:
1952 if inisp < self.indent_current_nsp:
1944 self.indent_current_nsp = inisp
1953 self.indent_current_nsp = inisp
1945
1954
1946 if line[-1] == ':':
1955 if line[-1] == ':':
1947 self.indent_current_nsp += 4
1956 self.indent_current_nsp += 4
1948 elif dedent_re.match(line):
1957 elif dedent_re.match(line):
1949 self.indent_current_nsp -= 4
1958 self.indent_current_nsp -= 4
1950 else:
1959 else:
1951 self.indent_current_nsp = 0
1960 self.indent_current_nsp = 0
1952
1961
1953 def runlines(self,lines):
1962 def runlines(self,lines):
1954 """Run a string of one or more lines of source.
1963 """Run a string of one or more lines of source.
1955
1964
1956 This method is capable of running a string containing multiple source
1965 This method is capable of running a string containing multiple source
1957 lines, as if they had been entered at the IPython prompt. Since it
1966 lines, as if they had been entered at the IPython prompt. Since it
1958 exposes IPython's processing machinery, the given strings can contain
1967 exposes IPython's processing machinery, the given strings can contain
1959 magic calls (%magic), special shell access (!cmd), etc."""
1968 magic calls (%magic), special shell access (!cmd), etc."""
1960
1969
1961 # We must start with a clean buffer, in case this is run from an
1970 # We must start with a clean buffer, in case this is run from an
1962 # interactive IPython session (via a magic, for example).
1971 # interactive IPython session (via a magic, for example).
1963 self.resetbuffer()
1972 self.resetbuffer()
1964 lines = lines.split('\n')
1973 lines = lines.split('\n')
1965 more = 0
1974 more = 0
1966
1975
1967 for line in lines:
1976 for line in lines:
1968 # skip blank lines so we don't mess up the prompt counter, but do
1977 # skip blank lines so we don't mess up the prompt counter, but do
1969 # NOT skip even a blank line if we are in a code block (more is
1978 # NOT skip even a blank line if we are in a code block (more is
1970 # true)
1979 # true)
1971
1980
1972
1981
1973 if line or more:
1982 if line or more:
1974 # push to raw history, so hist line numbers stay in sync
1983 # push to raw history, so hist line numbers stay in sync
1975 self.input_hist_raw.append("# " + line + "\n")
1984 self.input_hist_raw.append("# " + line + "\n")
1976 more = self.push(self.prefilter(line,more))
1985 more = self.push(self.prefilter(line,more))
1977 # IPython's runsource returns None if there was an error
1986 # IPython's runsource returns None if there was an error
1978 # compiling the code. This allows us to stop processing right
1987 # compiling the code. This allows us to stop processing right
1979 # away, so the user gets the error message at the right place.
1988 # away, so the user gets the error message at the right place.
1980 if more is None:
1989 if more is None:
1981 break
1990 break
1982 else:
1991 else:
1983 self.input_hist_raw.append("\n")
1992 self.input_hist_raw.append("\n")
1984 # final newline in case the input didn't have it, so that the code
1993 # final newline in case the input didn't have it, so that the code
1985 # actually does get executed
1994 # actually does get executed
1986 if more:
1995 if more:
1987 self.push('\n')
1996 self.push('\n')
1988
1997
1989 def runsource(self, source, filename='<input>', symbol='single'):
1998 def runsource(self, source, filename='<input>', symbol='single'):
1990 """Compile and run some source in the interpreter.
1999 """Compile and run some source in the interpreter.
1991
2000
1992 Arguments are as for compile_command().
2001 Arguments are as for compile_command().
1993
2002
1994 One several things can happen:
2003 One several things can happen:
1995
2004
1996 1) The input is incorrect; compile_command() raised an
2005 1) The input is incorrect; compile_command() raised an
1997 exception (SyntaxError or OverflowError). A syntax traceback
2006 exception (SyntaxError or OverflowError). A syntax traceback
1998 will be printed by calling the showsyntaxerror() method.
2007 will be printed by calling the showsyntaxerror() method.
1999
2008
2000 2) The input is incomplete, and more input is required;
2009 2) The input is incomplete, and more input is required;
2001 compile_command() returned None. Nothing happens.
2010 compile_command() returned None. Nothing happens.
2002
2011
2003 3) The input is complete; compile_command() returned a code
2012 3) The input is complete; compile_command() returned a code
2004 object. The code is executed by calling self.runcode() (which
2013 object. The code is executed by calling self.runcode() (which
2005 also handles run-time exceptions, except for SystemExit).
2014 also handles run-time exceptions, except for SystemExit).
2006
2015
2007 The return value is:
2016 The return value is:
2008
2017
2009 - True in case 2
2018 - True in case 2
2010
2019
2011 - False in the other cases, unless an exception is raised, where
2020 - False in the other cases, unless an exception is raised, where
2012 None is returned instead. This can be used by external callers to
2021 None is returned instead. This can be used by external callers to
2013 know whether to continue feeding input or not.
2022 know whether to continue feeding input or not.
2014
2023
2015 The return value can be used to decide whether to use sys.ps1 or
2024 The return value can be used to decide whether to use sys.ps1 or
2016 sys.ps2 to prompt the next line."""
2025 sys.ps2 to prompt the next line."""
2017
2026
2018 # if the source code has leading blanks, add 'if 1:\n' to it
2027 # if the source code has leading blanks, add 'if 1:\n' to it
2019 # this allows execution of indented pasted code. It is tempting
2028 # this allows execution of indented pasted code. It is tempting
2020 # to add '\n' at the end of source to run commands like ' a=1'
2029 # to add '\n' at the end of source to run commands like ' a=1'
2021 # directly, but this fails for more complicated scenarios
2030 # directly, but this fails for more complicated scenarios
2022 source=source.encode(self.stdin_encoding)
2031 source=source.encode(self.stdin_encoding)
2023 if source[:1] in [' ', '\t']:
2032 if source[:1] in [' ', '\t']:
2024 source = 'if 1:\n%s' % source
2033 source = 'if 1:\n%s' % source
2025
2034
2026 try:
2035 try:
2027 code = self.compile(source,filename,symbol)
2036 code = self.compile(source,filename,symbol)
2028 except (OverflowError, SyntaxError, ValueError, TypeError):
2037 except (OverflowError, SyntaxError, ValueError, TypeError):
2029 # Case 1
2038 # Case 1
2030 self.showsyntaxerror(filename)
2039 self.showsyntaxerror(filename)
2031 return None
2040 return None
2032
2041
2033 if code is None:
2042 if code is None:
2034 # Case 2
2043 # Case 2
2035 return True
2044 return True
2036
2045
2037 # Case 3
2046 # Case 3
2038 # We store the code object so that threaded shells and
2047 # We store the code object so that threaded shells and
2039 # custom exception handlers can access all this info if needed.
2048 # custom exception handlers can access all this info if needed.
2040 # The source corresponding to this can be obtained from the
2049 # The source corresponding to this can be obtained from the
2041 # buffer attribute as '\n'.join(self.buffer).
2050 # buffer attribute as '\n'.join(self.buffer).
2042 self.code_to_run = code
2051 self.code_to_run = code
2043 # now actually execute the code object
2052 # now actually execute the code object
2044 if self.runcode(code) == 0:
2053 if self.runcode(code) == 0:
2045 return False
2054 return False
2046 else:
2055 else:
2047 return None
2056 return None
2048
2057
2049 def runcode(self,code_obj):
2058 def runcode(self,code_obj):
2050 """Execute a code object.
2059 """Execute a code object.
2051
2060
2052 When an exception occurs, self.showtraceback() is called to display a
2061 When an exception occurs, self.showtraceback() is called to display a
2053 traceback.
2062 traceback.
2054
2063
2055 Return value: a flag indicating whether the code to be run completed
2064 Return value: a flag indicating whether the code to be run completed
2056 successfully:
2065 successfully:
2057
2066
2058 - 0: successful execution.
2067 - 0: successful execution.
2059 - 1: an error occurred.
2068 - 1: an error occurred.
2060 """
2069 """
2061
2070
2062 # Set our own excepthook in case the user code tries to call it
2071 # Set our own excepthook in case the user code tries to call it
2063 # directly, so that the IPython crash handler doesn't get triggered
2072 # directly, so that the IPython crash handler doesn't get triggered
2064 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2073 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2065
2074
2066 # we save the original sys.excepthook in the instance, in case config
2075 # we save the original sys.excepthook in the instance, in case config
2067 # code (such as magics) needs access to it.
2076 # code (such as magics) needs access to it.
2068 self.sys_excepthook = old_excepthook
2077 self.sys_excepthook = old_excepthook
2069 outflag = 1 # happens in more places, so it's easier as default
2078 outflag = 1 # happens in more places, so it's easier as default
2070 try:
2079 try:
2071 try:
2080 try:
2072 self.hooks.pre_runcode_hook()
2081 self.hooks.pre_runcode_hook()
2073 exec code_obj in self.user_global_ns, self.user_ns
2082 exec code_obj in self.user_global_ns, self.user_ns
2074 finally:
2083 finally:
2075 # Reset our crash handler in place
2084 # Reset our crash handler in place
2076 sys.excepthook = old_excepthook
2085 sys.excepthook = old_excepthook
2077 except SystemExit:
2086 except SystemExit:
2078 self.resetbuffer()
2087 self.resetbuffer()
2079 self.showtraceback()
2088 self.showtraceback()
2080 warn("Type %exit or %quit to exit IPython "
2089 warn("Type %exit or %quit to exit IPython "
2081 "(%Exit or %Quit do so unconditionally).",level=1)
2090 "(%Exit or %Quit do so unconditionally).",level=1)
2082 except self.custom_exceptions:
2091 except self.custom_exceptions:
2083 etype,value,tb = sys.exc_info()
2092 etype,value,tb = sys.exc_info()
2084 self.CustomTB(etype,value,tb)
2093 self.CustomTB(etype,value,tb)
2085 except:
2094 except:
2086 self.showtraceback()
2095 self.showtraceback()
2087 else:
2096 else:
2088 outflag = 0
2097 outflag = 0
2089 if softspace(sys.stdout, 0):
2098 if softspace(sys.stdout, 0):
2090 print
2099 print
2091 # Flush out code object which has been run (and source)
2100 # Flush out code object which has been run (and source)
2092 self.code_to_run = None
2101 self.code_to_run = None
2093 return outflag
2102 return outflag
2094
2103
2095 def push(self, line):
2104 def push(self, line):
2096 """Push a line to the interpreter.
2105 """Push a line to the interpreter.
2097
2106
2098 The line should not have a trailing newline; it may have
2107 The line should not have a trailing newline; it may have
2099 internal newlines. The line is appended to a buffer and the
2108 internal newlines. The line is appended to a buffer and the
2100 interpreter's runsource() method is called with the
2109 interpreter's runsource() method is called with the
2101 concatenated contents of the buffer as source. If this
2110 concatenated contents of the buffer as source. If this
2102 indicates that the command was executed or invalid, the buffer
2111 indicates that the command was executed or invalid, the buffer
2103 is reset; otherwise, the command is incomplete, and the buffer
2112 is reset; otherwise, the command is incomplete, and the buffer
2104 is left as it was after the line was appended. The return
2113 is left as it was after the line was appended. The return
2105 value is 1 if more input is required, 0 if the line was dealt
2114 value is 1 if more input is required, 0 if the line was dealt
2106 with in some way (this is the same as runsource()).
2115 with in some way (this is the same as runsource()).
2107 """
2116 """
2108
2117
2109 # autoindent management should be done here, and not in the
2118 # autoindent management should be done here, and not in the
2110 # interactive loop, since that one is only seen by keyboard input. We
2119 # interactive loop, since that one is only seen by keyboard input. We
2111 # need this done correctly even for code run via runlines (which uses
2120 # need this done correctly even for code run via runlines (which uses
2112 # push).
2121 # push).
2113
2122
2114 #print 'push line: <%s>' % line # dbg
2123 #print 'push line: <%s>' % line # dbg
2115 for subline in line.splitlines():
2124 for subline in line.splitlines():
2116 self.autoindent_update(subline)
2125 self.autoindent_update(subline)
2117 self.buffer.append(line)
2126 self.buffer.append(line)
2118 more = self.runsource('\n'.join(self.buffer), self.filename)
2127 more = self.runsource('\n'.join(self.buffer), self.filename)
2119 if not more:
2128 if not more:
2120 self.resetbuffer()
2129 self.resetbuffer()
2121 return more
2130 return more
2122
2131
2123 def split_user_input(self, line):
2132 def split_user_input(self, line):
2124 # This is really a hold-over to support ipapi and some extensions
2133 # This is really a hold-over to support ipapi and some extensions
2125 return prefilter.splitUserInput(line)
2134 return prefilter.splitUserInput(line)
2126
2135
2127 def resetbuffer(self):
2136 def resetbuffer(self):
2128 """Reset the input buffer."""
2137 """Reset the input buffer."""
2129 self.buffer[:] = []
2138 self.buffer[:] = []
2130
2139
2131 def raw_input(self,prompt='',continue_prompt=False):
2140 def raw_input(self,prompt='',continue_prompt=False):
2132 """Write a prompt and read a line.
2141 """Write a prompt and read a line.
2133
2142
2134 The returned line does not include the trailing newline.
2143 The returned line does not include the trailing newline.
2135 When the user enters the EOF key sequence, EOFError is raised.
2144 When the user enters the EOF key sequence, EOFError is raised.
2136
2145
2137 Optional inputs:
2146 Optional inputs:
2138
2147
2139 - prompt(''): a string to be printed to prompt the user.
2148 - prompt(''): a string to be printed to prompt the user.
2140
2149
2141 - continue_prompt(False): whether this line is the first one or a
2150 - continue_prompt(False): whether this line is the first one or a
2142 continuation in a sequence of inputs.
2151 continuation in a sequence of inputs.
2143 """
2152 """
2144
2153
2145 # Code run by the user may have modified the readline completer state.
2154 # Code run by the user may have modified the readline completer state.
2146 # We must ensure that our completer is back in place.
2155 # We must ensure that our completer is back in place.
2147 if self.has_readline:
2156 if self.has_readline:
2148 self.set_completer()
2157 self.set_completer()
2149
2158
2150 try:
2159 try:
2151 line = raw_input_original(prompt).decode(self.stdin_encoding)
2160 line = raw_input_original(prompt).decode(self.stdin_encoding)
2152 except ValueError:
2161 except ValueError:
2153 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2162 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2154 " or sys.stdout.close()!\nExiting IPython!")
2163 " or sys.stdout.close()!\nExiting IPython!")
2155 self.ask_exit()
2164 self.ask_exit()
2156 return ""
2165 return ""
2157
2166
2158 # Try to be reasonably smart about not re-indenting pasted input more
2167 # Try to be reasonably smart about not re-indenting pasted input more
2159 # than necessary. We do this by trimming out the auto-indent initial
2168 # than necessary. We do this by trimming out the auto-indent initial
2160 # spaces, if the user's actual input started itself with whitespace.
2169 # spaces, if the user's actual input started itself with whitespace.
2161 #debugx('self.buffer[-1]')
2170 #debugx('self.buffer[-1]')
2162
2171
2163 if self.autoindent:
2172 if self.autoindent:
2164 if num_ini_spaces(line) > self.indent_current_nsp:
2173 if num_ini_spaces(line) > self.indent_current_nsp:
2165 line = line[self.indent_current_nsp:]
2174 line = line[self.indent_current_nsp:]
2166 self.indent_current_nsp = 0
2175 self.indent_current_nsp = 0
2167
2176
2168 # store the unfiltered input before the user has any chance to modify
2177 # store the unfiltered input before the user has any chance to modify
2169 # it.
2178 # it.
2170 if line.strip():
2179 if line.strip():
2171 if continue_prompt:
2180 if continue_prompt:
2172 self.input_hist_raw[-1] += '%s\n' % line
2181 self.input_hist_raw[-1] += '%s\n' % line
2173 if self.has_readline: # and some config option is set?
2182 if self.has_readline: # and some config option is set?
2174 try:
2183 try:
2175 histlen = self.readline.get_current_history_length()
2184 histlen = self.readline.get_current_history_length()
2176 if histlen > 1:
2185 if histlen > 1:
2177 newhist = self.input_hist_raw[-1].rstrip()
2186 newhist = self.input_hist_raw[-1].rstrip()
2178 self.readline.remove_history_item(histlen-1)
2187 self.readline.remove_history_item(histlen-1)
2179 self.readline.replace_history_item(histlen-2,
2188 self.readline.replace_history_item(histlen-2,
2180 newhist.encode(self.stdin_encoding))
2189 newhist.encode(self.stdin_encoding))
2181 except AttributeError:
2190 except AttributeError:
2182 pass # re{move,place}_history_item are new in 2.4.
2191 pass # re{move,place}_history_item are new in 2.4.
2183 else:
2192 else:
2184 self.input_hist_raw.append('%s\n' % line)
2193 self.input_hist_raw.append('%s\n' % line)
2185 # only entries starting at first column go to shadow history
2194 # only entries starting at first column go to shadow history
2186 if line.lstrip() == line:
2195 if line.lstrip() == line:
2187 self.shadowhist.add(line.strip())
2196 self.shadowhist.add(line.strip())
2188 elif not continue_prompt:
2197 elif not continue_prompt:
2189 self.input_hist_raw.append('\n')
2198 self.input_hist_raw.append('\n')
2190 try:
2199 try:
2191 lineout = self.prefilter(line,continue_prompt)
2200 lineout = self.prefilter(line,continue_prompt)
2192 except:
2201 except:
2193 # blanket except, in case a user-defined prefilter crashes, so it
2202 # blanket except, in case a user-defined prefilter crashes, so it
2194 # can't take all of ipython with it.
2203 # can't take all of ipython with it.
2195 self.showtraceback()
2204 self.showtraceback()
2196 return ''
2205 return ''
2197 else:
2206 else:
2198 return lineout
2207 return lineout
2199
2208
2200 def _prefilter(self, line, continue_prompt):
2209 def _prefilter(self, line, continue_prompt):
2201 """Calls different preprocessors, depending on the form of line."""
2210 """Calls different preprocessors, depending on the form of line."""
2202
2211
2203 # All handlers *must* return a value, even if it's blank ('').
2212 # All handlers *must* return a value, even if it's blank ('').
2204
2213
2205 # Lines are NOT logged here. Handlers should process the line as
2214 # Lines are NOT logged here. Handlers should process the line as
2206 # needed, update the cache AND log it (so that the input cache array
2215 # needed, update the cache AND log it (so that the input cache array
2207 # stays synced).
2216 # stays synced).
2208
2217
2209 #.....................................................................
2218 #.....................................................................
2210 # Code begins
2219 # Code begins
2211
2220
2212 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2221 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2213
2222
2214 # save the line away in case we crash, so the post-mortem handler can
2223 # save the line away in case we crash, so the post-mortem handler can
2215 # record it
2224 # record it
2216 self._last_input_line = line
2225 self._last_input_line = line
2217
2226
2218 #print '***line: <%s>' % line # dbg
2227 #print '***line: <%s>' % line # dbg
2219
2228
2220 if not line:
2229 if not line:
2221 # Return immediately on purely empty lines, so that if the user
2230 # Return immediately on purely empty lines, so that if the user
2222 # previously typed some whitespace that started a continuation
2231 # previously typed some whitespace that started a continuation
2223 # prompt, he can break out of that loop with just an empty line.
2232 # prompt, he can break out of that loop with just an empty line.
2224 # This is how the default python prompt works.
2233 # This is how the default python prompt works.
2225
2234
2226 # Only return if the accumulated input buffer was just whitespace!
2235 # Only return if the accumulated input buffer was just whitespace!
2227 if ''.join(self.buffer).isspace():
2236 if ''.join(self.buffer).isspace():
2228 self.buffer[:] = []
2237 self.buffer[:] = []
2229 return ''
2238 return ''
2230
2239
2231 line_info = prefilter.LineInfo(line, continue_prompt)
2240 line_info = prefilter.LineInfo(line, continue_prompt)
2232
2241
2233 # the input history needs to track even empty lines
2242 # the input history needs to track even empty lines
2234 stripped = line.strip()
2243 stripped = line.strip()
2235
2244
2236 if not stripped:
2245 if not stripped:
2237 if not continue_prompt:
2246 if not continue_prompt:
2238 self.outputcache.prompt_count -= 1
2247 self.outputcache.prompt_count -= 1
2239 return self.handle_normal(line_info)
2248 return self.handle_normal(line_info)
2240
2249
2241 # print '***cont',continue_prompt # dbg
2250 # print '***cont',continue_prompt # dbg
2242 # special handlers are only allowed for single line statements
2251 # special handlers are only allowed for single line statements
2243 if continue_prompt and not self.rc.multi_line_specials:
2252 if continue_prompt and not self.rc.multi_line_specials:
2244 return self.handle_normal(line_info)
2253 return self.handle_normal(line_info)
2245
2254
2246
2255
2247 # See whether any pre-existing handler can take care of it
2256 # See whether any pre-existing handler can take care of it
2248 rewritten = self.hooks.input_prefilter(stripped)
2257 rewritten = self.hooks.input_prefilter(stripped)
2249 if rewritten != stripped: # ok, some prefilter did something
2258 if rewritten != stripped: # ok, some prefilter did something
2250 rewritten = line_info.pre + rewritten # add indentation
2259 rewritten = line_info.pre + rewritten # add indentation
2251 return self.handle_normal(prefilter.LineInfo(rewritten,
2260 return self.handle_normal(prefilter.LineInfo(rewritten,
2252 continue_prompt))
2261 continue_prompt))
2253
2262
2254 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2263 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2255
2264
2256 return prefilter.prefilter(line_info, self)
2265 return prefilter.prefilter(line_info, self)
2257
2266
2258
2267
2259 def _prefilter_dumb(self, line, continue_prompt):
2268 def _prefilter_dumb(self, line, continue_prompt):
2260 """simple prefilter function, for debugging"""
2269 """simple prefilter function, for debugging"""
2261 return self.handle_normal(line,continue_prompt)
2270 return self.handle_normal(line,continue_prompt)
2262
2271
2263
2272
2264 def multiline_prefilter(self, line, continue_prompt):
2273 def multiline_prefilter(self, line, continue_prompt):
2265 """ Run _prefilter for each line of input
2274 """ Run _prefilter for each line of input
2266
2275
2267 Covers cases where there are multiple lines in the user entry,
2276 Covers cases where there are multiple lines in the user entry,
2268 which is the case when the user goes back to a multiline history
2277 which is the case when the user goes back to a multiline history
2269 entry and presses enter.
2278 entry and presses enter.
2270
2279
2271 """
2280 """
2272 out = []
2281 out = []
2273 for l in line.rstrip('\n').split('\n'):
2282 for l in line.rstrip('\n').split('\n'):
2274 out.append(self._prefilter(l, continue_prompt))
2283 out.append(self._prefilter(l, continue_prompt))
2275 return '\n'.join(out)
2284 return '\n'.join(out)
2276
2285
2277 # Set the default prefilter() function (this can be user-overridden)
2286 # Set the default prefilter() function (this can be user-overridden)
2278 prefilter = multiline_prefilter
2287 prefilter = multiline_prefilter
2279
2288
2280 def handle_normal(self,line_info):
2289 def handle_normal(self,line_info):
2281 """Handle normal input lines. Use as a template for handlers."""
2290 """Handle normal input lines. Use as a template for handlers."""
2282
2291
2283 # With autoindent on, we need some way to exit the input loop, and I
2292 # With autoindent on, we need some way to exit the input loop, and I
2284 # don't want to force the user to have to backspace all the way to
2293 # don't want to force the user to have to backspace all the way to
2285 # clear the line. The rule will be in this case, that either two
2294 # clear the line. The rule will be in this case, that either two
2286 # lines of pure whitespace in a row, or a line of pure whitespace but
2295 # lines of pure whitespace in a row, or a line of pure whitespace but
2287 # of a size different to the indent level, will exit the input loop.
2296 # of a size different to the indent level, will exit the input loop.
2288 line = line_info.line
2297 line = line_info.line
2289 continue_prompt = line_info.continue_prompt
2298 continue_prompt = line_info.continue_prompt
2290
2299
2291 if (continue_prompt and self.autoindent and line.isspace() and
2300 if (continue_prompt and self.autoindent and line.isspace() and
2292 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2301 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2293 (self.buffer[-1]).isspace() )):
2302 (self.buffer[-1]).isspace() )):
2294 line = ''
2303 line = ''
2295
2304
2296 self.log(line,line,continue_prompt)
2305 self.log(line,line,continue_prompt)
2297 return line
2306 return line
2298
2307
2299 def handle_alias(self,line_info):
2308 def handle_alias(self,line_info):
2300 """Handle alias input lines. """
2309 """Handle alias input lines. """
2301 tgt = self.alias_table[line_info.iFun]
2310 tgt = self.alias_table[line_info.iFun]
2302 # print "=>",tgt #dbg
2311 # print "=>",tgt #dbg
2303 if callable(tgt):
2312 if callable(tgt):
2304 if '$' in line_info.line:
2313 if '$' in line_info.line:
2305 call_meth = '(_ip, _ip.itpl(%s))'
2314 call_meth = '(_ip, _ip.itpl(%s))'
2306 else:
2315 else:
2307 call_meth = '(_ip,%s)'
2316 call_meth = '(_ip,%s)'
2308 line_out = ("%s_sh.%s" + call_meth) % (line_info.preWhitespace,
2317 line_out = ("%s_sh.%s" + call_meth) % (line_info.preWhitespace,
2309 line_info.iFun,
2318 line_info.iFun,
2310 make_quoted_expr(line_info.line))
2319 make_quoted_expr(line_info.line))
2311 else:
2320 else:
2312 transformed = self.expand_aliases(line_info.iFun,line_info.theRest)
2321 transformed = self.expand_aliases(line_info.iFun,line_info.theRest)
2313
2322
2314 # pre is needed, because it carries the leading whitespace. Otherwise
2323 # pre is needed, because it carries the leading whitespace. Otherwise
2315 # aliases won't work in indented sections.
2324 # aliases won't work in indented sections.
2316 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2325 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2317 make_quoted_expr( transformed ))
2326 make_quoted_expr( transformed ))
2318
2327
2319 self.log(line_info.line,line_out,line_info.continue_prompt)
2328 self.log(line_info.line,line_out,line_info.continue_prompt)
2320 #print 'line out:',line_out # dbg
2329 #print 'line out:',line_out # dbg
2321 return line_out
2330 return line_out
2322
2331
2323 def handle_shell_escape(self, line_info):
2332 def handle_shell_escape(self, line_info):
2324 """Execute the line in a shell, empty return value"""
2333 """Execute the line in a shell, empty return value"""
2325 #print 'line in :', `line` # dbg
2334 #print 'line in :', `line` # dbg
2326 line = line_info.line
2335 line = line_info.line
2327 if line.lstrip().startswith('!!'):
2336 if line.lstrip().startswith('!!'):
2328 # rewrite LineInfo's line, iFun and theRest to properly hold the
2337 # rewrite LineInfo's line, iFun and theRest to properly hold the
2329 # call to %sx and the actual command to be executed, so
2338 # call to %sx and the actual command to be executed, so
2330 # handle_magic can work correctly. Note that this works even if
2339 # handle_magic can work correctly. Note that this works even if
2331 # the line is indented, so it handles multi_line_specials
2340 # the line is indented, so it handles multi_line_specials
2332 # properly.
2341 # properly.
2333 new_rest = line.lstrip()[2:]
2342 new_rest = line.lstrip()[2:]
2334 line_info.line = '%ssx %s' % (self.ESC_MAGIC,new_rest)
2343 line_info.line = '%ssx %s' % (self.ESC_MAGIC,new_rest)
2335 line_info.iFun = 'sx'
2344 line_info.iFun = 'sx'
2336 line_info.theRest = new_rest
2345 line_info.theRest = new_rest
2337 return self.handle_magic(line_info)
2346 return self.handle_magic(line_info)
2338 else:
2347 else:
2339 cmd = line.lstrip().lstrip('!')
2348 cmd = line.lstrip().lstrip('!')
2340 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2349 line_out = '%s_ip.system(%s)' % (line_info.preWhitespace,
2341 make_quoted_expr(cmd))
2350 make_quoted_expr(cmd))
2342 # update cache/log and return
2351 # update cache/log and return
2343 self.log(line,line_out,line_info.continue_prompt)
2352 self.log(line,line_out,line_info.continue_prompt)
2344 return line_out
2353 return line_out
2345
2354
2346 def handle_magic(self, line_info):
2355 def handle_magic(self, line_info):
2347 """Execute magic functions."""
2356 """Execute magic functions."""
2348 iFun = line_info.iFun
2357 iFun = line_info.iFun
2349 theRest = line_info.theRest
2358 theRest = line_info.theRest
2350 cmd = '%s_ip.magic(%s)' % (line_info.preWhitespace,
2359 cmd = '%s_ip.magic(%s)' % (line_info.preWhitespace,
2351 make_quoted_expr(iFun + " " + theRest))
2360 make_quoted_expr(iFun + " " + theRest))
2352 self.log(line_info.line,cmd,line_info.continue_prompt)
2361 self.log(line_info.line,cmd,line_info.continue_prompt)
2353 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2362 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2354 return cmd
2363 return cmd
2355
2364
2356 def handle_auto(self, line_info):
2365 def handle_auto(self, line_info):
2357 """Hande lines which can be auto-executed, quoting if requested."""
2366 """Hande lines which can be auto-executed, quoting if requested."""
2358
2367
2359 line = line_info.line
2368 line = line_info.line
2360 iFun = line_info.iFun
2369 iFun = line_info.iFun
2361 theRest = line_info.theRest
2370 theRest = line_info.theRest
2362 pre = line_info.pre
2371 pre = line_info.pre
2363 continue_prompt = line_info.continue_prompt
2372 continue_prompt = line_info.continue_prompt
2364 obj = line_info.ofind(self)['obj']
2373 obj = line_info.ofind(self)['obj']
2365
2374
2366 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2375 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2367
2376
2368 # This should only be active for single-line input!
2377 # This should only be active for single-line input!
2369 if continue_prompt:
2378 if continue_prompt:
2370 self.log(line,line,continue_prompt)
2379 self.log(line,line,continue_prompt)
2371 return line
2380 return line
2372
2381
2373 force_auto = isinstance(obj, IPython.ipapi.IPyAutocall)
2382 force_auto = isinstance(obj, IPython.ipapi.IPyAutocall)
2374 auto_rewrite = True
2383 auto_rewrite = True
2375
2384
2376 if pre == self.ESC_QUOTE:
2385 if pre == self.ESC_QUOTE:
2377 # Auto-quote splitting on whitespace
2386 # Auto-quote splitting on whitespace
2378 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2387 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2379 elif pre == self.ESC_QUOTE2:
2388 elif pre == self.ESC_QUOTE2:
2380 # Auto-quote whole string
2389 # Auto-quote whole string
2381 newcmd = '%s("%s")' % (iFun,theRest)
2390 newcmd = '%s("%s")' % (iFun,theRest)
2382 elif pre == self.ESC_PAREN:
2391 elif pre == self.ESC_PAREN:
2383 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2392 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2384 else:
2393 else:
2385 # Auto-paren.
2394 # Auto-paren.
2386 # We only apply it to argument-less calls if the autocall
2395 # We only apply it to argument-less calls if the autocall
2387 # parameter is set to 2. We only need to check that autocall is <
2396 # parameter is set to 2. We only need to check that autocall is <
2388 # 2, since this function isn't called unless it's at least 1.
2397 # 2, since this function isn't called unless it's at least 1.
2389 if not theRest and (self.rc.autocall < 2) and not force_auto:
2398 if not theRest and (self.rc.autocall < 2) and not force_auto:
2390 newcmd = '%s %s' % (iFun,theRest)
2399 newcmd = '%s %s' % (iFun,theRest)
2391 auto_rewrite = False
2400 auto_rewrite = False
2392 else:
2401 else:
2393 if not force_auto and theRest.startswith('['):
2402 if not force_auto and theRest.startswith('['):
2394 if hasattr(obj,'__getitem__'):
2403 if hasattr(obj,'__getitem__'):
2395 # Don't autocall in this case: item access for an object
2404 # Don't autocall in this case: item access for an object
2396 # which is BOTH callable and implements __getitem__.
2405 # which is BOTH callable and implements __getitem__.
2397 newcmd = '%s %s' % (iFun,theRest)
2406 newcmd = '%s %s' % (iFun,theRest)
2398 auto_rewrite = False
2407 auto_rewrite = False
2399 else:
2408 else:
2400 # if the object doesn't support [] access, go ahead and
2409 # if the object doesn't support [] access, go ahead and
2401 # autocall
2410 # autocall
2402 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2411 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2403 elif theRest.endswith(';'):
2412 elif theRest.endswith(';'):
2404 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2413 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2405 else:
2414 else:
2406 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2415 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2407
2416
2408 if auto_rewrite:
2417 if auto_rewrite:
2409 rw = self.outputcache.prompt1.auto_rewrite() + newcmd
2418 rw = self.outputcache.prompt1.auto_rewrite() + newcmd
2410
2419
2411 try:
2420 try:
2412 # plain ascii works better w/ pyreadline, on some machines, so
2421 # plain ascii works better w/ pyreadline, on some machines, so
2413 # we use it and only print uncolored rewrite if we have unicode
2422 # we use it and only print uncolored rewrite if we have unicode
2414 rw = str(rw)
2423 rw = str(rw)
2415 print >>Term.cout, rw
2424 print >>Term.cout, rw
2416 except UnicodeEncodeError:
2425 except UnicodeEncodeError:
2417 print "-------------->" + newcmd
2426 print "-------------->" + newcmd
2418
2427
2419 # log what is now valid Python, not the actual user input (without the
2428 # log what is now valid Python, not the actual user input (without the
2420 # final newline)
2429 # final newline)
2421 self.log(line,newcmd,continue_prompt)
2430 self.log(line,newcmd,continue_prompt)
2422 return newcmd
2431 return newcmd
2423
2432
2424 def handle_help(self, line_info):
2433 def handle_help(self, line_info):
2425 """Try to get some help for the object.
2434 """Try to get some help for the object.
2426
2435
2427 obj? or ?obj -> basic information.
2436 obj? or ?obj -> basic information.
2428 obj?? or ??obj -> more details.
2437 obj?? or ??obj -> more details.
2429 """
2438 """
2430
2439
2431 line = line_info.line
2440 line = line_info.line
2432 # We need to make sure that we don't process lines which would be
2441 # We need to make sure that we don't process lines which would be
2433 # otherwise valid python, such as "x=1 # what?"
2442 # otherwise valid python, such as "x=1 # what?"
2434 try:
2443 try:
2435 codeop.compile_command(line)
2444 codeop.compile_command(line)
2436 except SyntaxError:
2445 except SyntaxError:
2437 # We should only handle as help stuff which is NOT valid syntax
2446 # We should only handle as help stuff which is NOT valid syntax
2438 if line[0]==self.ESC_HELP:
2447 if line[0]==self.ESC_HELP:
2439 line = line[1:]
2448 line = line[1:]
2440 elif line[-1]==self.ESC_HELP:
2449 elif line[-1]==self.ESC_HELP:
2441 line = line[:-1]
2450 line = line[:-1]
2442 self.log(line,'#?'+line,line_info.continue_prompt)
2451 self.log(line,'#?'+line,line_info.continue_prompt)
2443 if line:
2452 if line:
2444 #print 'line:<%r>' % line # dbg
2453 #print 'line:<%r>' % line # dbg
2445 self.magic_pinfo(line)
2454 self.magic_pinfo(line)
2446 else:
2455 else:
2447 page(self.usage,screen_lines=self.rc.screen_length)
2456 page(self.usage,screen_lines=self.rc.screen_length)
2448 return '' # Empty string is needed here!
2457 return '' # Empty string is needed here!
2449 except:
2458 except:
2450 # Pass any other exceptions through to the normal handler
2459 # Pass any other exceptions through to the normal handler
2451 return self.handle_normal(line_info)
2460 return self.handle_normal(line_info)
2452 else:
2461 else:
2453 # If the code compiles ok, we should handle it normally
2462 # If the code compiles ok, we should handle it normally
2454 return self.handle_normal(line_info)
2463 return self.handle_normal(line_info)
2455
2464
2456 def getapi(self):
2465 def getapi(self):
2457 """ Get an IPApi object for this shell instance
2466 """ Get an IPApi object for this shell instance
2458
2467
2459 Getting an IPApi object is always preferable to accessing the shell
2468 Getting an IPApi object is always preferable to accessing the shell
2460 directly, but this holds true especially for extensions.
2469 directly, but this holds true especially for extensions.
2461
2470
2462 It should always be possible to implement an extension with IPApi
2471 It should always be possible to implement an extension with IPApi
2463 alone. If not, contact maintainer to request an addition.
2472 alone. If not, contact maintainer to request an addition.
2464
2473
2465 """
2474 """
2466 return self.api
2475 return self.api
2467
2476
2468 def handle_emacs(self, line_info):
2477 def handle_emacs(self, line_info):
2469 """Handle input lines marked by python-mode."""
2478 """Handle input lines marked by python-mode."""
2470
2479
2471 # Currently, nothing is done. Later more functionality can be added
2480 # Currently, nothing is done. Later more functionality can be added
2472 # here if needed.
2481 # here if needed.
2473
2482
2474 # The input cache shouldn't be updated
2483 # The input cache shouldn't be updated
2475 return line_info.line
2484 return line_info.line
2476
2485
2477
2486
2478 def mktempfile(self,data=None):
2487 def mktempfile(self,data=None):
2479 """Make a new tempfile and return its filename.
2488 """Make a new tempfile and return its filename.
2480
2489
2481 This makes a call to tempfile.mktemp, but it registers the created
2490 This makes a call to tempfile.mktemp, but it registers the created
2482 filename internally so ipython cleans it up at exit time.
2491 filename internally so ipython cleans it up at exit time.
2483
2492
2484 Optional inputs:
2493 Optional inputs:
2485
2494
2486 - data(None): if data is given, it gets written out to the temp file
2495 - data(None): if data is given, it gets written out to the temp file
2487 immediately, and the file is closed again."""
2496 immediately, and the file is closed again."""
2488
2497
2489 filename = tempfile.mktemp('.py','ipython_edit_')
2498 filename = tempfile.mktemp('.py','ipython_edit_')
2490 self.tempfiles.append(filename)
2499 self.tempfiles.append(filename)
2491
2500
2492 if data:
2501 if data:
2493 tmp_file = open(filename,'w')
2502 tmp_file = open(filename,'w')
2494 tmp_file.write(data)
2503 tmp_file.write(data)
2495 tmp_file.close()
2504 tmp_file.close()
2496 return filename
2505 return filename
2497
2506
2498 def write(self,data):
2507 def write(self,data):
2499 """Write a string to the default output"""
2508 """Write a string to the default output"""
2500 Term.cout.write(data)
2509 Term.cout.write(data)
2501
2510
2502 def write_err(self,data):
2511 def write_err(self,data):
2503 """Write a string to the default error output"""
2512 """Write a string to the default error output"""
2504 Term.cerr.write(data)
2513 Term.cerr.write(data)
2505
2514
2506 def ask_exit(self):
2515 def ask_exit(self):
2507 """ Call for exiting. Can be overiden and used as a callback. """
2516 """ Call for exiting. Can be overiden and used as a callback. """
2508 self.exit_now = True
2517 self.exit_now = True
2509
2518
2510 def exit(self):
2519 def exit(self):
2511 """Handle interactive exit.
2520 """Handle interactive exit.
2512
2521
2513 This method calls the ask_exit callback."""
2522 This method calls the ask_exit callback."""
2514
2523
2515 if self.rc.confirm_exit:
2524 if self.rc.confirm_exit:
2516 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2525 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2517 self.ask_exit()
2526 self.ask_exit()
2518 else:
2527 else:
2519 self.ask_exit()
2528 self.ask_exit()
2520
2529
2521 def safe_execfile(self,fname,*where,**kw):
2530 def safe_execfile(self,fname,*where,**kw):
2522 """A safe version of the builtin execfile().
2531 """A safe version of the builtin execfile().
2523
2532
2524 This version will never throw an exception, and knows how to handle
2533 This version will never throw an exception, and knows how to handle
2525 ipython logs as well.
2534 ipython logs as well.
2526
2535
2527 :Parameters:
2536 :Parameters:
2528 fname : string
2537 fname : string
2529 Name of the file to be executed.
2538 Name of the file to be executed.
2530
2539
2531 where : tuple
2540 where : tuple
2532 One or two namespaces, passed to execfile() as (globals,locals).
2541 One or two namespaces, passed to execfile() as (globals,locals).
2533 If only one is given, it is passed as both.
2542 If only one is given, it is passed as both.
2534
2543
2535 :Keywords:
2544 :Keywords:
2536 islog : boolean (False)
2545 islog : boolean (False)
2537
2546
2538 quiet : boolean (True)
2547 quiet : boolean (True)
2539
2548
2540 exit_ignore : boolean (False)
2549 exit_ignore : boolean (False)
2541 """
2550 """
2542
2551
2543 def syspath_cleanup():
2552 def syspath_cleanup():
2544 """Internal cleanup routine for sys.path."""
2553 """Internal cleanup routine for sys.path."""
2545 if add_dname:
2554 if add_dname:
2546 try:
2555 try:
2547 sys.path.remove(dname)
2556 sys.path.remove(dname)
2548 except ValueError:
2557 except ValueError:
2549 # For some reason the user has already removed it, ignore.
2558 # For some reason the user has already removed it, ignore.
2550 pass
2559 pass
2551
2560
2552 fname = os.path.expanduser(fname)
2561 fname = os.path.expanduser(fname)
2553
2562
2554 # Find things also in current directory. This is needed to mimic the
2563 # Find things also in current directory. This is needed to mimic the
2555 # behavior of running a script from the system command line, where
2564 # behavior of running a script from the system command line, where
2556 # Python inserts the script's directory into sys.path
2565 # Python inserts the script's directory into sys.path
2557 dname = os.path.dirname(os.path.abspath(fname))
2566 dname = os.path.dirname(os.path.abspath(fname))
2558 add_dname = False
2567 add_dname = False
2559 if dname not in sys.path:
2568 if dname not in sys.path:
2560 sys.path.insert(0,dname)
2569 sys.path.insert(0,dname)
2561 add_dname = True
2570 add_dname = True
2562
2571
2563 try:
2572 try:
2564 xfile = open(fname)
2573 xfile = open(fname)
2565 except:
2574 except:
2566 print >> Term.cerr, \
2575 print >> Term.cerr, \
2567 'Could not open file <%s> for safe execution.' % fname
2576 'Could not open file <%s> for safe execution.' % fname
2568 syspath_cleanup()
2577 syspath_cleanup()
2569 return None
2578 return None
2570
2579
2571 kw.setdefault('islog',0)
2580 kw.setdefault('islog',0)
2572 kw.setdefault('quiet',1)
2581 kw.setdefault('quiet',1)
2573 kw.setdefault('exit_ignore',0)
2582 kw.setdefault('exit_ignore',0)
2574
2583
2575 first = xfile.readline()
2584 first = xfile.readline()
2576 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2585 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2577 xfile.close()
2586 xfile.close()
2578 # line by line execution
2587 # line by line execution
2579 if first.startswith(loghead) or kw['islog']:
2588 if first.startswith(loghead) or kw['islog']:
2580 print 'Loading log file <%s> one line at a time...' % fname
2589 print 'Loading log file <%s> one line at a time...' % fname
2581 if kw['quiet']:
2590 if kw['quiet']:
2582 stdout_save = sys.stdout
2591 stdout_save = sys.stdout
2583 sys.stdout = StringIO.StringIO()
2592 sys.stdout = StringIO.StringIO()
2584 try:
2593 try:
2585 globs,locs = where[0:2]
2594 globs,locs = where[0:2]
2586 except:
2595 except:
2587 try:
2596 try:
2588 globs = locs = where[0]
2597 globs = locs = where[0]
2589 except:
2598 except:
2590 globs = locs = globals()
2599 globs = locs = globals()
2591 badblocks = []
2600 badblocks = []
2592
2601
2593 # we also need to identify indented blocks of code when replaying
2602 # we also need to identify indented blocks of code when replaying
2594 # logs and put them together before passing them to an exec
2603 # logs and put them together before passing them to an exec
2595 # statement. This takes a bit of regexp and look-ahead work in the
2604 # statement. This takes a bit of regexp and look-ahead work in the
2596 # file. It's easiest if we swallow the whole thing in memory
2605 # file. It's easiest if we swallow the whole thing in memory
2597 # first, and manually walk through the lines list moving the
2606 # first, and manually walk through the lines list moving the
2598 # counter ourselves.
2607 # counter ourselves.
2599 indent_re = re.compile('\s+\S')
2608 indent_re = re.compile('\s+\S')
2600 xfile = open(fname)
2609 xfile = open(fname)
2601 filelines = xfile.readlines()
2610 filelines = xfile.readlines()
2602 xfile.close()
2611 xfile.close()
2603 nlines = len(filelines)
2612 nlines = len(filelines)
2604 lnum = 0
2613 lnum = 0
2605 while lnum < nlines:
2614 while lnum < nlines:
2606 line = filelines[lnum]
2615 line = filelines[lnum]
2607 lnum += 1
2616 lnum += 1
2608 # don't re-insert logger status info into cache
2617 # don't re-insert logger status info into cache
2609 if line.startswith('#log#'):
2618 if line.startswith('#log#'):
2610 continue
2619 continue
2611 else:
2620 else:
2612 # build a block of code (maybe a single line) for execution
2621 # build a block of code (maybe a single line) for execution
2613 block = line
2622 block = line
2614 try:
2623 try:
2615 next = filelines[lnum] # lnum has already incremented
2624 next = filelines[lnum] # lnum has already incremented
2616 except:
2625 except:
2617 next = None
2626 next = None
2618 while next and indent_re.match(next):
2627 while next and indent_re.match(next):
2619 block += next
2628 block += next
2620 lnum += 1
2629 lnum += 1
2621 try:
2630 try:
2622 next = filelines[lnum]
2631 next = filelines[lnum]
2623 except:
2632 except:
2624 next = None
2633 next = None
2625 # now execute the block of one or more lines
2634 # now execute the block of one or more lines
2626 try:
2635 try:
2627 exec block in globs,locs
2636 exec block in globs,locs
2628 except SystemExit:
2637 except SystemExit:
2629 pass
2638 pass
2630 except:
2639 except:
2631 badblocks.append(block.rstrip())
2640 badblocks.append(block.rstrip())
2632 if kw['quiet']: # restore stdout
2641 if kw['quiet']: # restore stdout
2633 sys.stdout.close()
2642 sys.stdout.close()
2634 sys.stdout = stdout_save
2643 sys.stdout = stdout_save
2635 print 'Finished replaying log file <%s>' % fname
2644 print 'Finished replaying log file <%s>' % fname
2636 if badblocks:
2645 if badblocks:
2637 print >> sys.stderr, ('\nThe following lines/blocks in file '
2646 print >> sys.stderr, ('\nThe following lines/blocks in file '
2638 '<%s> reported errors:' % fname)
2647 '<%s> reported errors:' % fname)
2639
2648
2640 for badline in badblocks:
2649 for badline in badblocks:
2641 print >> sys.stderr, badline
2650 print >> sys.stderr, badline
2642 else: # regular file execution
2651 else: # regular file execution
2643 try:
2652 try:
2644 if sys.platform == 'win32' and sys.version_info < (2,5,1):
2653 if sys.platform == 'win32' and sys.version_info < (2,5,1):
2645 # Work around a bug in Python for Windows. The bug was
2654 # Work around a bug in Python for Windows. The bug was
2646 # fixed in in Python 2.5 r54159 and 54158, but that's still
2655 # fixed in in Python 2.5 r54159 and 54158, but that's still
2647 # SVN Python as of March/07. For details, see:
2656 # SVN Python as of March/07. For details, see:
2648 # http://projects.scipy.org/ipython/ipython/ticket/123
2657 # http://projects.scipy.org/ipython/ipython/ticket/123
2649 try:
2658 try:
2650 globs,locs = where[0:2]
2659 globs,locs = where[0:2]
2651 except:
2660 except:
2652 try:
2661 try:
2653 globs = locs = where[0]
2662 globs = locs = where[0]
2654 except:
2663 except:
2655 globs = locs = globals()
2664 globs = locs = globals()
2656 exec file(fname) in globs,locs
2665 exec file(fname) in globs,locs
2657 else:
2666 else:
2658 execfile(fname,*where)
2667 execfile(fname,*where)
2659 except SyntaxError:
2668 except SyntaxError:
2660 self.showsyntaxerror()
2669 self.showsyntaxerror()
2661 warn('Failure executing file: <%s>' % fname)
2670 warn('Failure executing file: <%s>' % fname)
2662 except SystemExit,status:
2671 except SystemExit,status:
2663 # Code that correctly sets the exit status flag to success (0)
2672 # Code that correctly sets the exit status flag to success (0)
2664 # shouldn't be bothered with a traceback. Note that a plain
2673 # shouldn't be bothered with a traceback. Note that a plain
2665 # sys.exit() does NOT set the message to 0 (it's empty) so that
2674 # sys.exit() does NOT set the message to 0 (it's empty) so that
2666 # will still get a traceback. Note that the structure of the
2675 # will still get a traceback. Note that the structure of the
2667 # SystemExit exception changed between Python 2.4 and 2.5, so
2676 # SystemExit exception changed between Python 2.4 and 2.5, so
2668 # the checks must be done in a version-dependent way.
2677 # the checks must be done in a version-dependent way.
2669 show = False
2678 show = False
2670
2679
2671 if sys.version_info[:2] > (2,5):
2680 if sys.version_info[:2] > (2,5):
2672 if status.message!=0 and not kw['exit_ignore']:
2681 if status.message!=0 and not kw['exit_ignore']:
2673 show = True
2682 show = True
2674 else:
2683 else:
2675 if status.code and not kw['exit_ignore']:
2684 if status.code and not kw['exit_ignore']:
2676 show = True
2685 show = True
2677 if show:
2686 if show:
2678 self.showtraceback()
2687 self.showtraceback()
2679 warn('Failure executing file: <%s>' % fname)
2688 warn('Failure executing file: <%s>' % fname)
2680 except:
2689 except:
2681 self.showtraceback()
2690 self.showtraceback()
2682 warn('Failure executing file: <%s>' % fname)
2691 warn('Failure executing file: <%s>' % fname)
2683
2692
2684 syspath_cleanup()
2693 syspath_cleanup()
2685
2694
2686 #************************* end of file <iplib.py> *****************************
2695 #************************* end of file <iplib.py> *****************************
@@ -1,123 +1,124 b''
1 # encoding: utf-8
1 # encoding: utf-8
2
2
3 """Default kernel configuration."""
3 """Default kernel configuration."""
4
4
5 __docformat__ = "restructuredtext en"
5 __docformat__ = "restructuredtext en"
6
6
7 #-------------------------------------------------------------------------------
7 #-------------------------------------------------------------------------------
8 # Copyright (C) 2008 The IPython Development Team
8 # Copyright (C) 2008 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 from os.path import join as pjoin
18 from os.path import join as pjoin
19
19
20 from IPython.external.configobj import ConfigObj
20 from IPython.external.configobj import ConfigObj
21 from IPython.config.api import ConfigObjManager
21 from IPython.config.api import ConfigObjManager
22 from IPython.genutils import get_ipython_dir, get_security_dir
22 from IPython.genutils import get_ipython_dir, get_security_dir
23
23
24 default_kernel_config = ConfigObj()
24 default_kernel_config = ConfigObj()
25
25
26 security_dir = get_security_dir()
26 security_dir = get_security_dir()
27
27
28 #-------------------------------------------------------------------------------
28 #-------------------------------------------------------------------------------
29 # Engine Configuration
29 # Engine Configuration
30 #-------------------------------------------------------------------------------
30 #-------------------------------------------------------------------------------
31
31
32 engine_config = dict(
32 engine_config = dict(
33 logfile = '', # Empty means log to stdout
33 logfile = '', # Empty means log to stdout
34 furl_file = pjoin(security_dir, 'ipcontroller-engine.furl')
34 furl_file = pjoin(security_dir, 'ipcontroller-engine.furl')
35 )
35 )
36
36
37 #-------------------------------------------------------------------------------
37 #-------------------------------------------------------------------------------
38 # MPI Configuration
38 # MPI Configuration
39 #-------------------------------------------------------------------------------
39 #-------------------------------------------------------------------------------
40
40
41 mpi_config = dict(
41 mpi_config = dict(
42 mpi4py = """from mpi4py import MPI as mpi
42 mpi4py = """from mpi4py import MPI as mpi
43 mpi.size = mpi.COMM_WORLD.Get_size()
43 mpi.size = mpi.COMM_WORLD.Get_size()
44 mpi.rank = mpi.COMM_WORLD.Get_rank()
44 mpi.rank = mpi.COMM_WORLD.Get_rank()
45 """,
45 """,
46 pytrilinos = """from PyTrilinos import Epetra
46 pytrilinos = """from PyTrilinos import Epetra
47 class SimpleStruct:
47 class SimpleStruct:
48 pass
48 pass
49 mpi = SimpleStruct()
49 mpi = SimpleStruct()
50 mpi.rank = 0
50 mpi.rank = 0
51 mpi.size = 0
51 mpi.size = 0
52 """,
52 """,
53 default = ''
53 default = ''
54 )
54 )
55
55
56 #-------------------------------------------------------------------------------
56 #-------------------------------------------------------------------------------
57 # Controller Configuration
57 # Controller Configuration
58 #-------------------------------------------------------------------------------
58 #-------------------------------------------------------------------------------
59
59
60 controller_config = dict(
60 controller_config = dict(
61
61
62 logfile = '', # Empty means log to stdout
62 logfile = '', # Empty means log to stdout
63 import_statement = '',
63 import_statement = '',
64 reuse_furls = False, # If False, old furl files are deleted
64
65
65 engine_tub = dict(
66 engine_tub = dict(
66 ip = '', # Empty string means all interfaces
67 ip = '', # Empty string means all interfaces
67 port = 0, # 0 means pick a port for me
68 port = 0, # 0 means pick a port for me
68 location = '', # Empty string means try to set automatically
69 location = '', # Empty string means try to set automatically
69 secure = True,
70 secure = True,
70 cert_file = pjoin(security_dir, 'ipcontroller-engine.pem'),
71 cert_file = pjoin(security_dir, 'ipcontroller-engine.pem'),
71 ),
72 ),
72 engine_fc_interface = 'IPython.kernel.enginefc.IFCControllerBase',
73 engine_fc_interface = 'IPython.kernel.enginefc.IFCControllerBase',
73 engine_furl_file = pjoin(security_dir, 'ipcontroller-engine.furl'),
74 engine_furl_file = pjoin(security_dir, 'ipcontroller-engine.furl'),
74
75
75 controller_interfaces = dict(
76 controller_interfaces = dict(
76 # multiengine = dict(
77 # multiengine = dict(
77 # controller_interface = 'IPython.kernel.multiengine.IMultiEngine',
78 # controller_interface = 'IPython.kernel.multiengine.IMultiEngine',
78 # fc_interface = 'IPython.kernel.multienginefc.IFCMultiEngine',
79 # fc_interface = 'IPython.kernel.multienginefc.IFCMultiEngine',
79 # furl_file = 'ipcontroller-mec.furl'
80 # furl_file = 'ipcontroller-mec.furl'
80 # ),
81 # ),
81 task = dict(
82 task = dict(
82 controller_interface = 'IPython.kernel.task.ITaskController',
83 controller_interface = 'IPython.kernel.task.ITaskController',
83 fc_interface = 'IPython.kernel.taskfc.IFCTaskController',
84 fc_interface = 'IPython.kernel.taskfc.IFCTaskController',
84 furl_file = pjoin(security_dir, 'ipcontroller-tc.furl')
85 furl_file = pjoin(security_dir, 'ipcontroller-tc.furl')
85 ),
86 ),
86 multiengine = dict(
87 multiengine = dict(
87 controller_interface = 'IPython.kernel.multiengine.IMultiEngine',
88 controller_interface = 'IPython.kernel.multiengine.IMultiEngine',
88 fc_interface = 'IPython.kernel.multienginefc.IFCSynchronousMultiEngine',
89 fc_interface = 'IPython.kernel.multienginefc.IFCSynchronousMultiEngine',
89 furl_file = pjoin(security_dir, 'ipcontroller-mec.furl')
90 furl_file = pjoin(security_dir, 'ipcontroller-mec.furl')
90 )
91 )
91 ),
92 ),
92
93
93 client_tub = dict(
94 client_tub = dict(
94 ip = '', # Empty string means all interfaces
95 ip = '', # Empty string means all interfaces
95 port = 0, # 0 means pick a port for me
96 port = 0, # 0 means pick a port for me
96 location = '', # Empty string means try to set automatically
97 location = '', # Empty string means try to set automatically
97 secure = True,
98 secure = True,
98 cert_file = pjoin(security_dir, 'ipcontroller-client.pem')
99 cert_file = pjoin(security_dir, 'ipcontroller-client.pem')
99 )
100 )
100 )
101 )
101
102
102 #-------------------------------------------------------------------------------
103 #-------------------------------------------------------------------------------
103 # Client Configuration
104 # Client Configuration
104 #-------------------------------------------------------------------------------
105 #-------------------------------------------------------------------------------
105
106
106 client_config = dict(
107 client_config = dict(
107 client_interfaces = dict(
108 client_interfaces = dict(
108 task = dict(
109 task = dict(
109 furl_file = pjoin(security_dir, 'ipcontroller-tc.furl')
110 furl_file = pjoin(security_dir, 'ipcontroller-tc.furl')
110 ),
111 ),
111 multiengine = dict(
112 multiengine = dict(
112 furl_file = pjoin(security_dir, 'ipcontroller-mec.furl')
113 furl_file = pjoin(security_dir, 'ipcontroller-mec.furl')
113 )
114 )
114 )
115 )
115 )
116 )
116
117
117 default_kernel_config['engine'] = engine_config
118 default_kernel_config['engine'] = engine_config
118 default_kernel_config['mpi'] = mpi_config
119 default_kernel_config['mpi'] = mpi_config
119 default_kernel_config['controller'] = controller_config
120 default_kernel_config['controller'] = controller_config
120 default_kernel_config['client'] = client_config
121 default_kernel_config['client'] = client_config
121
122
122
123
123 config_manager = ConfigObjManager(default_kernel_config, 'IPython.kernel.ini') No newline at end of file
124 config_manager = ConfigObjManager(default_kernel_config, 'IPython.kernel.ini')
@@ -1,68 +1,70 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 Test the output capture at the OS level, using file descriptors.
3 Test the output capture at the OS level, using file descriptors.
4 """
4 """
5
5
6 __docformat__ = "restructuredtext en"
6 __docformat__ = "restructuredtext en"
7
7
8 #-------------------------------------------------------------------------------
8 #-------------------------------------------------------------------------------
9 # Copyright (C) 2008 The IPython Development Team
9 # Copyright (C) 2008 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is
11 # Distributed under the terms of the BSD License. The full license is
12 # in the file COPYING, distributed as part of this software.
12 # in the file COPYING, distributed as part of this software.
13 #-------------------------------------------------------------------------------
13 #-------------------------------------------------------------------------------
14
14
15
15
16 # Stdlib imports
16 import os
17 import os
17 from cStringIO import StringIO
18 from cStringIO import StringIO
18
19
19 # FIXME:
20 # Our own imports
20 import nose
21 from IPython.testing import decorators as dec
21 import sys
22 if sys.platform == 'win32':
23 raise nose.SkipTest("These tests are not reliable under windows")
24
22
23 #-----------------------------------------------------------------------------
24 # Test functions
25
26 @dec.skip_win32
25 def test_redirector():
27 def test_redirector():
26 """ Checks that the redirector can be used to do synchronous capture.
28 """ Checks that the redirector can be used to do synchronous capture.
27 """
29 """
28 from IPython.kernel.core.fd_redirector import FDRedirector
30 from IPython.kernel.core.fd_redirector import FDRedirector
29 r = FDRedirector()
31 r = FDRedirector()
30 out = StringIO()
32 out = StringIO()
31 try:
33 try:
32 r.start()
34 r.start()
33 for i in range(10):
35 for i in range(10):
34 os.system('echo %ic' % i)
36 os.system('echo %ic' % i)
35 print >>out, r.getvalue(),
37 print >>out, r.getvalue(),
36 print >>out, i
38 print >>out, i
37 except:
39 except:
38 r.stop()
40 r.stop()
39 raise
41 raise
40 r.stop()
42 r.stop()
41 result1 = out.getvalue()
43 result1 = out.getvalue()
42 result2 = "".join("%ic\n%i\n" %(i, i) for i in range(10))
44 result2 = "".join("%ic\n%i\n" %(i, i) for i in range(10))
43 assert result1 == result2
45 assert result1 == result2
44
46
47
48 @dec.skip_win32
45 def test_redirector_output_trap():
49 def test_redirector_output_trap():
46 """ This test check not only that the redirector_output_trap does
50 """ This test check not only that the redirector_output_trap does
47 trap the output, but also that it does it in a gready way, that
51 trap the output, but also that it does it in a gready way, that
48 is by calling the callback ASAP.
52 is by calling the callback ASAP.
49 """
53 """
50 from IPython.kernel.core.redirector_output_trap import RedirectorOutputTrap
54 from IPython.kernel.core.redirector_output_trap import RedirectorOutputTrap
51 out = StringIO()
55 out = StringIO()
52 trap = RedirectorOutputTrap(out.write, out.write)
56 trap = RedirectorOutputTrap(out.write, out.write)
53 try:
57 try:
54 trap.set()
58 trap.set()
55 for i in range(10):
59 for i in range(10):
56 os.system('echo %ic' % i)
60 os.system('echo %ic' % i)
57 print "%ip" % i
61 print "%ip" % i
58 print >>out, i
62 print >>out, i
59 except:
63 except:
60 trap.unset()
64 trap.unset()
61 raise
65 raise
62 trap.unset()
66 trap.unset()
63 result1 = out.getvalue()
67 result1 = out.getvalue()
64 result2 = "".join("%ic\n%ip\n%i\n" %(i, i, i) for i in range(10))
68 result2 = "".join("%ic\n%ip\n%i\n" %(i, i, i) for i in range(10))
65 assert result1 == result2
69 assert result1 == result2
66
70
67
68
@@ -1,87 +1,92 b''
1 # encoding: utf-8
1 # encoding: utf-8
2
2
3 """A class that manages the engines connection to the controller."""
3 """A class that manages the engines connection to the controller."""
4
4
5 __docformat__ = "restructuredtext en"
5 __docformat__ = "restructuredtext en"
6
6
7 #-------------------------------------------------------------------------------
7 #-------------------------------------------------------------------------------
8 # Copyright (C) 2008 The IPython Development Team
8 # Copyright (C) 2008 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 os
18 import os
19 import cPickle as pickle
19 import cPickle as pickle
20
20
21 from twisted.python import log
21 from twisted.python import log, failure
22 from twisted.internet import defer
22
23
23 from IPython.kernel.fcutil import find_furl
24 from IPython.kernel.fcutil import find_furl
24 from IPython.kernel.enginefc import IFCEngine
25 from IPython.kernel.enginefc import IFCEngine
25
26
26 #-------------------------------------------------------------------------------
27 #-------------------------------------------------------------------------------
27 # The ClientConnector class
28 # The ClientConnector class
28 #-------------------------------------------------------------------------------
29 #-------------------------------------------------------------------------------
29
30
30 class EngineConnector(object):
31 class EngineConnector(object):
31 """Manage an engines connection to a controller.
32 """Manage an engines connection to a controller.
32
33
33 This class takes a foolscap `Tub` and provides a `connect_to_controller`
34 This class takes a foolscap `Tub` and provides a `connect_to_controller`
34 method that will use the `Tub` to connect to a controller and register
35 method that will use the `Tub` to connect to a controller and register
35 the engine with the controller.
36 the engine with the controller.
36 """
37 """
37
38
38 def __init__(self, tub):
39 def __init__(self, tub):
39 self.tub = tub
40 self.tub = tub
40
41
41 def connect_to_controller(self, engine_service, furl_or_file):
42 def connect_to_controller(self, engine_service, furl_or_file):
42 """
43 """
43 Make a connection to a controller specified by a furl.
44 Make a connection to a controller specified by a furl.
44
45
45 This method takes an `IEngineBase` instance and a foolcap URL and uses
46 This method takes an `IEngineBase` instance and a foolcap URL and uses
46 the `tub` attribute to make a connection to the controller. The
47 the `tub` attribute to make a connection to the controller. The
47 foolscap URL contains all the information needed to connect to the
48 foolscap URL contains all the information needed to connect to the
48 controller, including the ip and port as well as any encryption and
49 controller, including the ip and port as well as any encryption and
49 authentication information needed for the connection.
50 authentication information needed for the connection.
50
51
51 After getting a reference to the controller, this method calls the
52 After getting a reference to the controller, this method calls the
52 `register_engine` method of the controller to actually register the
53 `register_engine` method of the controller to actually register the
53 engine.
54 engine.
54
55
55 :Parameters:
56 :Parameters:
56 engine_service : IEngineBase
57 engine_service : IEngineBase
57 An instance of an `IEngineBase` implementer
58 An instance of an `IEngineBase` implementer
58 furl_or_file : str
59 furl_or_file : str
59 A furl or a filename containing a furl
60 A furl or a filename containing a furl
60 """
61 """
61 if not self.tub.running:
62 if not self.tub.running:
62 self.tub.startService()
63 self.tub.startService()
63 self.engine_service = engine_service
64 self.engine_service = engine_service
64 self.engine_reference = IFCEngine(self.engine_service)
65 self.engine_reference = IFCEngine(self.engine_service)
66 try:
65 self.furl = find_furl(furl_or_file)
67 self.furl = find_furl(furl_or_file)
68 except ValueError:
69 return defer.fail(failure.Failure())
70 # return defer.fail(failure.Failure(ValueError('not a valid furl or furl file: %r' % furl_or_file)))
66 d = self.tub.getReference(self.furl)
71 d = self.tub.getReference(self.furl)
67 d.addCallbacks(self._register, self._log_failure)
72 d.addCallbacks(self._register, self._log_failure)
68 return d
73 return d
69
74
70 def _log_failure(self, reason):
75 def _log_failure(self, reason):
71 log.err('engine registration failed:')
76 log.err('EngineConnector: engine registration failed:')
72 log.err(reason)
77 log.err(reason)
73 return reason
78 return reason
74
79
75 def _register(self, rr):
80 def _register(self, rr):
76 self.remote_ref = rr
81 self.remote_ref = rr
77 # Now register myself with the controller
82 # Now register myself with the controller
78 desired_id = self.engine_service.id
83 desired_id = self.engine_service.id
79 d = self.remote_ref.callRemote('register_engine', self.engine_reference,
84 d = self.remote_ref.callRemote('register_engine', self.engine_reference,
80 desired_id, os.getpid(), pickle.dumps(self.engine_service.properties,2))
85 desired_id, os.getpid(), pickle.dumps(self.engine_service.properties,2))
81 return d.addCallbacks(self._reference_sent, self._log_failure)
86 return d.addCallbacks(self._reference_sent, self._log_failure)
82
87
83 def _reference_sent(self, registration_dict):
88 def _reference_sent(self, registration_dict):
84 self.engine_service.id = registration_dict['id']
89 self.engine_service.id = registration_dict['id']
85 log.msg("engine registration succeeded, got id: %r" % self.engine_service.id)
90 log.msg("engine registration succeeded, got id: %r" % self.engine_service.id)
86 return self.engine_service.id
91 return self.engine_service.id
87
92
This diff has been collapsed as it changes many lines, (745 lines changed) Show them Hide them
@@ -1,347 +1,486 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 """Start an IPython cluster conveniently, either locally or remotely.
4 """Start an IPython cluster = (controller + engines)."""
5
5
6 Basic usage
6 #-----------------------------------------------------------------------------
7 -----------
8
9 For local operation, the simplest mode of usage is:
10
11 %prog -n N
12
13 where N is the number of engines you want started.
14
15 For remote operation, you must call it with a cluster description file:
16
17 %prog -f clusterfile.py
18
19 The cluster file is a normal Python script which gets run via execfile(). You
20 can have arbitrary logic in it, but all that matters is that at the end of the
21 execution, it declares the variables 'controller', 'engines', and optionally
22 'sshx'. See the accompanying examples for details on what these variables must
23 contain.
24
25
26 Notes
27 -----
28
29 WARNING: this code is still UNFINISHED and EXPERIMENTAL! It is incomplete,
30 some listed options are not really implemented, and all of its interfaces are
31 subject to change.
32
33 When operating over SSH for a remote cluster, this program relies on the
34 existence of a particular script called 'sshx'. This script must live in the
35 target systems where you'll be running your controller and engines, and is
36 needed to configure your PATH and PYTHONPATH variables for further execution of
37 python code at the other end of an SSH connection. The script can be as simple
38 as:
39
40 #!/bin/sh
41 . $HOME/.bashrc
42 "$@"
43
44 which is the default one provided by IPython. You can modify this or provide
45 your own. Since it's quite likely that for different clusters you may need
46 this script to configure things differently or that it may live in different
47 locations, its full path can be set in the same file where you define the
48 cluster setup. IPython's order of evaluation for this variable is the
49 following:
50
51 a) Internal default: 'sshx'. This only works if it is in the default system
52 path which SSH sets up in non-interactive mode.
53
54 b) Environment variable: if $IPYTHON_SSHX is defined, this overrides the
55 internal default.
56
57 c) Variable 'sshx' in the cluster configuration file: finally, this will
58 override the previous two values.
59
60 This code is Unix-only, with precious little hope of any of this ever working
61 under Windows, since we need SSH from the ground up, we background processes,
62 etc. Ports of this functionality to Windows are welcome.
63
64
65 Call summary
66 ------------
67
68 %prog [options]
69 """
70
71 __docformat__ = "restructuredtext en"
72
73 #-------------------------------------------------------------------------------
74 # Copyright (C) 2008 The IPython Development Team
7 # Copyright (C) 2008 The IPython Development Team
75 #
8 #
76 # 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
77 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
78 #-------------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
79
12
80 #-------------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
81 # Stdlib imports
14 # Imports
82 #-------------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
83
16
84 import os
17 import os
85 import signal
18 import re
86 import sys
19 import sys
87 import time
20 import signal
88
21 pjoin = os.path.join
89 from optparse import OptionParser
90 from subprocess import Popen,call
91
92 #---------------------------------------------------------------------------
93 # IPython imports
94 #---------------------------------------------------------------------------
95 from IPython.tools import utils
96 from IPython.genutils import get_ipython_dir
97
98 #---------------------------------------------------------------------------
99 # Normal code begins
100 #---------------------------------------------------------------------------
101
102 def parse_args():
103 """Parse command line and return opts,args."""
104
105 parser = OptionParser(usage=__doc__)
106 newopt = parser.add_option # shorthand
107
108 newopt("--controller-port", type="int", dest="controllerport",
109 help="the TCP port the controller is listening on")
110
22
111 newopt("--controller-ip", type="string", dest="controllerip",
23 from twisted.internet import reactor, defer
112 help="the TCP ip address of the controller")
24 from twisted.internet.protocol import ProcessProtocol
25 from twisted.python import failure, log
26 from twisted.internet.error import ProcessDone, ProcessTerminated
27 from twisted.internet.utils import getProcessOutput
113
28
114 newopt("-n", "--num", type="int", dest="n",default=2,
29 from IPython.external import argparse
115 help="the number of engines to start")
30 from IPython.external import Itpl
31 from IPython.kernel.twistedutil import gatherBoth
32 from IPython.kernel.util import printer
33 from IPython.genutils import get_ipython_dir, num_cpus
116
34
117 newopt("--engine-port", type="int", dest="engineport",
35 #-----------------------------------------------------------------------------
118 help="the TCP port the controller will listen on for engine "
36 # General process handling code
119 "connections")
37 #-----------------------------------------------------------------------------
120
38
121 newopt("--engine-ip", type="string", dest="engineip",
39 def find_exe(cmd):
122 help="the TCP ip address the controller will listen on "
40 try:
123 "for engine connections")
41 import win32api
42 except ImportError:
43 raise ImportError('you need to have pywin32 installed for this to work')
44 else:
45 (path, offest) = win32api.SearchPath(os.environ['PATH'],cmd)
46 return path
124
47
125 newopt("--mpi", type="string", dest="mpi",
48 class ProcessStateError(Exception):
126 help="use mpi with package: for instance --mpi=mpi4py")
49 pass
127
50
128 newopt("-l", "--logfile", type="string", dest="logfile",
51 class UnknownStatus(Exception):
129 help="log file name")
52 pass
130
53
131 newopt('-f','--cluster-file',dest='clusterfile',
54 class LauncherProcessProtocol(ProcessProtocol):
132 help='file describing a remote cluster')
55 """
56 A ProcessProtocol to go with the ProcessLauncher.
57 """
58 def __init__(self, process_launcher):
59 self.process_launcher = process_launcher
60
61 def connectionMade(self):
62 self.process_launcher.fire_start_deferred(self.transport.pid)
63
64 def processEnded(self, status):
65 value = status.value
66 if isinstance(value, ProcessDone):
67 self.process_launcher.fire_stop_deferred(0)
68 elif isinstance(value, ProcessTerminated):
69 self.process_launcher.fire_stop_deferred(
70 {'exit_code':value.exitCode,
71 'signal':value.signal,
72 'status':value.status
73 }
74 )
75 else:
76 raise UnknownStatus("unknown exit status, this is probably a bug in Twisted")
133
77
134 return parser.parse_args()
78 def outReceived(self, data):
79 log.msg(data)
135
80
136 def numAlive(controller,engines):
81 def errReceived(self, data):
137 """Return the number of processes still alive."""
82 log.err(data)
138 retcodes = [controller.poll()] + \
139 [e.poll() for e in engines]
140 return retcodes.count(None)
141
83
142 stop = lambda pid: os.kill(pid,signal.SIGINT)
84 class ProcessLauncher(object):
143 kill = lambda pid: os.kill(pid,signal.SIGTERM)
85 """
86 Start and stop an external process in an asynchronous manner.
144
87
145 def cleanup(clean,controller,engines):
88 Currently this uses deferreds to notify other parties of process state
146 """Stop the controller and engines with the given cleanup method."""
89 changes. This is an awkward design and should be moved to using
90 a formal NotificationCenter.
91 """
92 def __init__(self, cmd_and_args):
93 self.cmd = cmd_and_args[0]
94 self.args = cmd_and_args
95 self._reset()
96
97 def _reset(self):
98 self.process_protocol = None
99 self.pid = None
100 self.start_deferred = None
101 self.stop_deferreds = []
102 self.state = 'before' # before, running, or after
103
104 @property
105 def running(self):
106 if self.state == 'running':
107 return True
108 else:
109 return False
110
111 def fire_start_deferred(self, pid):
112 self.pid = pid
113 self.state = 'running'
114 log.msg('Process %r has started with pid=%i' % (self.args, pid))
115 self.start_deferred.callback(pid)
116
117 def start(self):
118 if self.state == 'before':
119 self.process_protocol = LauncherProcessProtocol(self)
120 self.start_deferred = defer.Deferred()
121 self.process_transport = reactor.spawnProcess(
122 self.process_protocol,
123 self.cmd,
124 self.args,
125 env=os.environ
126 )
127 return self.start_deferred
128 else:
129 s = 'the process has already been started and has state: %r' % \
130 self.state
131 return defer.fail(ProcessStateError(s))
132
133 def get_stop_deferred(self):
134 if self.state == 'running' or self.state == 'before':
135 d = defer.Deferred()
136 self.stop_deferreds.append(d)
137 return d
138 else:
139 s = 'this process is already complete'
140 return defer.fail(ProcessStateError(s))
147
141
148 for e in engines:
142 def fire_stop_deferred(self, exit_code):
149 if e.poll() is None:
143 log.msg('Process %r has stopped with %r' % (self.args, exit_code))
150 print 'Stopping engine, pid',e.pid
144 self.state = 'after'
151 clean(e.pid)
145 for d in self.stop_deferreds:
152 if controller.poll() is None:
146 d.callback(exit_code)
153 print 'Stopping controller, pid',controller.pid
154 clean(controller.pid)
155
147
148 def signal(self, sig):
149 """
150 Send a signal to the process.
156
151
157 def ensureDir(path):
152 The argument sig can be ('KILL','INT', etc.) or any signal number.
158 """Ensure a directory exists or raise an exception."""
153 """
159 if not os.path.isdir(path):
154 if self.state == 'running':
160 os.makedirs(path)
155 self.process_transport.signalProcess(sig)
161
156
157 # def __del__(self):
158 # self.signal('KILL')
162
159
163 def startMsg(control_host,control_port=10105):
160 def interrupt_then_kill(self, delay=1.0):
164 """Print a startup message"""
161 self.signal('INT')
165 print
162 reactor.callLater(delay, self.signal, 'KILL')
166 print 'Your cluster is up and running.'
167 print
168 print 'For interactive use, you can make a MultiEngineClient with:'
169 print
170 print 'from IPython.kernel import client'
171 print "mec = client.MultiEngineClient()"
172 print
173 print 'You can then cleanly stop the cluster from IPython using:'
174 print
175 print 'mec.kill(controller=True)'
176 print
177
163
178
164
179 def clusterLocal(opt,arg):
165 #-----------------------------------------------------------------------------
180 """Start a cluster on the local machine."""
166 # Code for launching controller and engines
167 #-----------------------------------------------------------------------------
181
168
182 # Store all logs inside the ipython directory
183 ipdir = get_ipython_dir()
184 pjoin = os.path.join
185
169
186 logfile = opt.logfile
170 class ControllerLauncher(ProcessLauncher):
187 if logfile is None:
188 logdir_base = pjoin(ipdir,'log')
189 ensureDir(logdir_base)
190 logfile = pjoin(logdir_base,'ipcluster-')
191
192 print 'Starting controller:',
193 controller = Popen(['ipcontroller','--logfile',logfile,'-x','-y'])
194 print 'Controller PID:',controller.pid
195
196 print 'Starting engines: ',
197 time.sleep(5)
198
199 englogfile = '%s%s-' % (logfile,controller.pid)
200 mpi = opt.mpi
201 if mpi: # start with mpi - killing the engines with sigterm will not work if you do this
202 engines = [Popen(['mpirun', '-np', str(opt.n), 'ipengine', '--mpi',
203 mpi, '--logfile',englogfile])]
204 # engines = [Popen(['mpirun', '-np', str(opt.n), 'ipengine', '--mpi', mpi])]
205 else: # do what we would normally do
206 engines = [ Popen(['ipengine','--logfile',englogfile])
207 for i in range(opt.n) ]
208 eids = [e.pid for e in engines]
209 print 'Engines PIDs: ',eids
210 print 'Log files: %s*' % englogfile
211
212 proc_ids = eids + [controller.pid]
213 procs = engines + [controller]
214
215 grpid = os.getpgrp()
216 try:
217 startMsg('127.0.0.1')
218 print 'You can also hit Ctrl-C to stop it, or use from the cmd line:'
219 print
220 print 'kill -INT',grpid
221 print
222 try:
223 while True:
224 time.sleep(5)
225 except:
226 pass
227 finally:
228 print 'Stopping cluster. Cleaning up...'
229 cleanup(stop,controller,engines)
230 for i in range(4):
231 time.sleep(i+2)
232 nZombies = numAlive(controller,engines)
233 if nZombies== 0:
234 print 'OK: All processes cleaned up.'
235 break
236 print 'Trying again, %d processes did not stop...' % nZombies
237 cleanup(kill,controller,engines)
238 if numAlive(controller,engines) == 0:
239 print 'OK: All processes cleaned up.'
240 break
241 else:
242 print '*'*75
243 print 'ERROR: could not kill some processes, try to do it',
244 print 'manually.'
245 zombies = []
246 if controller.returncode is None:
247 print 'Controller is alive: pid =',controller.pid
248 zombies.append(controller.pid)
249 liveEngines = [ e for e in engines if e.returncode is None ]
250 for e in liveEngines:
251 print 'Engine is alive: pid =',e.pid
252 zombies.append(e.pid)
253 print
254 print 'Zombie summary:',' '.join(map(str,zombies))
255
256 def clusterRemote(opt,arg):
257 """Start a remote cluster over SSH"""
258
259 # B. Granger, 9/3/08
260 # The launching of a remote cluster using SSH and a clusterfile
261 # is broken. Because it won't be fixed before the 0.9 release,
262 # we are removing it. For now, we just print a message to the
263 # user and abort.
264
265 print """The launching of a remote IPython cluster using SSL
266 and a clusterfile has been removed in this release.
267 It has been broken for a while and we are in the process
268 of building a new process management system that will be
269 used to provide a more robust way of starting an IPython
270 cluster.
271
272 For now remote clusters have to be launched using ipcontroller
273 and ipengine separately.
274 """
275 sys.exit(1)
276
277 # Load the remote cluster configuration
278 clConfig = {}
279 execfile(opt.clusterfile,clConfig)
280 contConfig = clConfig['controller']
281 engConfig = clConfig['engines']
282 # Determine where to find sshx:
283 sshx = clConfig.get('sshx',os.environ.get('IPYTHON_SSHX','sshx'))
284
285 # Store all logs inside the ipython directory
286 ipdir = get_ipython_dir()
287 pjoin = os.path.join
288
171
289 logfile = opt.logfile
172 def __init__(self, extra_args=None):
290 if logfile is None:
173 if sys.platform == 'win32':
291 logdir_base = pjoin(ipdir,'log')
174 args = [find_exe('ipcontroller.bat')]
292 ensureDir(logdir_base)
293 logfile = pjoin(logdir_base,'ipcluster')
294
295 # Append this script's PID to the logfile name always
296 logfile = '%s-%s' % (logfile,os.getpid())
297
298 print 'Starting controller:'
299 # Controller data:
300 xsys = os.system
301
302 contHost = contConfig['host']
303 contLog = '%s-con-%s-' % (logfile,contHost)
304 cmd = "ssh %s '%s' 'ipcontroller --logfile %s' &" % \
305 (contHost,sshx,contLog)
306 #print 'cmd:<%s>' % cmd # dbg
307 xsys(cmd)
308 time.sleep(2)
309
310 print 'Starting engines: '
311 for engineHost,engineData in engConfig.iteritems():
312 if isinstance(engineData,int):
313 numEngines = engineData
314 else:
175 else:
315 raise NotImplementedError('port configuration not finished for engines')
176 args = ['ipcontroller']
177 self.extra_args = extra_args
178 if extra_args is not None:
179 args.extend(extra_args)
316
180
317 print 'Sarting %d engines on %s' % (numEngines,engineHost)
181 ProcessLauncher.__init__(self, args)
318 engLog = '%s-eng-%s-' % (logfile,engineHost)
319 for i in range(numEngines):
320 cmd = "ssh %s '%s' 'ipengine --controller-ip %s --logfile %s' &" % \
321 (engineHost,sshx,contHost,engLog)
322 #print 'cmd:<%s>' % cmd # dbg
323 xsys(cmd)
324 # Wait after each host a little bit
325 time.sleep(1)
326
182
327 startMsg(contConfig['host'])
328
183
329 def main():
184 class EngineLauncher(ProcessLauncher):
330 """Main driver for the two big options: local or remote cluster."""
331
185
186 def __init__(self, extra_args=None):
332 if sys.platform=='win32':
187 if sys.platform == 'win32':
333 print """ipcluster does not work on Microsoft Windows. Please start
188 args = [find_exe('ipengine.bat')]
334 your IPython cluster using the ipcontroller and ipengine scripts."""
189 else:
335 sys.exit(1)
190 args = ['ipengine']
336
191 self.extra_args = extra_args
337 opt,arg = parse_args()
192 if extra_args is not None:
338
193 args.extend(extra_args)
339 clusterfile = opt.clusterfile
194
340 if clusterfile:
195 ProcessLauncher.__init__(self, args)
341 clusterRemote(opt,arg)
196
197
198 class LocalEngineSet(object):
199
200 def __init__(self, extra_args=None):
201 self.extra_args = extra_args
202 self.launchers = []
203
204 def start(self, n):
205 dlist = []
206 for i in range(n):
207 el = EngineLauncher(extra_args=self.extra_args)
208 d = el.start()
209 self.launchers.append(el)
210 dlist.append(d)
211 dfinal = gatherBoth(dlist, consumeErrors=True)
212 dfinal.addCallback(self._handle_start)
213 return dfinal
214
215 def _handle_start(self, r):
216 log.msg('Engines started with pids: %r' % r)
217 return r
218
219 def _handle_stop(self, r):
220 log.msg('Engines received signal: %r' % r)
221 return r
222
223 def signal(self, sig):
224 dlist = []
225 for el in self.launchers:
226 d = el.get_stop_deferred()
227 dlist.append(d)
228 el.signal(sig)
229 dfinal = gatherBoth(dlist, consumeErrors=True)
230 dfinal.addCallback(self._handle_stop)
231 return dfinal
232
233 def interrupt_then_kill(self, delay=1.0):
234 dlist = []
235 for el in self.launchers:
236 d = el.get_stop_deferred()
237 dlist.append(d)
238 el.interrupt_then_kill(delay)
239 dfinal = gatherBoth(dlist, consumeErrors=True)
240 dfinal.addCallback(self._handle_stop)
241 return dfinal
242
243
244 class BatchEngineSet(object):
245
246 # Subclasses must fill these in. See PBSEngineSet
247 submit_command = ''
248 delete_command = ''
249 job_id_regexp = ''
250
251 def __init__(self, template_file, **kwargs):
252 self.template_file = template_file
253 self.context = {}
254 self.context.update(kwargs)
255 self.batch_file = self.template_file+'-run'
256
257 def parse_job_id(self, output):
258 m = re.match(self.job_id_regexp, output)
259 if m is not None:
260 job_id = m.group()
342 else:
261 else:
343 clusterLocal(opt,arg)
262 raise Exception("job id couldn't be determined: %s" % output)
263 self.job_id = job_id
264 log.msg('Job started with job id: %r' % job_id)
265 return job_id
266
267 def write_batch_script(self, n):
268 self.context['n'] = n
269 template = open(self.template_file, 'r').read()
270 log.msg('Using template for batch script: %s' % self.template_file)
271 script_as_string = Itpl.itplns(template, self.context)
272 log.msg('Writing instantiated batch script: %s' % self.batch_file)
273 f = open(self.batch_file,'w')
274 f.write(script_as_string)
275 f.close()
276
277 def handle_error(self, f):
278 f.printTraceback()
279 f.raiseException()
280
281 def start(self, n):
282 self.write_batch_script(n)
283 d = getProcessOutput(self.submit_command,
284 [self.batch_file],env=os.environ)
285 d.addCallback(self.parse_job_id)
286 d.addErrback(self.handle_error)
287 return d
288
289 def kill(self):
290 d = getProcessOutput(self.delete_command,
291 [self.job_id],env=os.environ)
292 return d
293
294 class PBSEngineSet(BatchEngineSet):
295
296 submit_command = 'qsub'
297 delete_command = 'qdel'
298 job_id_regexp = '\d+'
299
300 def __init__(self, template_file, **kwargs):
301 BatchEngineSet.__init__(self, template_file, **kwargs)
302
303
304 #-----------------------------------------------------------------------------
305 # Main functions for the different types of clusters
306 #-----------------------------------------------------------------------------
307
308 # TODO:
309 # The logic in these codes should be moved into classes like LocalCluster
310 # MpirunCluster, PBSCluster, etc. This would remove alot of the duplications.
311 # The main functions should then just parse the command line arguments, create
312 # the appropriate class and call a 'start' method.
313
314 def main_local(args):
315 cont_args = []
316 cont_args.append('--logfile=%s' % pjoin(args.logdir,'ipcontroller'))
317 if args.x:
318 cont_args.append('-x')
319 if args.y:
320 cont_args.append('-y')
321 cl = ControllerLauncher(extra_args=cont_args)
322 dstart = cl.start()
323 def start_engines(cont_pid):
324 engine_args = []
325 engine_args.append('--logfile=%s' % \
326 pjoin(args.logdir,'ipengine%s-' % cont_pid))
327 eset = LocalEngineSet(extra_args=engine_args)
328 def shutdown(signum, frame):
329 log.msg('Stopping local cluster')
330 # We are still playing with the times here, but these seem
331 # to be reliable in allowing everything to exit cleanly.
332 eset.interrupt_then_kill(0.5)
333 cl.interrupt_then_kill(0.5)
334 reactor.callLater(1.0, reactor.stop)
335 signal.signal(signal.SIGINT,shutdown)
336 d = eset.start(args.n)
337 return d
338 def delay_start(cont_pid):
339 # This is needed because the controller doesn't start listening
340 # right when it starts and the controller needs to write
341 # furl files for the engine to pick up
342 reactor.callLater(1.0, start_engines, cont_pid)
343 dstart.addCallback(delay_start)
344 dstart.addErrback(lambda f: f.raiseException())
345
346 def main_mpirun(args):
347 cont_args = []
348 cont_args.append('--logfile=%s' % pjoin(args.logdir,'ipcontroller'))
349 if args.x:
350 cont_args.append('-x')
351 if args.y:
352 cont_args.append('-y')
353 cl = ControllerLauncher(extra_args=cont_args)
354 dstart = cl.start()
355 def start_engines(cont_pid):
356 raw_args = ['mpirun']
357 raw_args.extend(['-n',str(args.n)])
358 raw_args.append('ipengine')
359 raw_args.append('-l')
360 raw_args.append(pjoin(args.logdir,'ipengine%s-' % cont_pid))
361 if args.mpi:
362 raw_args.append('--mpi=%s' % args.mpi)
363 eset = ProcessLauncher(raw_args)
364 def shutdown(signum, frame):
365 log.msg('Stopping local cluster')
366 # We are still playing with the times here, but these seem
367 # to be reliable in allowing everything to exit cleanly.
368 eset.interrupt_then_kill(1.0)
369 cl.interrupt_then_kill(1.0)
370 reactor.callLater(2.0, reactor.stop)
371 signal.signal(signal.SIGINT,shutdown)
372 d = eset.start()
373 return d
374 def delay_start(cont_pid):
375 # This is needed because the controller doesn't start listening
376 # right when it starts and the controller needs to write
377 # furl files for the engine to pick up
378 reactor.callLater(1.0, start_engines, cont_pid)
379 dstart.addCallback(delay_start)
380 dstart.addErrback(lambda f: f.raiseException())
381
382 def main_pbs(args):
383 cont_args = []
384 cont_args.append('--logfile=%s' % pjoin(args.logdir,'ipcontroller'))
385 if args.x:
386 cont_args.append('-x')
387 if args.y:
388 cont_args.append('-y')
389 cl = ControllerLauncher(extra_args=cont_args)
390 dstart = cl.start()
391 def start_engines(r):
392 pbs_set = PBSEngineSet(args.pbsscript)
393 def shutdown(signum, frame):
394 log.msg('Stopping pbs cluster')
395 d = pbs_set.kill()
396 d.addBoth(lambda _: cl.interrupt_then_kill(1.0))
397 d.addBoth(lambda _: reactor.callLater(2.0, reactor.stop))
398 signal.signal(signal.SIGINT,shutdown)
399 d = pbs_set.start(args.n)
400 return d
401 dstart.addCallback(start_engines)
402 dstart.addErrback(lambda f: f.raiseException())
403
404
405 def get_args():
406 base_parser = argparse.ArgumentParser(add_help=False)
407 base_parser.add_argument(
408 '-x',
409 action='store_true',
410 dest='x',
411 help='turn off client security'
412 )
413 base_parser.add_argument(
414 '-y',
415 action='store_true',
416 dest='y',
417 help='turn off engine security'
418 )
419 base_parser.add_argument(
420 "--logdir",
421 type=str,
422 dest="logdir",
423 help="directory to put log files (default=$IPYTHONDIR/log)",
424 default=pjoin(get_ipython_dir(),'log')
425 )
426 base_parser.add_argument(
427 "-n",
428 "--num",
429 type=int,
430 dest="n",
431 default=2,
432 help="the number of engines to start"
433 )
434
435 parser = argparse.ArgumentParser(
436 description='IPython cluster startup. This starts a controller and\
437 engines using various approaches. THIS IS A TECHNOLOGY PREVIEW AND\
438 THE API WILL CHANGE SIGNIFICANTLY BEFORE THE FINAL RELEASE.'
439 )
440 subparsers = parser.add_subparsers(
441 help='available cluster types. For help, do "ipcluster TYPE --help"')
442
443 parser_local = subparsers.add_parser(
444 'local',
445 help='run a local cluster',
446 parents=[base_parser]
447 )
448 parser_local.set_defaults(func=main_local)
449
450 parser_mpirun = subparsers.add_parser(
451 'mpirun',
452 help='run a cluster using mpirun',
453 parents=[base_parser]
454 )
455 parser_mpirun.add_argument(
456 "--mpi",
457 type=str,
458 dest="mpi", # Don't put a default here to allow no MPI support
459 help="how to call MPI_Init (default=mpi4py)"
460 )
461 parser_mpirun.set_defaults(func=main_mpirun)
462
463 parser_pbs = subparsers.add_parser(
464 'pbs',
465 help='run a pbs cluster',
466 parents=[base_parser]
467 )
468 parser_pbs.add_argument(
469 '--pbs-script',
470 type=str,
471 dest='pbsscript',
472 help='PBS script template',
473 default='pbs.template'
474 )
475 parser_pbs.set_defaults(func=main_pbs)
476 args = parser.parse_args()
477 return args
344
478
479 def main():
480 args = get_args()
481 reactor.callWhenRunning(args.func, args)
482 log.startLogging(sys.stdout)
483 reactor.run()
345
484
346 if __name__=='__main__':
485 if __name__ == '__main__':
347 main()
486 main()
@@ -1,366 +1,388 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3
3
4 """The IPython controller."""
4 """The IPython controller."""
5
5
6 __docformat__ = "restructuredtext en"
6 __docformat__ = "restructuredtext en"
7
7
8 #-------------------------------------------------------------------------------
8 #-------------------------------------------------------------------------------
9 # Copyright (C) 2008 The IPython Development Team
9 # Copyright (C) 2008 The IPython Development Team
10 #
10 #
11 # Distributed under the terms of the BSD License. The full license is in
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
12 # the file COPYING, distributed as part of this software.
13 #-------------------------------------------------------------------------------
13 #-------------------------------------------------------------------------------
14
14
15 #-------------------------------------------------------------------------------
15 #-------------------------------------------------------------------------------
16 # Imports
16 # Imports
17 #-------------------------------------------------------------------------------
17 #-------------------------------------------------------------------------------
18
18
19 # Python looks for an empty string at the beginning of sys.path to enable
19 # Python looks for an empty string at the beginning of sys.path to enable
20 # importing from the cwd.
20 # importing from the cwd.
21 import sys
21 import sys
22 sys.path.insert(0, '')
22 sys.path.insert(0, '')
23
23
24 import sys, time, os
24 import sys, time, os
25 from optparse import OptionParser
25 from optparse import OptionParser
26
26
27 from twisted.application import internet, service
27 from twisted.application import internet, service
28 from twisted.internet import reactor, error, defer
28 from twisted.internet import reactor, error, defer
29 from twisted.python import log
29 from twisted.python import log
30
30
31 from IPython.kernel.fcutil import Tub, UnauthenticatedTub, have_crypto
31 from IPython.kernel.fcutil import Tub, UnauthenticatedTub, have_crypto
32
32
33 # from IPython.tools import growl
33 # from IPython.tools import growl
34 # growl.start("IPython1 Controller")
34 # growl.start("IPython1 Controller")
35
35
36 from IPython.kernel.error import SecurityError
36 from IPython.kernel.error import SecurityError
37 from IPython.kernel import controllerservice
37 from IPython.kernel import controllerservice
38 from IPython.kernel.fcutil import check_furl_file_security
38 from IPython.kernel.fcutil import check_furl_file_security
39
39
40 from IPython.kernel.config import config_manager as kernel_config_manager
40 from IPython.kernel.config import config_manager as kernel_config_manager
41 from IPython.config.cutils import import_item
41 from IPython.config.cutils import import_item
42
42
43
43
44 #-------------------------------------------------------------------------------
44 #-------------------------------------------------------------------------------
45 # Code
45 # Code
46 #-------------------------------------------------------------------------------
46 #-------------------------------------------------------------------------------
47
47
48 def make_tub(ip, port, secure, cert_file):
48 def make_tub(ip, port, secure, cert_file):
49 """
49 """
50 Create a listening tub given an ip, port, and cert_file location.
50 Create a listening tub given an ip, port, and cert_file location.
51
51
52 :Parameters:
52 :Parameters:
53 ip : str
53 ip : str
54 The ip address that the tub should listen on. Empty means all
54 The ip address that the tub should listen on. Empty means all
55 port : int
55 port : int
56 The port that the tub should listen on. A value of 0 means
56 The port that the tub should listen on. A value of 0 means
57 pick a random port
57 pick a random port
58 secure: boolean
58 secure: boolean
59 Will the connection be secure (in the foolscap sense)
59 Will the connection be secure (in the foolscap sense)
60 cert_file:
60 cert_file:
61 A filename of a file to be used for theSSL certificate
61 A filename of a file to be used for theSSL certificate
62 """
62 """
63 if secure:
63 if secure:
64 if have_crypto:
64 if have_crypto:
65 tub = Tub(certFile=cert_file)
65 tub = Tub(certFile=cert_file)
66 else:
66 else:
67 raise SecurityError("OpenSSL is not available, so we can't run in secure mode, aborting")
67 raise SecurityError("""
68 OpenSSL/pyOpenSSL is not available, so we can't run in secure mode.
69 Try running without security using 'ipcontroller -xy'.
70 """)
68 else:
71 else:
69 tub = UnauthenticatedTub()
72 tub = UnauthenticatedTub()
70
73
71 # Set the strport based on the ip and port and start listening
74 # Set the strport based on the ip and port and start listening
72 if ip == '':
75 if ip == '':
73 strport = "tcp:%i" % port
76 strport = "tcp:%i" % port
74 else:
77 else:
75 strport = "tcp:%i:interface=%s" % (port, ip)
78 strport = "tcp:%i:interface=%s" % (port, ip)
76 listener = tub.listenOn(strport)
79 listener = tub.listenOn(strport)
77
80
78 return tub, listener
81 return tub, listener
79
82
80 def make_client_service(controller_service, config):
83 def make_client_service(controller_service, config):
81 """
84 """
82 Create a service that will listen for clients.
85 Create a service that will listen for clients.
83
86
84 This service is simply a `foolscap.Tub` instance that has a set of Referenceables
87 This service is simply a `foolscap.Tub` instance that has a set of Referenceables
85 registered with it.
88 registered with it.
86 """
89 """
87
90
88 # Now create the foolscap tub
91 # Now create the foolscap tub
89 ip = config['controller']['client_tub']['ip']
92 ip = config['controller']['client_tub']['ip']
90 port = config['controller']['client_tub'].as_int('port')
93 port = config['controller']['client_tub'].as_int('port')
91 location = config['controller']['client_tub']['location']
94 location = config['controller']['client_tub']['location']
92 secure = config['controller']['client_tub']['secure']
95 secure = config['controller']['client_tub']['secure']
93 cert_file = config['controller']['client_tub']['cert_file']
96 cert_file = config['controller']['client_tub']['cert_file']
94 client_tub, client_listener = make_tub(ip, port, secure, cert_file)
97 client_tub, client_listener = make_tub(ip, port, secure, cert_file)
95
98
96 # Set the location in the trivial case of localhost
99 # Set the location in the trivial case of localhost
97 if ip == 'localhost' or ip == '127.0.0.1':
100 if ip == 'localhost' or ip == '127.0.0.1':
98 location = "127.0.0.1"
101 location = "127.0.0.1"
99
102
100 if not secure:
103 if not secure:
101 log.msg("WARNING: you are running the controller with no client security")
104 log.msg("WARNING: you are running the controller with no client security")
102
105
103 def set_location_and_register():
106 def set_location_and_register():
104 """Set the location for the tub and return a deferred."""
107 """Set the location for the tub and return a deferred."""
105
108
106 def register(empty, ref, furl_file):
109 def register(empty, ref, furl_file):
107 client_tub.registerReference(ref, furlFile=furl_file)
110 client_tub.registerReference(ref, furlFile=furl_file)
108
111
109 if location == '':
112 if location == '':
110 d = client_tub.setLocationAutomatically()
113 d = client_tub.setLocationAutomatically()
111 else:
114 else:
112 d = defer.maybeDeferred(client_tub.setLocation, "%s:%i" % (location, client_listener.getPortnum()))
115 d = defer.maybeDeferred(client_tub.setLocation, "%s:%i" % (location, client_listener.getPortnum()))
113
116
114 for ciname, ci in config['controller']['controller_interfaces'].iteritems():
117 for ciname, ci in config['controller']['controller_interfaces'].iteritems():
115 log.msg("Adapting Controller to interface: %s" % ciname)
118 log.msg("Adapting Controller to interface: %s" % ciname)
116 furl_file = ci['furl_file']
119 furl_file = ci['furl_file']
117 log.msg("Saving furl for interface [%s] to file: %s" % (ciname, furl_file))
120 log.msg("Saving furl for interface [%s] to file: %s" % (ciname, furl_file))
118 check_furl_file_security(furl_file, secure)
121 check_furl_file_security(furl_file, secure)
119 adapted_controller = import_item(ci['controller_interface'])(controller_service)
122 adapted_controller = import_item(ci['controller_interface'])(controller_service)
120 d.addCallback(register, import_item(ci['fc_interface'])(adapted_controller),
123 d.addCallback(register, import_item(ci['fc_interface'])(adapted_controller),
121 furl_file=ci['furl_file'])
124 furl_file=ci['furl_file'])
122
125
123 reactor.callWhenRunning(set_location_and_register)
126 reactor.callWhenRunning(set_location_and_register)
124 return client_tub
127 return client_tub
125
128
126
129
127 def make_engine_service(controller_service, config):
130 def make_engine_service(controller_service, config):
128 """
131 """
129 Create a service that will listen for engines.
132 Create a service that will listen for engines.
130
133
131 This service is simply a `foolscap.Tub` instance that has a set of Referenceables
134 This service is simply a `foolscap.Tub` instance that has a set of Referenceables
132 registered with it.
135 registered with it.
133 """
136 """
134
137
135 # Now create the foolscap tub
138 # Now create the foolscap tub
136 ip = config['controller']['engine_tub']['ip']
139 ip = config['controller']['engine_tub']['ip']
137 port = config['controller']['engine_tub'].as_int('port')
140 port = config['controller']['engine_tub'].as_int('port')
138 location = config['controller']['engine_tub']['location']
141 location = config['controller']['engine_tub']['location']
139 secure = config['controller']['engine_tub']['secure']
142 secure = config['controller']['engine_tub']['secure']
140 cert_file = config['controller']['engine_tub']['cert_file']
143 cert_file = config['controller']['engine_tub']['cert_file']
141 engine_tub, engine_listener = make_tub(ip, port, secure, cert_file)
144 engine_tub, engine_listener = make_tub(ip, port, secure, cert_file)
142
145
143 # Set the location in the trivial case of localhost
146 # Set the location in the trivial case of localhost
144 if ip == 'localhost' or ip == '127.0.0.1':
147 if ip == 'localhost' or ip == '127.0.0.1':
145 location = "127.0.0.1"
148 location = "127.0.0.1"
146
149
147 if not secure:
150 if not secure:
148 log.msg("WARNING: you are running the controller with no engine security")
151 log.msg("WARNING: you are running the controller with no engine security")
149
152
150 def set_location_and_register():
153 def set_location_and_register():
151 """Set the location for the tub and return a deferred."""
154 """Set the location for the tub and return a deferred."""
152
155
153 def register(empty, ref, furl_file):
156 def register(empty, ref, furl_file):
154 engine_tub.registerReference(ref, furlFile=furl_file)
157 engine_tub.registerReference(ref, furlFile=furl_file)
155
158
156 if location == '':
159 if location == '':
157 d = engine_tub.setLocationAutomatically()
160 d = engine_tub.setLocationAutomatically()
158 else:
161 else:
159 d = defer.maybeDeferred(engine_tub.setLocation, "%s:%i" % (location, engine_listener.getPortnum()))
162 d = defer.maybeDeferred(engine_tub.setLocation, "%s:%i" % (location, engine_listener.getPortnum()))
160
163
161 furl_file = config['controller']['engine_furl_file']
164 furl_file = config['controller']['engine_furl_file']
162 engine_fc_interface = import_item(config['controller']['engine_fc_interface'])
165 engine_fc_interface = import_item(config['controller']['engine_fc_interface'])
163 log.msg("Saving furl for the engine to file: %s" % furl_file)
166 log.msg("Saving furl for the engine to file: %s" % furl_file)
164 check_furl_file_security(furl_file, secure)
167 check_furl_file_security(furl_file, secure)
165 fc_controller = engine_fc_interface(controller_service)
168 fc_controller = engine_fc_interface(controller_service)
166 d.addCallback(register, fc_controller, furl_file=furl_file)
169 d.addCallback(register, fc_controller, furl_file=furl_file)
167
170
168 reactor.callWhenRunning(set_location_and_register)
171 reactor.callWhenRunning(set_location_and_register)
169 return engine_tub
172 return engine_tub
170
173
171 def start_controller():
174 def start_controller():
172 """
175 """
173 Start the controller by creating the service hierarchy and starting the reactor.
176 Start the controller by creating the service hierarchy and starting the reactor.
174
177
175 This method does the following:
178 This method does the following:
176
179
177 * It starts the controller logging
180 * It starts the controller logging
178 * In execute an import statement for the controller
181 * In execute an import statement for the controller
179 * It creates 2 `foolscap.Tub` instances for the client and the engines
182 * It creates 2 `foolscap.Tub` instances for the client and the engines
180 and registers `foolscap.Referenceables` with the tubs to expose the
183 and registers `foolscap.Referenceables` with the tubs to expose the
181 controller to engines and clients.
184 controller to engines and clients.
182 """
185 """
183 config = kernel_config_manager.get_config_obj()
186 config = kernel_config_manager.get_config_obj()
184
187
185 # Start logging
188 # Start logging
186 logfile = config['controller']['logfile']
189 logfile = config['controller']['logfile']
187 if logfile:
190 if logfile:
188 logfile = logfile + str(os.getpid()) + '.log'
191 logfile = logfile + str(os.getpid()) + '.log'
189 try:
192 try:
190 openLogFile = open(logfile, 'w')
193 openLogFile = open(logfile, 'w')
191 except:
194 except:
192 openLogFile = sys.stdout
195 openLogFile = sys.stdout
193 else:
196 else:
194 openLogFile = sys.stdout
197 openLogFile = sys.stdout
195 log.startLogging(openLogFile)
198 log.startLogging(openLogFile)
196
199
197 # Execute any user defined import statements
200 # Execute any user defined import statements
198 cis = config['controller']['import_statement']
201 cis = config['controller']['import_statement']
199 if cis:
202 if cis:
200 try:
203 try:
201 exec cis in globals(), locals()
204 exec cis in globals(), locals()
202 except:
205 except:
203 log.msg("Error running import_statement: %s" % cis)
206 log.msg("Error running import_statement: %s" % cis)
204
207
208 # Delete old furl files unless the reuse_furls is set
209 reuse = config['controller']['reuse_furls']
210 if not reuse:
211 paths = (config['controller']['engine_furl_file'],
212 config['controller']['controller_interfaces']['task']['furl_file'],
213 config['controller']['controller_interfaces']['multiengine']['furl_file']
214 )
215 for p in paths:
216 if os.path.isfile(p):
217 os.remove(p)
218
205 # Create the service hierarchy
219 # Create the service hierarchy
206 main_service = service.MultiService()
220 main_service = service.MultiService()
207 # The controller service
221 # The controller service
208 controller_service = controllerservice.ControllerService()
222 controller_service = controllerservice.ControllerService()
209 controller_service.setServiceParent(main_service)
223 controller_service.setServiceParent(main_service)
210 # The client tub and all its refereceables
224 # The client tub and all its refereceables
211 client_service = make_client_service(controller_service, config)
225 client_service = make_client_service(controller_service, config)
212 client_service.setServiceParent(main_service)
226 client_service.setServiceParent(main_service)
213 # The engine tub
227 # The engine tub
214 engine_service = make_engine_service(controller_service, config)
228 engine_service = make_engine_service(controller_service, config)
215 engine_service.setServiceParent(main_service)
229 engine_service.setServiceParent(main_service)
216 # Start the controller service and set things running
230 # Start the controller service and set things running
217 main_service.startService()
231 main_service.startService()
218 reactor.run()
232 reactor.run()
219
233
220 def init_config():
234 def init_config():
221 """
235 """
222 Initialize the configuration using default and command line options.
236 Initialize the configuration using default and command line options.
223 """
237 """
224
238
225 parser = OptionParser()
239 parser = OptionParser()
226
240
227 # Client related options
241 # Client related options
228 parser.add_option(
242 parser.add_option(
229 "--client-ip",
243 "--client-ip",
230 type="string",
244 type="string",
231 dest="client_ip",
245 dest="client_ip",
232 help="the IP address or hostname the controller will listen on for client connections"
246 help="the IP address or hostname the controller will listen on for client connections"
233 )
247 )
234 parser.add_option(
248 parser.add_option(
235 "--client-port",
249 "--client-port",
236 type="int",
250 type="int",
237 dest="client_port",
251 dest="client_port",
238 help="the port the controller will listen on for client connections"
252 help="the port the controller will listen on for client connections"
239 )
253 )
240 parser.add_option(
254 parser.add_option(
241 '--client-location',
255 '--client-location',
242 type="string",
256 type="string",
243 dest="client_location",
257 dest="client_location",
244 help="hostname or ip for clients to connect to"
258 help="hostname or ip for clients to connect to"
245 )
259 )
246 parser.add_option(
260 parser.add_option(
247 "-x",
261 "-x",
248 action="store_false",
262 action="store_false",
249 dest="client_secure",
263 dest="client_secure",
250 help="turn off all client security"
264 help="turn off all client security"
251 )
265 )
252 parser.add_option(
266 parser.add_option(
253 '--client-cert-file',
267 '--client-cert-file',
254 type="string",
268 type="string",
255 dest="client_cert_file",
269 dest="client_cert_file",
256 help="file to store the client SSL certificate"
270 help="file to store the client SSL certificate"
257 )
271 )
258 parser.add_option(
272 parser.add_option(
259 '--task-furl-file',
273 '--task-furl-file',
260 type="string",
274 type="string",
261 dest="task_furl_file",
275 dest="task_furl_file",
262 help="file to store the FURL for task clients to connect with"
276 help="file to store the FURL for task clients to connect with"
263 )
277 )
264 parser.add_option(
278 parser.add_option(
265 '--multiengine-furl-file',
279 '--multiengine-furl-file',
266 type="string",
280 type="string",
267 dest="multiengine_furl_file",
281 dest="multiengine_furl_file",
268 help="file to store the FURL for multiengine clients to connect with"
282 help="file to store the FURL for multiengine clients to connect with"
269 )
283 )
270 # Engine related options
284 # Engine related options
271 parser.add_option(
285 parser.add_option(
272 "--engine-ip",
286 "--engine-ip",
273 type="string",
287 type="string",
274 dest="engine_ip",
288 dest="engine_ip",
275 help="the IP address or hostname the controller will listen on for engine connections"
289 help="the IP address or hostname the controller will listen on for engine connections"
276 )
290 )
277 parser.add_option(
291 parser.add_option(
278 "--engine-port",
292 "--engine-port",
279 type="int",
293 type="int",
280 dest="engine_port",
294 dest="engine_port",
281 help="the port the controller will listen on for engine connections"
295 help="the port the controller will listen on for engine connections"
282 )
296 )
283 parser.add_option(
297 parser.add_option(
284 '--engine-location',
298 '--engine-location',
285 type="string",
299 type="string",
286 dest="engine_location",
300 dest="engine_location",
287 help="hostname or ip for engines to connect to"
301 help="hostname or ip for engines to connect to"
288 )
302 )
289 parser.add_option(
303 parser.add_option(
290 "-y",
304 "-y",
291 action="store_false",
305 action="store_false",
292 dest="engine_secure",
306 dest="engine_secure",
293 help="turn off all engine security"
307 help="turn off all engine security"
294 )
308 )
295 parser.add_option(
309 parser.add_option(
296 '--engine-cert-file',
310 '--engine-cert-file',
297 type="string",
311 type="string",
298 dest="engine_cert_file",
312 dest="engine_cert_file",
299 help="file to store the engine SSL certificate"
313 help="file to store the engine SSL certificate"
300 )
314 )
301 parser.add_option(
315 parser.add_option(
302 '--engine-furl-file',
316 '--engine-furl-file',
303 type="string",
317 type="string",
304 dest="engine_furl_file",
318 dest="engine_furl_file",
305 help="file to store the FURL for engines to connect with"
319 help="file to store the FURL for engines to connect with"
306 )
320 )
307 parser.add_option(
321 parser.add_option(
308 "-l", "--logfile",
322 "-l", "--logfile",
309 type="string",
323 type="string",
310 dest="logfile",
324 dest="logfile",
311 help="log file name (default is stdout)"
325 help="log file name (default is stdout)"
312 )
326 )
313 parser.add_option(
327 parser.add_option(
314 "--ipythondir",
328 "--ipythondir",
315 type="string",
329 type="string",
316 dest="ipythondir",
330 dest="ipythondir",
317 help="look for config files and profiles in this directory"
331 help="look for config files and profiles in this directory"
318 )
332 )
333 parser.add_option(
334 "-r",
335 action="store_true",
336 dest="reuse_furls",
337 help="try to reuse all furl files"
338 )
319
339
320 (options, args) = parser.parse_args()
340 (options, args) = parser.parse_args()
321
341
322 kernel_config_manager.update_config_obj_from_default_file(options.ipythondir)
342 kernel_config_manager.update_config_obj_from_default_file(options.ipythondir)
323 config = kernel_config_manager.get_config_obj()
343 config = kernel_config_manager.get_config_obj()
324
344
325 # Update with command line options
345 # Update with command line options
326 if options.client_ip is not None:
346 if options.client_ip is not None:
327 config['controller']['client_tub']['ip'] = options.client_ip
347 config['controller']['client_tub']['ip'] = options.client_ip
328 if options.client_port is not None:
348 if options.client_port is not None:
329 config['controller']['client_tub']['port'] = options.client_port
349 config['controller']['client_tub']['port'] = options.client_port
330 if options.client_location is not None:
350 if options.client_location is not None:
331 config['controller']['client_tub']['location'] = options.client_location
351 config['controller']['client_tub']['location'] = options.client_location
332 if options.client_secure is not None:
352 if options.client_secure is not None:
333 config['controller']['client_tub']['secure'] = options.client_secure
353 config['controller']['client_tub']['secure'] = options.client_secure
334 if options.client_cert_file is not None:
354 if options.client_cert_file is not None:
335 config['controller']['client_tub']['cert_file'] = options.client_cert_file
355 config['controller']['client_tub']['cert_file'] = options.client_cert_file
336 if options.task_furl_file is not None:
356 if options.task_furl_file is not None:
337 config['controller']['controller_interfaces']['task']['furl_file'] = options.task_furl_file
357 config['controller']['controller_interfaces']['task']['furl_file'] = options.task_furl_file
338 if options.multiengine_furl_file is not None:
358 if options.multiengine_furl_file is not None:
339 config['controller']['controller_interfaces']['multiengine']['furl_file'] = options.multiengine_furl_file
359 config['controller']['controller_interfaces']['multiengine']['furl_file'] = options.multiengine_furl_file
340 if options.engine_ip is not None:
360 if options.engine_ip is not None:
341 config['controller']['engine_tub']['ip'] = options.engine_ip
361 config['controller']['engine_tub']['ip'] = options.engine_ip
342 if options.engine_port is not None:
362 if options.engine_port is not None:
343 config['controller']['engine_tub']['port'] = options.engine_port
363 config['controller']['engine_tub']['port'] = options.engine_port
344 if options.engine_location is not None:
364 if options.engine_location is not None:
345 config['controller']['engine_tub']['location'] = options.engine_location
365 config['controller']['engine_tub']['location'] = options.engine_location
346 if options.engine_secure is not None:
366 if options.engine_secure is not None:
347 config['controller']['engine_tub']['secure'] = options.engine_secure
367 config['controller']['engine_tub']['secure'] = options.engine_secure
348 if options.engine_cert_file is not None:
368 if options.engine_cert_file is not None:
349 config['controller']['engine_tub']['cert_file'] = options.engine_cert_file
369 config['controller']['engine_tub']['cert_file'] = options.engine_cert_file
350 if options.engine_furl_file is not None:
370 if options.engine_furl_file is not None:
351 config['controller']['engine_furl_file'] = options.engine_furl_file
371 config['controller']['engine_furl_file'] = options.engine_furl_file
372 if options.reuse_furls is not None:
373 config['controller']['reuse_furls'] = options.reuse_furls
352
374
353 if options.logfile is not None:
375 if options.logfile is not None:
354 config['controller']['logfile'] = options.logfile
376 config['controller']['logfile'] = options.logfile
355
377
356 kernel_config_manager.update_config_obj(config)
378 kernel_config_manager.update_config_obj(config)
357
379
358 def main():
380 def main():
359 """
381 """
360 After creating the configuration information, start the controller.
382 After creating the configuration information, start the controller.
361 """
383 """
362 init_config()
384 init_config()
363 start_controller()
385 start_controller()
364
386
365 if __name__ == "__main__":
387 if __name__ == "__main__":
366 main()
388 main()
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from IPython/config/config.py to sandbox/config.py
NO CONTENT: file renamed from IPython/config/config.py to sandbox/config.py
1 NO CONTENT: file renamed from IPython/config/tests/sample_config.py to sandbox/sample_config.py
NO CONTENT: file renamed from IPython/config/tests/sample_config.py to sandbox/sample_config.py
1 NO CONTENT: file renamed from IPython/config/tests/test_config.py to sandbox/test_config.py
NO CONTENT: file renamed from IPython/config/tests/test_config.py to sandbox/test_config.py
1 NO CONTENT: file renamed from IPython/config/traitlets.py to sandbox/traitlets.py
NO CONTENT: file renamed from IPython/config/traitlets.py to sandbox/traitlets.py
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (660 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now