##// END OF EJS Templates
set .ipython dir location earlier on
vivainio -
Show More
@@ -1,727 +1,728 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.1 or better.
5 Requires Python 2.1 or better.
6
6
7 This file contains the main make_IPython() starter function.
7 This file contains the main make_IPython() starter function.
8
8
9 $Id: ipmaker.py 1111 2006-01-30 21:16:07Z vivainio $"""
9 $Id: ipmaker.py 1115 2006-01-31 08:49:20Z vivainio $"""
10
10
11 #*****************************************************************************
11 #*****************************************************************************
12 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
12 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
13 #
13 #
14 # Distributed under the terms of the BSD License. The full license is in
14 # Distributed under the terms of the BSD License. The full license is in
15 # the file COPYING, distributed as part of this software.
15 # the file COPYING, distributed as part of this software.
16 #*****************************************************************************
16 #*****************************************************************************
17
17
18 from IPython import Release
18 from IPython import Release
19 __author__ = '%s <%s>' % Release.authors['Fernando']
19 __author__ = '%s <%s>' % Release.authors['Fernando']
20 __license__ = Release.license
20 __license__ = Release.license
21 __version__ = Release.version
21 __version__ = Release.version
22
22
23 credits._Printer__data = """
23 credits._Printer__data = """
24 Python: %s
24 Python: %s
25
25
26 IPython: Fernando Perez, Janko Hauser, Nathan Gray, and many users.
26 IPython: Fernando Perez, Janko Hauser, Nathan Gray, and many users.
27 See http://ipython.scipy.org for more information.""" \
27 See http://ipython.scipy.org for more information.""" \
28 % credits._Printer__data
28 % credits._Printer__data
29
29
30 copyright._Printer__data += """
30 copyright._Printer__data += """
31
31
32 Copyright (c) 2001-2004 Fernando Perez, Janko Hauser, Nathan Gray.
32 Copyright (c) 2001-2004 Fernando Perez, Janko Hauser, Nathan Gray.
33 All Rights Reserved."""
33 All Rights Reserved."""
34
34
35 #****************************************************************************
35 #****************************************************************************
36 # Required modules
36 # Required modules
37
37
38 # From the standard library
38 # From the standard library
39 import __main__
39 import __main__
40 import __builtin__
40 import __builtin__
41 import os
41 import os
42 import re
42 import re
43 import sys
43 import sys
44 import types
44 import types
45 from pprint import pprint,pformat
45 from pprint import pprint,pformat
46
46
47 # Our own
47 # Our own
48 from IPython import DPyGetOpt
48 from IPython import DPyGetOpt
49 from IPython.ipstruct import Struct
49 from IPython.ipstruct import Struct
50 from IPython.OutputTrap import OutputTrap
50 from IPython.OutputTrap import OutputTrap
51 from IPython.ConfigLoader import ConfigLoader
51 from IPython.ConfigLoader import ConfigLoader
52 from IPython.iplib import InteractiveShell
52 from IPython.iplib import InteractiveShell
53 from IPython.usage import cmd_line_usage,interactive_usage
53 from IPython.usage import cmd_line_usage,interactive_usage
54 from IPython.genutils import *
54 from IPython.genutils import *
55
55
56 #-----------------------------------------------------------------------------
56 #-----------------------------------------------------------------------------
57 def make_IPython(argv=None,user_ns=None,user_global_ns=None,debug=1,
57 def make_IPython(argv=None,user_ns=None,user_global_ns=None,debug=1,
58 rc_override=None,shell_class=InteractiveShell,
58 rc_override=None,shell_class=InteractiveShell,
59 embedded=False,**kw):
59 embedded=False,**kw):
60 """This is a dump of IPython into a single function.
60 """This is a dump of IPython into a single function.
61
61
62 Later it will have to be broken up in a sensible manner.
62 Later it will have to be broken up in a sensible manner.
63
63
64 Arguments:
64 Arguments:
65
65
66 - argv: a list similar to sys.argv[1:]. It should NOT contain the desired
66 - argv: a list similar to sys.argv[1:]. It should NOT contain the desired
67 script name, b/c DPyGetOpt strips the first argument only for the real
67 script name, b/c DPyGetOpt strips the first argument only for the real
68 sys.argv.
68 sys.argv.
69
69
70 - user_ns: a dict to be used as the user's namespace."""
70 - user_ns: a dict to be used as the user's namespace."""
71
71
72 #----------------------------------------------------------------------
72 #----------------------------------------------------------------------
73 # Defaults and initialization
73 # Defaults and initialization
74
74
75 # For developer debugging, deactivates crash handler and uses pdb.
75 # For developer debugging, deactivates crash handler and uses pdb.
76 DEVDEBUG = False
76 DEVDEBUG = False
77
77
78 if argv is None:
78 if argv is None:
79 argv = sys.argv
79 argv = sys.argv
80
80
81 # __IP is the main global that lives throughout and represents the whole
81 # __IP is the main global that lives throughout and represents the whole
82 # application. If the user redefines it, all bets are off as to what
82 # application. If the user redefines it, all bets are off as to what
83 # happens.
83 # happens.
84
84
85 # __IP is the name of he global which the caller will have accessible as
85 # __IP is the name of he global which the caller will have accessible as
86 # __IP.name. We set its name via the first parameter passed to
86 # __IP.name. We set its name via the first parameter passed to
87 # InteractiveShell:
87 # InteractiveShell:
88
88
89 IP = shell_class('__IP',user_ns=user_ns,user_global_ns=user_global_ns,
89 IP = shell_class('__IP',user_ns=user_ns,user_global_ns=user_global_ns,
90 embedded=embedded,**kw)
90 embedded=embedded,**kw)
91
91
92 # Put 'help' in the user namespace
92 # Put 'help' in the user namespace
93 from site import _Helper
93 from site import _Helper
94 IP.user_ns['help'] = _Helper()
94 IP.user_ns['help'] = _Helper()
95
95
96
96
97 if DEVDEBUG:
97 if DEVDEBUG:
98 # For developer debugging only (global flag)
98 # For developer debugging only (global flag)
99 from IPython import ultraTB
99 from IPython import ultraTB
100 sys.excepthook = ultraTB.VerboseTB(call_pdb=1)
100 sys.excepthook = ultraTB.VerboseTB(call_pdb=1)
101
101
102 IP.BANNER_PARTS = ['Python %s\n'
102 IP.BANNER_PARTS = ['Python %s\n'
103 'Type "copyright", "credits" or "license" '
103 'Type "copyright", "credits" or "license" '
104 'for more information.\n'
104 'for more information.\n'
105 % (sys.version.split('\n')[0],),
105 % (sys.version.split('\n')[0],),
106 "IPython %s -- An enhanced Interactive Python."
106 "IPython %s -- An enhanced Interactive Python."
107 % (__version__,),
107 % (__version__,),
108 """? -> Introduction to IPython's features.
108 """? -> Introduction to IPython's features.
109 %magic -> Information about IPython's 'magic' % functions.
109 %magic -> Information about IPython's 'magic' % functions.
110 help -> Python's own help system.
110 help -> Python's own help system.
111 object? -> Details about 'object'. ?object also works, ?? prints more.
111 object? -> Details about 'object'. ?object also works, ?? prints more.
112 """ ]
112 """ ]
113
113
114 IP.usage = interactive_usage
114 IP.usage = interactive_usage
115
115
116 # Platform-dependent suffix and directory names. We use _ipython instead
116 # Platform-dependent suffix and directory names. We use _ipython instead
117 # of .ipython under win32 b/c there's software that breaks with .named
117 # of .ipython under win32 b/c there's software that breaks with .named
118 # directories on that platform.
118 # directories on that platform.
119 if os.name == 'posix':
119 if os.name == 'posix':
120 rc_suffix = ''
120 rc_suffix = ''
121 ipdir_def = '.ipython'
121 ipdir_def = '.ipython'
122 else:
122 else:
123 rc_suffix = '.ini'
123 rc_suffix = '.ini'
124 ipdir_def = '_ipython'
124 ipdir_def = '_ipython'
125
125
126 # default directory for configuration
126 # default directory for configuration
127 ipythondir = os.path.abspath(os.environ.get('IPYTHONDIR',
127 ipythondir = os.path.abspath(os.environ.get('IPYTHONDIR',
128 os.path.join(IP.home_dir,ipdir_def)))
128 os.path.join(IP.home_dir,ipdir_def)))
129
129
130 # add personal .ipython dir to sys.path so that users can put things in
131 # there for customization
132 sys.path.append(ipythondir)
133
134 sys.path.insert(0, '') # add . to sys.path. Fix from Prabhu Ramachandran
135
130 # we need the directory where IPython itself is installed
136 # we need the directory where IPython itself is installed
131 import IPython
137 import IPython
132 IPython_dir = os.path.dirname(IPython.__file__)
138 IPython_dir = os.path.dirname(IPython.__file__)
133 del IPython
139 del IPython
134
140
135 #-------------------------------------------------------------------------
141 #-------------------------------------------------------------------------
136 # Command line handling
142 # Command line handling
137
143
138 # Valid command line options (uses DPyGetOpt syntax, like Perl's
144 # Valid command line options (uses DPyGetOpt syntax, like Perl's
139 # GetOpt::Long)
145 # GetOpt::Long)
140
146
141 # Any key not listed here gets deleted even if in the file (like session
147 # Any key not listed here gets deleted even if in the file (like session
142 # or profile). That's deliberate, to maintain the rc namespace clean.
148 # or profile). That's deliberate, to maintain the rc namespace clean.
143
149
144 # Each set of options appears twice: under _conv only the names are
150 # Each set of options appears twice: under _conv only the names are
145 # listed, indicating which type they must be converted to when reading the
151 # listed, indicating which type they must be converted to when reading the
146 # ipythonrc file. And under DPyGetOpt they are listed with the regular
152 # ipythonrc file. And under DPyGetOpt they are listed with the regular
147 # DPyGetOpt syntax (=s,=i,:f,etc).
153 # DPyGetOpt syntax (=s,=i,:f,etc).
148
154
149 # Make sure there's a space before each end of line (they get auto-joined!)
155 # Make sure there's a space before each end of line (they get auto-joined!)
150 cmdline_opts = ('autocall=i autoindent! automagic! banner! cache_size|cs=i '
156 cmdline_opts = ('autocall=i autoindent! automagic! banner! cache_size|cs=i '
151 'c=s classic|cl color_info! colors=s confirm_exit! '
157 'c=s classic|cl color_info! colors=s confirm_exit! '
152 'debug! deep_reload! editor=s log|l messages! nosep pdb! '
158 'debug! deep_reload! editor=s log|l messages! nosep pdb! '
153 'pprint! prompt_in1|pi1=s prompt_in2|pi2=s prompt_out|po=s '
159 'pprint! prompt_in1|pi1=s prompt_in2|pi2=s prompt_out|po=s '
154 'quick screen_length|sl=i prompts_pad_left=i '
160 'quick screen_length|sl=i prompts_pad_left=i '
155 'logfile|lf=s logplay|lp=s profile|p=s '
161 'logfile|lf=s logplay|lp=s profile|p=s '
156 'readline! readline_merge_completions! '
162 'readline! readline_merge_completions! '
157 'readline_omit__names! '
163 'readline_omit__names! '
158 'rcfile=s separate_in|si=s separate_out|so=s '
164 'rcfile=s separate_in|si=s separate_out|so=s '
159 'separate_out2|so2=s xmode=s wildcards_case_sensitive! '
165 'separate_out2|so2=s xmode=s wildcards_case_sensitive! '
160 'magic_docstrings system_verbose! '
166 'magic_docstrings system_verbose! '
161 'multi_line_specials! '
167 'multi_line_specials! '
162 'wxversion=s '
168 'wxversion=s '
163 'autoedit_syntax!')
169 'autoedit_syntax!')
164
170
165 # Options that can *only* appear at the cmd line (not in rcfiles).
171 # Options that can *only* appear at the cmd line (not in rcfiles).
166
172
167 # The "ignore" option is a kludge so that Emacs buffers don't crash, since
173 # The "ignore" option is a kludge so that Emacs buffers don't crash, since
168 # the 'C-c !' command in emacs automatically appends a -i option at the end.
174 # the 'C-c !' command in emacs automatically appends a -i option at the end.
169 cmdline_only = ('help ignore|i ipythondir=s Version upgrade '
175 cmdline_only = ('help ignore|i ipythondir=s Version upgrade '
170 'gthread! qthread! wthread! pylab! tk!')
176 'gthread! qthread! wthread! pylab! tk!')
171
177
172 # Build the actual name list to be used by DPyGetOpt
178 # Build the actual name list to be used by DPyGetOpt
173 opts_names = qw(cmdline_opts) + qw(cmdline_only)
179 opts_names = qw(cmdline_opts) + qw(cmdline_only)
174
180
175 # Set sensible command line defaults.
181 # Set sensible command line defaults.
176 # This should have everything from cmdline_opts and cmdline_only
182 # This should have everything from cmdline_opts and cmdline_only
177 opts_def = Struct(autocall = 1,
183 opts_def = Struct(autocall = 1,
178 autoedit_syntax = 1,
184 autoedit_syntax = 1,
179 autoindent=0,
185 autoindent=0,
180 automagic = 1,
186 automagic = 1,
181 banner = 1,
187 banner = 1,
182 cache_size = 1000,
188 cache_size = 1000,
183 c = '',
189 c = '',
184 classic = 0,
190 classic = 0,
185 colors = 'NoColor',
191 colors = 'NoColor',
186 color_info = 0,
192 color_info = 0,
187 confirm_exit = 1,
193 confirm_exit = 1,
188 debug = 0,
194 debug = 0,
189 deep_reload = 0,
195 deep_reload = 0,
190 editor = '0',
196 editor = '0',
191 help = 0,
197 help = 0,
192 ignore = 0,
198 ignore = 0,
193 ipythondir = ipythondir,
199 ipythondir = ipythondir,
194 log = 0,
200 log = 0,
195 logfile = '',
201 logfile = '',
196 logplay = '',
202 logplay = '',
197 multi_line_specials = 1,
203 multi_line_specials = 1,
198 messages = 1,
204 messages = 1,
199 nosep = 0,
205 nosep = 0,
200 pdb = 0,
206 pdb = 0,
201 pprint = 0,
207 pprint = 0,
202 profile = '',
208 profile = '',
203 prompt_in1 = 'In [\\#]: ',
209 prompt_in1 = 'In [\\#]: ',
204 prompt_in2 = ' .\\D.: ',
210 prompt_in2 = ' .\\D.: ',
205 prompt_out = 'Out[\\#]: ',
211 prompt_out = 'Out[\\#]: ',
206 prompts_pad_left = 1,
212 prompts_pad_left = 1,
207 quick = 0,
213 quick = 0,
208 readline = 1,
214 readline = 1,
209 readline_merge_completions = 1,
215 readline_merge_completions = 1,
210 readline_omit__names = 0,
216 readline_omit__names = 0,
211 rcfile = 'ipythonrc' + rc_suffix,
217 rcfile = 'ipythonrc' + rc_suffix,
212 screen_length = 0,
218 screen_length = 0,
213 separate_in = '\n',
219 separate_in = '\n',
214 separate_out = '\n',
220 separate_out = '\n',
215 separate_out2 = '',
221 separate_out2 = '',
216 system_verbose = 0,
222 system_verbose = 0,
217 gthread = 0,
223 gthread = 0,
218 qthread = 0,
224 qthread = 0,
219 wthread = 0,
225 wthread = 0,
220 pylab = 0,
226 pylab = 0,
221 tk = 0,
227 tk = 0,
222 upgrade = 0,
228 upgrade = 0,
223 Version = 0,
229 Version = 0,
224 xmode = 'Verbose',
230 xmode = 'Verbose',
225 wildcards_case_sensitive = 1,
231 wildcards_case_sensitive = 1,
226 wxversion = '0',
232 wxversion = '0',
227 magic_docstrings = 0, # undocumented, for doc generation
233 magic_docstrings = 0, # undocumented, for doc generation
228 )
234 )
229
235
230 # Things that will *only* appear in rcfiles (not at the command line).
236 # Things that will *only* appear in rcfiles (not at the command line).
231 # Make sure there's a space before each end of line (they get auto-joined!)
237 # Make sure there's a space before each end of line (they get auto-joined!)
232 rcfile_opts = { qwflat: 'include import_mod import_all execfile ',
238 rcfile_opts = { qwflat: 'include import_mod import_all execfile ',
233 qw_lol: 'import_some ',
239 qw_lol: 'import_some ',
234 # for things with embedded whitespace:
240 # for things with embedded whitespace:
235 list_strings:'execute alias readline_parse_and_bind ',
241 list_strings:'execute alias readline_parse_and_bind ',
236 # Regular strings need no conversion:
242 # Regular strings need no conversion:
237 None:'readline_remove_delims ',
243 None:'readline_remove_delims ',
238 }
244 }
239 # Default values for these
245 # Default values for these
240 rc_def = Struct(include = [],
246 rc_def = Struct(include = [],
241 import_mod = [],
247 import_mod = [],
242 import_all = [],
248 import_all = [],
243 import_some = [[]],
249 import_some = [[]],
244 execute = [],
250 execute = [],
245 execfile = [],
251 execfile = [],
246 alias = [],
252 alias = [],
247 readline_parse_and_bind = [],
253 readline_parse_and_bind = [],
248 readline_remove_delims = '',
254 readline_remove_delims = '',
249 )
255 )
250
256
251 # Build the type conversion dictionary from the above tables:
257 # Build the type conversion dictionary from the above tables:
252 typeconv = rcfile_opts.copy()
258 typeconv = rcfile_opts.copy()
253 typeconv.update(optstr2types(cmdline_opts))
259 typeconv.update(optstr2types(cmdline_opts))
254
260
255 # FIXME: the None key appears in both, put that back together by hand. Ugly!
261 # FIXME: the None key appears in both, put that back together by hand. Ugly!
256 typeconv[None] += ' ' + rcfile_opts[None]
262 typeconv[None] += ' ' + rcfile_opts[None]
257
263
258 # Remove quotes at ends of all strings (used to protect spaces)
264 # Remove quotes at ends of all strings (used to protect spaces)
259 typeconv[unquote_ends] = typeconv[None]
265 typeconv[unquote_ends] = typeconv[None]
260 del typeconv[None]
266 del typeconv[None]
261
267
262 # Build the list we'll use to make all config decisions with defaults:
268 # Build the list we'll use to make all config decisions with defaults:
263 opts_all = opts_def.copy()
269 opts_all = opts_def.copy()
264 opts_all.update(rc_def)
270 opts_all.update(rc_def)
265
271
266 # Build conflict resolver for recursive loading of config files:
272 # Build conflict resolver for recursive loading of config files:
267 # - preserve means the outermost file maintains the value, it is not
273 # - preserve means the outermost file maintains the value, it is not
268 # overwritten if an included file has the same key.
274 # overwritten if an included file has the same key.
269 # - add_flip applies + to the two values, so it better make sense to add
275 # - add_flip applies + to the two values, so it better make sense to add
270 # those types of keys. But it flips them first so that things loaded
276 # those types of keys. But it flips them first so that things loaded
271 # deeper in the inclusion chain have lower precedence.
277 # deeper in the inclusion chain have lower precedence.
272 conflict = {'preserve': ' '.join([ typeconv[int],
278 conflict = {'preserve': ' '.join([ typeconv[int],
273 typeconv[unquote_ends] ]),
279 typeconv[unquote_ends] ]),
274 'add_flip': ' '.join([ typeconv[qwflat],
280 'add_flip': ' '.join([ typeconv[qwflat],
275 typeconv[qw_lol],
281 typeconv[qw_lol],
276 typeconv[list_strings] ])
282 typeconv[list_strings] ])
277 }
283 }
278
284
279 # Now actually process the command line
285 # Now actually process the command line
280 getopt = DPyGetOpt.DPyGetOpt()
286 getopt = DPyGetOpt.DPyGetOpt()
281 getopt.setIgnoreCase(0)
287 getopt.setIgnoreCase(0)
282
288
283 getopt.parseConfiguration(opts_names)
289 getopt.parseConfiguration(opts_names)
284
290
285 try:
291 try:
286 getopt.processArguments(argv)
292 getopt.processArguments(argv)
287 except:
293 except:
288 print cmd_line_usage
294 print cmd_line_usage
289 warn('\nError in Arguments: ' + `sys.exc_value`)
295 warn('\nError in Arguments: ' + `sys.exc_value`)
290 sys.exit(1)
296 sys.exit(1)
291
297
292 # convert the options dict to a struct for much lighter syntax later
298 # convert the options dict to a struct for much lighter syntax later
293 opts = Struct(getopt.optionValues)
299 opts = Struct(getopt.optionValues)
294 args = getopt.freeValues
300 args = getopt.freeValues
295
301
296 # this is the struct (which has default values at this point) with which
302 # this is the struct (which has default values at this point) with which
297 # we make all decisions:
303 # we make all decisions:
298 opts_all.update(opts)
304 opts_all.update(opts)
299
305
300 # Options that force an immediate exit
306 # Options that force an immediate exit
301 if opts_all.help:
307 if opts_all.help:
302 page(cmd_line_usage)
308 page(cmd_line_usage)
303 sys.exit()
309 sys.exit()
304
310
305 if opts_all.Version:
311 if opts_all.Version:
306 print __version__
312 print __version__
307 sys.exit()
313 sys.exit()
308
314
309 if opts_all.magic_docstrings:
315 if opts_all.magic_docstrings:
310 IP.magic_magic('-latex')
316 IP.magic_magic('-latex')
311 sys.exit()
317 sys.exit()
312
318
313 # Create user config directory if it doesn't exist. This must be done
319 # Create user config directory if it doesn't exist. This must be done
314 # *after* getting the cmd line options.
320 # *after* getting the cmd line options.
315 if not os.path.isdir(opts_all.ipythondir):
321 if not os.path.isdir(opts_all.ipythondir):
316 IP.user_setup(opts_all.ipythondir,rc_suffix,'install')
322 IP.user_setup(opts_all.ipythondir,rc_suffix,'install')
317
323
318 # upgrade user config files while preserving a copy of the originals
324 # upgrade user config files while preserving a copy of the originals
319 if opts_all.upgrade:
325 if opts_all.upgrade:
320 IP.user_setup(opts_all.ipythondir,rc_suffix,'upgrade')
326 IP.user_setup(opts_all.ipythondir,rc_suffix,'upgrade')
321
327
322 # check mutually exclusive options in the *original* command line
328 # check mutually exclusive options in the *original* command line
323 mutex_opts(opts,[qw('log logfile'),qw('rcfile profile'),
329 mutex_opts(opts,[qw('log logfile'),qw('rcfile profile'),
324 qw('classic profile'),qw('classic rcfile')])
330 qw('classic profile'),qw('classic rcfile')])
325
331
326 #---------------------------------------------------------------------------
332 #---------------------------------------------------------------------------
327 # Log replay
333 # Log replay
328
334
329 # if -logplay, we need to 'become' the other session. That basically means
335 # if -logplay, we need to 'become' the other session. That basically means
330 # replacing the current command line environment with that of the old
336 # replacing the current command line environment with that of the old
331 # session and moving on.
337 # session and moving on.
332
338
333 # this is needed so that later we know we're in session reload mode, as
339 # this is needed so that later we know we're in session reload mode, as
334 # opts_all will get overwritten:
340 # opts_all will get overwritten:
335 load_logplay = 0
341 load_logplay = 0
336
342
337 if opts_all.logplay:
343 if opts_all.logplay:
338 load_logplay = opts_all.logplay
344 load_logplay = opts_all.logplay
339 opts_debug_save = opts_all.debug
345 opts_debug_save = opts_all.debug
340 try:
346 try:
341 logplay = open(opts_all.logplay)
347 logplay = open(opts_all.logplay)
342 except IOError:
348 except IOError:
343 if opts_all.debug: IP.InteractiveTB()
349 if opts_all.debug: IP.InteractiveTB()
344 warn('Could not open logplay file '+`opts_all.logplay`)
350 warn('Could not open logplay file '+`opts_all.logplay`)
345 # restore state as if nothing had happened and move on, but make
351 # restore state as if nothing had happened and move on, but make
346 # sure that later we don't try to actually load the session file
352 # sure that later we don't try to actually load the session file
347 logplay = None
353 logplay = None
348 load_logplay = 0
354 load_logplay = 0
349 del opts_all.logplay
355 del opts_all.logplay
350 else:
356 else:
351 try:
357 try:
352 logplay.readline()
358 logplay.readline()
353 logplay.readline();
359 logplay.readline();
354 # this reloads that session's command line
360 # this reloads that session's command line
355 cmd = logplay.readline()[6:]
361 cmd = logplay.readline()[6:]
356 exec cmd
362 exec cmd
357 # restore the true debug flag given so that the process of
363 # restore the true debug flag given so that the process of
358 # session loading itself can be monitored.
364 # session loading itself can be monitored.
359 opts.debug = opts_debug_save
365 opts.debug = opts_debug_save
360 # save the logplay flag so later we don't overwrite the log
366 # save the logplay flag so later we don't overwrite the log
361 opts.logplay = load_logplay
367 opts.logplay = load_logplay
362 # now we must update our own structure with defaults
368 # now we must update our own structure with defaults
363 opts_all.update(opts)
369 opts_all.update(opts)
364 # now load args
370 # now load args
365 cmd = logplay.readline()[6:]
371 cmd = logplay.readline()[6:]
366 exec cmd
372 exec cmd
367 logplay.close()
373 logplay.close()
368 except:
374 except:
369 logplay.close()
375 logplay.close()
370 if opts_all.debug: IP.InteractiveTB()
376 if opts_all.debug: IP.InteractiveTB()
371 warn("Logplay file lacking full configuration information.\n"
377 warn("Logplay file lacking full configuration information.\n"
372 "I'll try to read it, but some things may not work.")
378 "I'll try to read it, but some things may not work.")
373
379
374 #-------------------------------------------------------------------------
380 #-------------------------------------------------------------------------
375 # set up output traps: catch all output from files, being run, modules
381 # set up output traps: catch all output from files, being run, modules
376 # loaded, etc. Then give it to the user in a clean form at the end.
382 # loaded, etc. Then give it to the user in a clean form at the end.
377
383
378 msg_out = 'Output messages. '
384 msg_out = 'Output messages. '
379 msg_err = 'Error messages. '
385 msg_err = 'Error messages. '
380 msg_sep = '\n'
386 msg_sep = '\n'
381 msg = Struct(config = OutputTrap('Configuration Loader',msg_out,
387 msg = Struct(config = OutputTrap('Configuration Loader',msg_out,
382 msg_err,msg_sep,debug,
388 msg_err,msg_sep,debug,
383 quiet_out=1),
389 quiet_out=1),
384 user_exec = OutputTrap('User File Execution',msg_out,
390 user_exec = OutputTrap('User File Execution',msg_out,
385 msg_err,msg_sep,debug),
391 msg_err,msg_sep,debug),
386 logplay = OutputTrap('Log Loader',msg_out,
392 logplay = OutputTrap('Log Loader',msg_out,
387 msg_err,msg_sep,debug),
393 msg_err,msg_sep,debug),
388 summary = ''
394 summary = ''
389 )
395 )
390
396
391 #-------------------------------------------------------------------------
397 #-------------------------------------------------------------------------
392 # Process user ipythonrc-type configuration files
398 # Process user ipythonrc-type configuration files
393
399
394 # turn on output trapping and log to msg.config
400 # turn on output trapping and log to msg.config
395 # remember that with debug on, trapping is actually disabled
401 # remember that with debug on, trapping is actually disabled
396 msg.config.trap_all()
402 msg.config.trap_all()
397
403
398 # look for rcfile in current or default directory
404 # look for rcfile in current or default directory
399 try:
405 try:
400 opts_all.rcfile = filefind(opts_all.rcfile,opts_all.ipythondir)
406 opts_all.rcfile = filefind(opts_all.rcfile,opts_all.ipythondir)
401 except IOError:
407 except IOError:
402 if opts_all.debug: IP.InteractiveTB()
408 if opts_all.debug: IP.InteractiveTB()
403 warn('Configuration file %s not found. Ignoring request.'
409 warn('Configuration file %s not found. Ignoring request.'
404 % (opts_all.rcfile) )
410 % (opts_all.rcfile) )
405
411
406 # 'profiles' are a shorthand notation for config filenames
412 # 'profiles' are a shorthand notation for config filenames
407 if opts_all.profile:
413 if opts_all.profile:
408
414
409 try:
415 try:
410 opts_all.rcfile = filefind('ipythonrc-' + opts_all.profile
416 opts_all.rcfile = filefind('ipythonrc-' + opts_all.profile
411 + rc_suffix,
417 + rc_suffix,
412 opts_all.ipythondir)
418 opts_all.ipythondir)
413 except IOError:
419 except IOError:
414 if opts_all.debug: IP.InteractiveTB()
420 if opts_all.debug: IP.InteractiveTB()
415 opts.profile = '' # remove profile from options if invalid
421 opts.profile = '' # remove profile from options if invalid
416 warn('Profile configuration file %s not found. Ignoring request.'
422 warn('Profile configuration file %s not found. Ignoring request.'
417 % (opts_all.profile) )
423 % (opts_all.profile) )
418
424
419
425
420 # load the config file
426 # load the config file
421 rcfiledata = None
427 rcfiledata = None
422 if opts_all.quick:
428 if opts_all.quick:
423 print 'Launching IPython in quick mode. No config file read.'
429 print 'Launching IPython in quick mode. No config file read.'
424 elif opts_all.classic:
430 elif opts_all.classic:
425 print 'Launching IPython in classic mode. No config file read.'
431 print 'Launching IPython in classic mode. No config file read.'
426 elif opts_all.rcfile:
432 elif opts_all.rcfile:
427 try:
433 try:
428 cfg_loader = ConfigLoader(conflict)
434 cfg_loader = ConfigLoader(conflict)
429 rcfiledata = cfg_loader.load(opts_all.rcfile,typeconv,
435 rcfiledata = cfg_loader.load(opts_all.rcfile,typeconv,
430 'include',opts_all.ipythondir,
436 'include',opts_all.ipythondir,
431 purge = 1,
437 purge = 1,
432 unique = conflict['preserve'])
438 unique = conflict['preserve'])
433 except:
439 except:
434 IP.InteractiveTB()
440 IP.InteractiveTB()
435 warn('Problems loading configuration file '+
441 warn('Problems loading configuration file '+
436 `opts_all.rcfile`+
442 `opts_all.rcfile`+
437 '\nStarting with default -bare bones- configuration.')
443 '\nStarting with default -bare bones- configuration.')
438 else:
444 else:
439 warn('No valid configuration file found in either currrent directory\n'+
445 warn('No valid configuration file found in either currrent directory\n'+
440 'or in the IPython config. directory: '+`opts_all.ipythondir`+
446 'or in the IPython config. directory: '+`opts_all.ipythondir`+
441 '\nProceeding with internal defaults.')
447 '\nProceeding with internal defaults.')
442
448
443 #------------------------------------------------------------------------
449 #------------------------------------------------------------------------
444 # Set exception handlers in mode requested by user.
450 # Set exception handlers in mode requested by user.
445 otrap = OutputTrap(trap_out=1) # trap messages from magic_xmode
451 otrap = OutputTrap(trap_out=1) # trap messages from magic_xmode
446 IP.magic_xmode(opts_all.xmode)
452 IP.magic_xmode(opts_all.xmode)
447 otrap.release_out()
453 otrap.release_out()
448
454
449 #------------------------------------------------------------------------
455 #------------------------------------------------------------------------
450 # Execute user config
456 # Execute user config
451
457
452 # Create a valid config structure with the right precedence order:
458 # Create a valid config structure with the right precedence order:
453 # defaults < rcfile < command line. This needs to be in the instance, so
459 # defaults < rcfile < command line. This needs to be in the instance, so
454 # that method calls below that rely on it find it.
460 # that method calls below that rely on it find it.
455 IP.rc = rc_def.copy()
461 IP.rc = rc_def.copy()
456
462
457 # Work with a local alias inside this routine to avoid unnecessary
463 # Work with a local alias inside this routine to avoid unnecessary
458 # attribute lookups.
464 # attribute lookups.
459 IP_rc = IP.rc
465 IP_rc = IP.rc
460
466
461 IP_rc.update(opts_def)
467 IP_rc.update(opts_def)
462 if rcfiledata:
468 if rcfiledata:
463 # now we can update
469 # now we can update
464 IP_rc.update(rcfiledata)
470 IP_rc.update(rcfiledata)
465 IP_rc.update(opts)
471 IP_rc.update(opts)
466 IP_rc.update(rc_override)
472 IP_rc.update(rc_override)
467
473
468 # Store the original cmd line for reference:
474 # Store the original cmd line for reference:
469 IP_rc.opts = opts
475 IP_rc.opts = opts
470 IP_rc.args = args
476 IP_rc.args = args
471
477
472 # create a *runtime* Struct like rc for holding parameters which may be
478 # create a *runtime* Struct like rc for holding parameters which may be
473 # created and/or modified by runtime user extensions.
479 # created and/or modified by runtime user extensions.
474 IP.runtime_rc = Struct()
480 IP.runtime_rc = Struct()
475
481
476 # from this point on, all config should be handled through IP_rc,
482 # from this point on, all config should be handled through IP_rc,
477 # opts* shouldn't be used anymore.
483 # opts* shouldn't be used anymore.
478
484
479 # add personal .ipython dir to sys.path so that users can put things in
480 # there for customization
481 sys.path.append(IP_rc.ipythondir)
482
483 sys.path.insert(0, '') # add . to sys.path. Fix from Prabhu Ramachandran
484
485
485 # update IP_rc with some special things that need manual
486 # update IP_rc with some special things that need manual
486 # tweaks. Basically options which affect other options. I guess this
487 # tweaks. Basically options which affect other options. I guess this
487 # should just be written so that options are fully orthogonal and we
488 # should just be written so that options are fully orthogonal and we
488 # wouldn't worry about this stuff!
489 # wouldn't worry about this stuff!
489
490
490 if IP_rc.classic:
491 if IP_rc.classic:
491 IP_rc.quick = 1
492 IP_rc.quick = 1
492 IP_rc.cache_size = 0
493 IP_rc.cache_size = 0
493 IP_rc.pprint = 0
494 IP_rc.pprint = 0
494 IP_rc.prompt_in1 = '>>> '
495 IP_rc.prompt_in1 = '>>> '
495 IP_rc.prompt_in2 = '... '
496 IP_rc.prompt_in2 = '... '
496 IP_rc.prompt_out = ''
497 IP_rc.prompt_out = ''
497 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
498 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
498 IP_rc.colors = 'NoColor'
499 IP_rc.colors = 'NoColor'
499 IP_rc.xmode = 'Plain'
500 IP_rc.xmode = 'Plain'
500
501
501 # configure readline
502 # configure readline
502 # Define the history file for saving commands in between sessions
503 # Define the history file for saving commands in between sessions
503 if IP_rc.profile:
504 if IP_rc.profile:
504 histfname = 'history-%s' % IP_rc.profile
505 histfname = 'history-%s' % IP_rc.profile
505 else:
506 else:
506 histfname = 'history'
507 histfname = 'history'
507 IP.histfile = os.path.join(opts_all.ipythondir,histfname)
508 IP.histfile = os.path.join(opts_all.ipythondir,histfname)
508
509
509 # update exception handlers with rc file status
510 # update exception handlers with rc file status
510 otrap.trap_out() # I don't want these messages ever.
511 otrap.trap_out() # I don't want these messages ever.
511 IP.magic_xmode(IP_rc.xmode)
512 IP.magic_xmode(IP_rc.xmode)
512 otrap.release_out()
513 otrap.release_out()
513
514
514 # activate logging if requested and not reloading a log
515 # activate logging if requested and not reloading a log
515 if IP_rc.logplay:
516 if IP_rc.logplay:
516 IP.magic_logstart(IP_rc.logplay + ' append')
517 IP.magic_logstart(IP_rc.logplay + ' append')
517 elif IP_rc.logfile:
518 elif IP_rc.logfile:
518 IP.magic_logstart(IP_rc.logfile)
519 IP.magic_logstart(IP_rc.logfile)
519 elif IP_rc.log:
520 elif IP_rc.log:
520 IP.magic_logstart()
521 IP.magic_logstart()
521
522
522 # find user editor so that it we don't have to look it up constantly
523 # find user editor so that it we don't have to look it up constantly
523 if IP_rc.editor.strip()=='0':
524 if IP_rc.editor.strip()=='0':
524 try:
525 try:
525 ed = os.environ['EDITOR']
526 ed = os.environ['EDITOR']
526 except KeyError:
527 except KeyError:
527 if os.name == 'posix':
528 if os.name == 'posix':
528 ed = 'vi' # the only one guaranteed to be there!
529 ed = 'vi' # the only one guaranteed to be there!
529 else:
530 else:
530 ed = 'notepad' # same in Windows!
531 ed = 'notepad' # same in Windows!
531 IP_rc.editor = ed
532 IP_rc.editor = ed
532
533
533 # Keep track of whether this is an embedded instance or not (useful for
534 # Keep track of whether this is an embedded instance or not (useful for
534 # post-mortems).
535 # post-mortems).
535 IP_rc.embedded = IP.embedded
536 IP_rc.embedded = IP.embedded
536
537
537 # Recursive reload
538 # Recursive reload
538 try:
539 try:
539 from IPython import deep_reload
540 from IPython import deep_reload
540 if IP_rc.deep_reload:
541 if IP_rc.deep_reload:
541 __builtin__.reload = deep_reload.reload
542 __builtin__.reload = deep_reload.reload
542 else:
543 else:
543 __builtin__.dreload = deep_reload.reload
544 __builtin__.dreload = deep_reload.reload
544 del deep_reload
545 del deep_reload
545 except ImportError:
546 except ImportError:
546 pass
547 pass
547
548
548 # Save the current state of our namespace so that the interactive shell
549 # Save the current state of our namespace so that the interactive shell
549 # can later know which variables have been created by us from config files
550 # can later know which variables have been created by us from config files
550 # and loading. This way, loading a file (in any way) is treated just like
551 # and loading. This way, loading a file (in any way) is treated just like
551 # defining things on the command line, and %who works as expected.
552 # defining things on the command line, and %who works as expected.
552
553
553 # DON'T do anything that affects the namespace beyond this point!
554 # DON'T do anything that affects the namespace beyond this point!
554 IP.internal_ns.update(__main__.__dict__)
555 IP.internal_ns.update(__main__.__dict__)
555
556
556 #IP.internal_ns.update(locals()) # so our stuff doesn't show up in %who
557 #IP.internal_ns.update(locals()) # so our stuff doesn't show up in %who
557
558
558 # Now run through the different sections of the users's config
559 # Now run through the different sections of the users's config
559 if IP_rc.debug:
560 if IP_rc.debug:
560 print 'Trying to execute the following configuration structure:'
561 print 'Trying to execute the following configuration structure:'
561 print '(Things listed first are deeper in the inclusion tree and get'
562 print '(Things listed first are deeper in the inclusion tree and get'
562 print 'loaded first).\n'
563 print 'loaded first).\n'
563 pprint(IP_rc.__dict__)
564 pprint(IP_rc.__dict__)
564
565
565 for mod in IP_rc.import_mod:
566 for mod in IP_rc.import_mod:
566 try:
567 try:
567 exec 'import '+mod in IP.user_ns
568 exec 'import '+mod in IP.user_ns
568 except :
569 except :
569 IP.InteractiveTB()
570 IP.InteractiveTB()
570 import_fail_info(mod)
571 import_fail_info(mod)
571
572
572 for mod_fn in IP_rc.import_some:
573 for mod_fn in IP_rc.import_some:
573 if mod_fn == []: break
574 if mod_fn == []: break
574 mod,fn = mod_fn[0],','.join(mod_fn[1:])
575 mod,fn = mod_fn[0],','.join(mod_fn[1:])
575 try:
576 try:
576 exec 'from '+mod+' import '+fn in IP.user_ns
577 exec 'from '+mod+' import '+fn in IP.user_ns
577 except :
578 except :
578 IP.InteractiveTB()
579 IP.InteractiveTB()
579 import_fail_info(mod,fn)
580 import_fail_info(mod,fn)
580
581
581 for mod in IP_rc.import_all:
582 for mod in IP_rc.import_all:
582 try:
583 try:
583 exec 'from '+mod+' import *' in IP.user_ns
584 exec 'from '+mod+' import *' in IP.user_ns
584 except :
585 except :
585 IP.InteractiveTB()
586 IP.InteractiveTB()
586 import_fail_info(mod)
587 import_fail_info(mod)
587
588
588 for code in IP_rc.execute:
589 for code in IP_rc.execute:
589 try:
590 try:
590 exec code in IP.user_ns
591 exec code in IP.user_ns
591 except:
592 except:
592 IP.InteractiveTB()
593 IP.InteractiveTB()
593 warn('Failure executing code: ' + `code`)
594 warn('Failure executing code: ' + `code`)
594
595
595 # Execute the files the user wants in ipythonrc
596 # Execute the files the user wants in ipythonrc
596 for file in IP_rc.execfile:
597 for file in IP_rc.execfile:
597 try:
598 try:
598 file = filefind(file,sys.path+[IPython_dir])
599 file = filefind(file,sys.path+[IPython_dir])
599 except IOError:
600 except IOError:
600 warn(itpl('File $file not found. Skipping it.'))
601 warn(itpl('File $file not found. Skipping it.'))
601 else:
602 else:
602 IP.safe_execfile(os.path.expanduser(file),IP.user_ns)
603 IP.safe_execfile(os.path.expanduser(file),IP.user_ns)
603
604
604 # finally, try importing ipy_*_conf for final configuration
605 # finally, try importing ipy_*_conf for final configuration
605 try:
606 try:
606 import ipy_system_conf
607 import ipy_system_conf
607 except ImportError:
608 except ImportError:
608 warn("Could not import 'ipy_system_conf'")
609 warn("Could not import 'ipy_system_conf'")
609 pass
610 pass
610 if opts_all.profile:
611 if opts_all.profile:
611 profmodname = 'ipy_profile_' + opts_all.profile
612 profmodname = 'ipy_profile_' + opts_all.profile
612 try:
613 try:
613 __import__(profmodname)
614 __import__(profmodname)
614 except ImportError:
615 except ImportError:
615 warn("Could not import '%s'" % profmodname)
616 warn("Could not import '%s'" % profmodname)
616 try:
617 try:
617 import ipy_user_conf
618 import ipy_user_conf
618 except ImportError:
619 except ImportError:
619 warn('Could not import ipy_user_conf')
620 warn('Could not import ipy_user_conf')
620
621
621 # release stdout and stderr and save config log into a global summary
622 # release stdout and stderr and save config log into a global summary
622 msg.config.release_all()
623 msg.config.release_all()
623 if IP_rc.messages:
624 if IP_rc.messages:
624 msg.summary += msg.config.summary_all()
625 msg.summary += msg.config.summary_all()
625
626
626 #------------------------------------------------------------------------
627 #------------------------------------------------------------------------
627 # Setup interactive session
628 # Setup interactive session
628
629
629 # Now we should be fully configured. We can then execute files or load
630 # Now we should be fully configured. We can then execute files or load
630 # things only needed for interactive use. Then we'll open the shell.
631 # things only needed for interactive use. Then we'll open the shell.
631
632
632 # Take a snapshot of the user namespace before opening the shell. That way
633 # Take a snapshot of the user namespace before opening the shell. That way
633 # we'll be able to identify which things were interactively defined and
634 # we'll be able to identify which things were interactively defined and
634 # which were defined through config files.
635 # which were defined through config files.
635 IP.user_config_ns = IP.user_ns.copy()
636 IP.user_config_ns = IP.user_ns.copy()
636
637
637 # Force reading a file as if it were a session log. Slower but safer.
638 # Force reading a file as if it were a session log. Slower but safer.
638 if load_logplay:
639 if load_logplay:
639 print 'Replaying log...'
640 print 'Replaying log...'
640 try:
641 try:
641 if IP_rc.debug:
642 if IP_rc.debug:
642 logplay_quiet = 0
643 logplay_quiet = 0
643 else:
644 else:
644 logplay_quiet = 1
645 logplay_quiet = 1
645
646
646 msg.logplay.trap_all()
647 msg.logplay.trap_all()
647 IP.safe_execfile(load_logplay,IP.user_ns,
648 IP.safe_execfile(load_logplay,IP.user_ns,
648 islog = 1, quiet = logplay_quiet)
649 islog = 1, quiet = logplay_quiet)
649 msg.logplay.release_all()
650 msg.logplay.release_all()
650 if IP_rc.messages:
651 if IP_rc.messages:
651 msg.summary += msg.logplay.summary_all()
652 msg.summary += msg.logplay.summary_all()
652 except:
653 except:
653 warn('Problems replaying logfile %s.' % load_logplay)
654 warn('Problems replaying logfile %s.' % load_logplay)
654 IP.InteractiveTB()
655 IP.InteractiveTB()
655
656
656 # Load remaining files in command line
657 # Load remaining files in command line
657 msg.user_exec.trap_all()
658 msg.user_exec.trap_all()
658
659
659 # Do NOT execute files named in the command line as scripts to be loaded
660 # Do NOT execute files named in the command line as scripts to be loaded
660 # by embedded instances. Doing so has the potential for an infinite
661 # by embedded instances. Doing so has the potential for an infinite
661 # recursion if there are exceptions thrown in the process.
662 # recursion if there are exceptions thrown in the process.
662
663
663 # XXX FIXME: the execution of user files should be moved out to after
664 # XXX FIXME: the execution of user files should be moved out to after
664 # ipython is fully initialized, just as if they were run via %run at the
665 # ipython is fully initialized, just as if they were run via %run at the
665 # ipython prompt. This would also give them the benefit of ipython's
666 # ipython prompt. This would also give them the benefit of ipython's
666 # nice tracebacks.
667 # nice tracebacks.
667
668
668 if not embedded and IP_rc.args:
669 if not embedded and IP_rc.args:
669 name_save = IP.user_ns['__name__']
670 name_save = IP.user_ns['__name__']
670 IP.user_ns['__name__'] = '__main__'
671 IP.user_ns['__name__'] = '__main__'
671 # Set our own excepthook in case the user code tries to call it
672 # Set our own excepthook in case the user code tries to call it
672 # directly. This prevents triggering the IPython crash handler.
673 # directly. This prevents triggering the IPython crash handler.
673 old_excepthook,sys.excepthook = sys.excepthook, IP.excepthook
674 old_excepthook,sys.excepthook = sys.excepthook, IP.excepthook
674
675
675 save_argv = sys.argv[:] # save it for later restoring
676 save_argv = sys.argv[:] # save it for later restoring
676
677
677 sys.argv = args
678 sys.argv = args
678
679
679 try:
680 try:
680 IP.safe_execfile(args[0], IP.user_ns)
681 IP.safe_execfile(args[0], IP.user_ns)
681 finally:
682 finally:
682 # Reset our crash handler in place
683 # Reset our crash handler in place
683 sys.excepthook = old_excepthook
684 sys.excepthook = old_excepthook
684 sys.argv = save_argv
685 sys.argv = save_argv
685 IP.user_ns['__name__'] = name_save
686 IP.user_ns['__name__'] = name_save
686
687
687 msg.user_exec.release_all()
688 msg.user_exec.release_all()
688 if IP_rc.messages:
689 if IP_rc.messages:
689 msg.summary += msg.user_exec.summary_all()
690 msg.summary += msg.user_exec.summary_all()
690
691
691 # since we can't specify a null string on the cmd line, 0 is the equivalent:
692 # since we can't specify a null string on the cmd line, 0 is the equivalent:
692 if IP_rc.nosep:
693 if IP_rc.nosep:
693 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
694 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
694 if IP_rc.separate_in == '0': IP_rc.separate_in = ''
695 if IP_rc.separate_in == '0': IP_rc.separate_in = ''
695 if IP_rc.separate_out == '0': IP_rc.separate_out = ''
696 if IP_rc.separate_out == '0': IP_rc.separate_out = ''
696 if IP_rc.separate_out2 == '0': IP_rc.separate_out2 = ''
697 if IP_rc.separate_out2 == '0': IP_rc.separate_out2 = ''
697 IP_rc.separate_in = IP_rc.separate_in.replace('\\n','\n')
698 IP_rc.separate_in = IP_rc.separate_in.replace('\\n','\n')
698 IP_rc.separate_out = IP_rc.separate_out.replace('\\n','\n')
699 IP_rc.separate_out = IP_rc.separate_out.replace('\\n','\n')
699 IP_rc.separate_out2 = IP_rc.separate_out2.replace('\\n','\n')
700 IP_rc.separate_out2 = IP_rc.separate_out2.replace('\\n','\n')
700
701
701 # Determine how many lines at the bottom of the screen are needed for
702 # Determine how many lines at the bottom of the screen are needed for
702 # showing prompts, so we can know wheter long strings are to be printed or
703 # showing prompts, so we can know wheter long strings are to be printed or
703 # paged:
704 # paged:
704 num_lines_bot = IP_rc.separate_in.count('\n')+1
705 num_lines_bot = IP_rc.separate_in.count('\n')+1
705 IP_rc.screen_length = IP_rc.screen_length - num_lines_bot
706 IP_rc.screen_length = IP_rc.screen_length - num_lines_bot
706
707
707 # configure startup banner
708 # configure startup banner
708 if IP_rc.c: # regular python doesn't print the banner with -c
709 if IP_rc.c: # regular python doesn't print the banner with -c
709 IP_rc.banner = 0
710 IP_rc.banner = 0
710 if IP_rc.banner:
711 if IP_rc.banner:
711 BANN_P = IP.BANNER_PARTS
712 BANN_P = IP.BANNER_PARTS
712 else:
713 else:
713 BANN_P = []
714 BANN_P = []
714
715
715 if IP_rc.profile: BANN_P.append('IPython profile: %s\n' % IP_rc.profile)
716 if IP_rc.profile: BANN_P.append('IPython profile: %s\n' % IP_rc.profile)
716
717
717 # add message log (possibly empty)
718 # add message log (possibly empty)
718 if msg.summary: BANN_P.append(msg.summary)
719 if msg.summary: BANN_P.append(msg.summary)
719 # Final banner is a string
720 # Final banner is a string
720 IP.BANNER = '\n'.join(BANN_P)
721 IP.BANNER = '\n'.join(BANN_P)
721
722
722 # Finalize the IPython instance. This assumes the rc structure is fully
723 # Finalize the IPython instance. This assumes the rc structure is fully
723 # in place.
724 # in place.
724 IP.post_config_initialization()
725 IP.post_config_initialization()
725
726
726 return IP
727 return IP
727 #************************ end of file <ipmaker.py> **************************
728 #************************ end of file <ipmaker.py> **************************
General Comments 0
You need to be logged in to leave comments. Login now