##// END OF EJS Templates
change "profile not found" warning heuristics (only warn...
vivainio -
Show More
@@ -1,50 +1,53 b''
1 """ User configuration file for IPython
1 """ User configuration file for IPython
2
2
3 This is a more flexible and safe way to configure ipython than *rc files
3 This is a more flexible and safe way to configure ipython than *rc files
4 (ipythonrc, ipythonrc-pysh etc.)
4 (ipythonrc, ipythonrc-pysh etc.)
5
5
6 This file is always imported on ipython startup. You should import all the
6 This file is always imported on ipython startup. You should import all the
7 ipython extensions you need here (see IPython/Extensions directory).
7 ipython extensions you need here (see IPython/Extensions directory).
8
8
9 Feel free to edit this file to customize your ipython experience. If
9 Feel free to edit this file to customize your ipython experience. If
10 you wish to only use the old config system, it's perfectly ok to make this file
10 you wish to only use the old config system, it's perfectly ok to make this file
11 empty.
11 empty.
12
12
13 """
13 """
14
14
15 # Most of your config files and extensions will probably start with this import
15 # Most of your config files and extensions will probably start with this import
16
16
17 from IPython import ipapi
17 from IPython import ipapi
18 ip = ipapi.get()
18 ip = ipapi.get()
19 import os
19 import os
20
20
21 o = ip.options()
21 o = ip.options()
22 # autocall 1 ('smart') is default anyway, this is just an
22 # autocall 1 ('smart') is default anyway, this is just an
23 # example on how to set an option
23 # example on how to set an option
24 o.autocall = 1
24 o.autocall = 1
25
25
26 if o.profile == 'pysh':
26 if o.profile == 'pysh':
27 # Jason Orendorff's path class is handy to have in user namespace
27 # Jason Orendorff's path class is handy to have in user namespace
28 # if you are doing shell-like stuff
28 # if you are doing shell-like stuff
29 ip.ex("from IPython.path import path" )
29 try:
30 ip.ex("from path import path" )
31 except ImportError:
32 pass
30
33
31 # Uncomment these lines to get pysh-like prompt for all profiles.
34 # Uncomment these lines to get pysh-like prompt for all profiles.
32
35
33 #o.prompt_in1= '\C_LightBlue[\C_LightCyan\Y1\C_LightBlue]\C_Green|\#> '
36 #o.prompt_in1= '\C_LightBlue[\C_LightCyan\Y1\C_LightBlue]\C_Green|\#> '
34 #o.prompt_in2= '\C_Green|\C_LightGreen\D\C_Green> '
37 #o.prompt_in2= '\C_Green|\C_LightGreen\D\C_Green> '
35 #o.prompt_out= '<\#> '
38 #o.prompt_out= '<\#> '
36
39
37 # make 'd' an alias for ls -F
40 # make 'd' an alias for ls -F
38
41
39 ip.magic('alias d ls -F --color=auto')
42 ip.magic('alias d ls -F --color=auto')
40
43
41 # Make available all system commands through "rehashing" immediately.
44 # Make available all system commands through "rehashing" immediately.
42 # You can comment these lines out to speed up startup on very slow
45 # You can comment these lines out to speed up startup on very slow
43 # machines, and to conserve a bit of memory. Note that pysh profile does this
46 # machines, and to conserve a bit of memory. Note that pysh profile does this
44 # automatically
47 # automatically
45
48
46 #if os.name=='posix':
49 #if os.name=='posix':
47 # ip.magic('rehash')
50 # ip.magic('rehash')
48 #else:
51 #else:
49 # #slightly slower, but better results esp. with Windows
52 # #slightly slower, but better results esp. with Windows
50 # ip.magic('rehashx')
53 # ip.magic('rehashx')
@@ -1,728 +1,735 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 1115 2006-01-31 08:49:20Z vivainio $"""
9 $Id: ipmaker.py 1120 2006-02-01 20:08:48Z 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
130 # add personal .ipython dir to sys.path so that users can put things in
131 # there for customization
131 # there for customization
132 sys.path.append(ipythondir)
132 sys.path.append(ipythondir)
133
133
134 sys.path.insert(0, '') # add . to sys.path. Fix from Prabhu Ramachandran
134 sys.path.insert(0, '') # add . to sys.path. Fix from Prabhu Ramachandran
135
135
136 # we need the directory where IPython itself is installed
136 # we need the directory where IPython itself is installed
137 import IPython
137 import IPython
138 IPython_dir = os.path.dirname(IPython.__file__)
138 IPython_dir = os.path.dirname(IPython.__file__)
139 del IPython
139 del IPython
140
140
141 #-------------------------------------------------------------------------
141 #-------------------------------------------------------------------------
142 # Command line handling
142 # Command line handling
143
143
144 # Valid command line options (uses DPyGetOpt syntax, like Perl's
144 # Valid command line options (uses DPyGetOpt syntax, like Perl's
145 # GetOpt::Long)
145 # GetOpt::Long)
146
146
147 # 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
148 # or profile). That's deliberate, to maintain the rc namespace clean.
148 # or profile). That's deliberate, to maintain the rc namespace clean.
149
149
150 # 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
151 # 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
152 # ipythonrc file. And under DPyGetOpt they are listed with the regular
152 # ipythonrc file. And under DPyGetOpt they are listed with the regular
153 # DPyGetOpt syntax (=s,=i,:f,etc).
153 # DPyGetOpt syntax (=s,=i,:f,etc).
154
154
155 # 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!)
156 cmdline_opts = ('autocall=i autoindent! automagic! banner! cache_size|cs=i '
156 cmdline_opts = ('autocall=i autoindent! automagic! banner! cache_size|cs=i '
157 'c=s classic|cl color_info! colors=s confirm_exit! '
157 'c=s classic|cl color_info! colors=s confirm_exit! '
158 'debug! deep_reload! editor=s log|l messages! nosep pdb! '
158 'debug! deep_reload! editor=s log|l messages! nosep pdb! '
159 '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 '
160 'quick screen_length|sl=i prompts_pad_left=i '
160 'quick screen_length|sl=i prompts_pad_left=i '
161 'logfile|lf=s logplay|lp=s profile|p=s '
161 'logfile|lf=s logplay|lp=s profile|p=s '
162 'readline! readline_merge_completions! '
162 'readline! readline_merge_completions! '
163 'readline_omit__names! '
163 'readline_omit__names! '
164 'rcfile=s separate_in|si=s separate_out|so=s '
164 'rcfile=s separate_in|si=s separate_out|so=s '
165 'separate_out2|so2=s xmode=s wildcards_case_sensitive! '
165 'separate_out2|so2=s xmode=s wildcards_case_sensitive! '
166 'magic_docstrings system_verbose! '
166 'magic_docstrings system_verbose! '
167 'multi_line_specials! '
167 'multi_line_specials! '
168 'wxversion=s '
168 'wxversion=s '
169 'autoedit_syntax!')
169 'autoedit_syntax!')
170
170
171 # 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).
172
172
173 # 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
174 # 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.
175 cmdline_only = ('help ignore|i ipythondir=s Version upgrade '
175 cmdline_only = ('help ignore|i ipythondir=s Version upgrade '
176 'gthread! qthread! wthread! pylab! tk!')
176 'gthread! qthread! wthread! pylab! tk!')
177
177
178 # Build the actual name list to be used by DPyGetOpt
178 # Build the actual name list to be used by DPyGetOpt
179 opts_names = qw(cmdline_opts) + qw(cmdline_only)
179 opts_names = qw(cmdline_opts) + qw(cmdline_only)
180
180
181 # Set sensible command line defaults.
181 # Set sensible command line defaults.
182 # This should have everything from cmdline_opts and cmdline_only
182 # This should have everything from cmdline_opts and cmdline_only
183 opts_def = Struct(autocall = 1,
183 opts_def = Struct(autocall = 1,
184 autoedit_syntax = 1,
184 autoedit_syntax = 1,
185 autoindent=0,
185 autoindent=0,
186 automagic = 1,
186 automagic = 1,
187 banner = 1,
187 banner = 1,
188 cache_size = 1000,
188 cache_size = 1000,
189 c = '',
189 c = '',
190 classic = 0,
190 classic = 0,
191 colors = 'NoColor',
191 colors = 'NoColor',
192 color_info = 0,
192 color_info = 0,
193 confirm_exit = 1,
193 confirm_exit = 1,
194 debug = 0,
194 debug = 0,
195 deep_reload = 0,
195 deep_reload = 0,
196 editor = '0',
196 editor = '0',
197 help = 0,
197 help = 0,
198 ignore = 0,
198 ignore = 0,
199 ipythondir = ipythondir,
199 ipythondir = ipythondir,
200 log = 0,
200 log = 0,
201 logfile = '',
201 logfile = '',
202 logplay = '',
202 logplay = '',
203 multi_line_specials = 1,
203 multi_line_specials = 1,
204 messages = 1,
204 messages = 1,
205 nosep = 0,
205 nosep = 0,
206 pdb = 0,
206 pdb = 0,
207 pprint = 0,
207 pprint = 0,
208 profile = '',
208 profile = '',
209 prompt_in1 = 'In [\\#]: ',
209 prompt_in1 = 'In [\\#]: ',
210 prompt_in2 = ' .\\D.: ',
210 prompt_in2 = ' .\\D.: ',
211 prompt_out = 'Out[\\#]: ',
211 prompt_out = 'Out[\\#]: ',
212 prompts_pad_left = 1,
212 prompts_pad_left = 1,
213 quick = 0,
213 quick = 0,
214 readline = 1,
214 readline = 1,
215 readline_merge_completions = 1,
215 readline_merge_completions = 1,
216 readline_omit__names = 0,
216 readline_omit__names = 0,
217 rcfile = 'ipythonrc' + rc_suffix,
217 rcfile = 'ipythonrc' + rc_suffix,
218 screen_length = 0,
218 screen_length = 0,
219 separate_in = '\n',
219 separate_in = '\n',
220 separate_out = '\n',
220 separate_out = '\n',
221 separate_out2 = '',
221 separate_out2 = '',
222 system_verbose = 0,
222 system_verbose = 0,
223 gthread = 0,
223 gthread = 0,
224 qthread = 0,
224 qthread = 0,
225 wthread = 0,
225 wthread = 0,
226 pylab = 0,
226 pylab = 0,
227 tk = 0,
227 tk = 0,
228 upgrade = 0,
228 upgrade = 0,
229 Version = 0,
229 Version = 0,
230 xmode = 'Verbose',
230 xmode = 'Verbose',
231 wildcards_case_sensitive = 1,
231 wildcards_case_sensitive = 1,
232 wxversion = '0',
232 wxversion = '0',
233 magic_docstrings = 0, # undocumented, for doc generation
233 magic_docstrings = 0, # undocumented, for doc generation
234 )
234 )
235
235
236 # 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).
237 # 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!)
238 rcfile_opts = { qwflat: 'include import_mod import_all execfile ',
238 rcfile_opts = { qwflat: 'include import_mod import_all execfile ',
239 qw_lol: 'import_some ',
239 qw_lol: 'import_some ',
240 # for things with embedded whitespace:
240 # for things with embedded whitespace:
241 list_strings:'execute alias readline_parse_and_bind ',
241 list_strings:'execute alias readline_parse_and_bind ',
242 # Regular strings need no conversion:
242 # Regular strings need no conversion:
243 None:'readline_remove_delims ',
243 None:'readline_remove_delims ',
244 }
244 }
245 # Default values for these
245 # Default values for these
246 rc_def = Struct(include = [],
246 rc_def = Struct(include = [],
247 import_mod = [],
247 import_mod = [],
248 import_all = [],
248 import_all = [],
249 import_some = [[]],
249 import_some = [[]],
250 execute = [],
250 execute = [],
251 execfile = [],
251 execfile = [],
252 alias = [],
252 alias = [],
253 readline_parse_and_bind = [],
253 readline_parse_and_bind = [],
254 readline_remove_delims = '',
254 readline_remove_delims = '',
255 )
255 )
256
256
257 # Build the type conversion dictionary from the above tables:
257 # Build the type conversion dictionary from the above tables:
258 typeconv = rcfile_opts.copy()
258 typeconv = rcfile_opts.copy()
259 typeconv.update(optstr2types(cmdline_opts))
259 typeconv.update(optstr2types(cmdline_opts))
260
260
261 # 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!
262 typeconv[None] += ' ' + rcfile_opts[None]
262 typeconv[None] += ' ' + rcfile_opts[None]
263
263
264 # Remove quotes at ends of all strings (used to protect spaces)
264 # Remove quotes at ends of all strings (used to protect spaces)
265 typeconv[unquote_ends] = typeconv[None]
265 typeconv[unquote_ends] = typeconv[None]
266 del typeconv[None]
266 del typeconv[None]
267
267
268 # 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:
269 opts_all = opts_def.copy()
269 opts_all = opts_def.copy()
270 opts_all.update(rc_def)
270 opts_all.update(rc_def)
271
271
272 # Build conflict resolver for recursive loading of config files:
272 # Build conflict resolver for recursive loading of config files:
273 # - preserve means the outermost file maintains the value, it is not
273 # - preserve means the outermost file maintains the value, it is not
274 # overwritten if an included file has the same key.
274 # overwritten if an included file has the same key.
275 # - 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
276 # 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
277 # deeper in the inclusion chain have lower precedence.
277 # deeper in the inclusion chain have lower precedence.
278 conflict = {'preserve': ' '.join([ typeconv[int],
278 conflict = {'preserve': ' '.join([ typeconv[int],
279 typeconv[unquote_ends] ]),
279 typeconv[unquote_ends] ]),
280 'add_flip': ' '.join([ typeconv[qwflat],
280 'add_flip': ' '.join([ typeconv[qwflat],
281 typeconv[qw_lol],
281 typeconv[qw_lol],
282 typeconv[list_strings] ])
282 typeconv[list_strings] ])
283 }
283 }
284
284
285 # Now actually process the command line
285 # Now actually process the command line
286 getopt = DPyGetOpt.DPyGetOpt()
286 getopt = DPyGetOpt.DPyGetOpt()
287 getopt.setIgnoreCase(0)
287 getopt.setIgnoreCase(0)
288
288
289 getopt.parseConfiguration(opts_names)
289 getopt.parseConfiguration(opts_names)
290
290
291 try:
291 try:
292 getopt.processArguments(argv)
292 getopt.processArguments(argv)
293 except:
293 except:
294 print cmd_line_usage
294 print cmd_line_usage
295 warn('\nError in Arguments: ' + `sys.exc_value`)
295 warn('\nError in Arguments: ' + `sys.exc_value`)
296 sys.exit(1)
296 sys.exit(1)
297
297
298 # 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
299 opts = Struct(getopt.optionValues)
299 opts = Struct(getopt.optionValues)
300 args = getopt.freeValues
300 args = getopt.freeValues
301
301
302 # 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
303 # we make all decisions:
303 # we make all decisions:
304 opts_all.update(opts)
304 opts_all.update(opts)
305
305
306 # Options that force an immediate exit
306 # Options that force an immediate exit
307 if opts_all.help:
307 if opts_all.help:
308 page(cmd_line_usage)
308 page(cmd_line_usage)
309 sys.exit()
309 sys.exit()
310
310
311 if opts_all.Version:
311 if opts_all.Version:
312 print __version__
312 print __version__
313 sys.exit()
313 sys.exit()
314
314
315 if opts_all.magic_docstrings:
315 if opts_all.magic_docstrings:
316 IP.magic_magic('-latex')
316 IP.magic_magic('-latex')
317 sys.exit()
317 sys.exit()
318
318
319 # 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
320 # *after* getting the cmd line options.
320 # *after* getting the cmd line options.
321 if not os.path.isdir(opts_all.ipythondir):
321 if not os.path.isdir(opts_all.ipythondir):
322 IP.user_setup(opts_all.ipythondir,rc_suffix,'install')
322 IP.user_setup(opts_all.ipythondir,rc_suffix,'install')
323
323
324 # upgrade user config files while preserving a copy of the originals
324 # upgrade user config files while preserving a copy of the originals
325 if opts_all.upgrade:
325 if opts_all.upgrade:
326 IP.user_setup(opts_all.ipythondir,rc_suffix,'upgrade')
326 IP.user_setup(opts_all.ipythondir,rc_suffix,'upgrade')
327
327
328 # check mutually exclusive options in the *original* command line
328 # check mutually exclusive options in the *original* command line
329 mutex_opts(opts,[qw('log logfile'),qw('rcfile profile'),
329 mutex_opts(opts,[qw('log logfile'),qw('rcfile profile'),
330 qw('classic profile'),qw('classic rcfile')])
330 qw('classic profile'),qw('classic rcfile')])
331
331
332 #---------------------------------------------------------------------------
332 #---------------------------------------------------------------------------
333 # Log replay
333 # Log replay
334
334
335 # 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
336 # replacing the current command line environment with that of the old
336 # replacing the current command line environment with that of the old
337 # session and moving on.
337 # session and moving on.
338
338
339 # 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
340 # opts_all will get overwritten:
340 # opts_all will get overwritten:
341 load_logplay = 0
341 load_logplay = 0
342
342
343 if opts_all.logplay:
343 if opts_all.logplay:
344 load_logplay = opts_all.logplay
344 load_logplay = opts_all.logplay
345 opts_debug_save = opts_all.debug
345 opts_debug_save = opts_all.debug
346 try:
346 try:
347 logplay = open(opts_all.logplay)
347 logplay = open(opts_all.logplay)
348 except IOError:
348 except IOError:
349 if opts_all.debug: IP.InteractiveTB()
349 if opts_all.debug: IP.InteractiveTB()
350 warn('Could not open logplay file '+`opts_all.logplay`)
350 warn('Could not open logplay file '+`opts_all.logplay`)
351 # 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
352 # 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
353 logplay = None
353 logplay = None
354 load_logplay = 0
354 load_logplay = 0
355 del opts_all.logplay
355 del opts_all.logplay
356 else:
356 else:
357 try:
357 try:
358 logplay.readline()
358 logplay.readline()
359 logplay.readline();
359 logplay.readline();
360 # this reloads that session's command line
360 # this reloads that session's command line
361 cmd = logplay.readline()[6:]
361 cmd = logplay.readline()[6:]
362 exec cmd
362 exec cmd
363 # restore the true debug flag given so that the process of
363 # restore the true debug flag given so that the process of
364 # session loading itself can be monitored.
364 # session loading itself can be monitored.
365 opts.debug = opts_debug_save
365 opts.debug = opts_debug_save
366 # 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
367 opts.logplay = load_logplay
367 opts.logplay = load_logplay
368 # now we must update our own structure with defaults
368 # now we must update our own structure with defaults
369 opts_all.update(opts)
369 opts_all.update(opts)
370 # now load args
370 # now load args
371 cmd = logplay.readline()[6:]
371 cmd = logplay.readline()[6:]
372 exec cmd
372 exec cmd
373 logplay.close()
373 logplay.close()
374 except:
374 except:
375 logplay.close()
375 logplay.close()
376 if opts_all.debug: IP.InteractiveTB()
376 if opts_all.debug: IP.InteractiveTB()
377 warn("Logplay file lacking full configuration information.\n"
377 warn("Logplay file lacking full configuration information.\n"
378 "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.")
379
379
380 #-------------------------------------------------------------------------
380 #-------------------------------------------------------------------------
381 # 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
382 # 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.
383
383
384 msg_out = 'Output messages. '
384 msg_out = 'Output messages. '
385 msg_err = 'Error messages. '
385 msg_err = 'Error messages. '
386 msg_sep = '\n'
386 msg_sep = '\n'
387 msg = Struct(config = OutputTrap('Configuration Loader',msg_out,
387 msg = Struct(config = OutputTrap('Configuration Loader',msg_out,
388 msg_err,msg_sep,debug,
388 msg_err,msg_sep,debug,
389 quiet_out=1),
389 quiet_out=1),
390 user_exec = OutputTrap('User File Execution',msg_out,
390 user_exec = OutputTrap('User File Execution',msg_out,
391 msg_err,msg_sep,debug),
391 msg_err,msg_sep,debug),
392 logplay = OutputTrap('Log Loader',msg_out,
392 logplay = OutputTrap('Log Loader',msg_out,
393 msg_err,msg_sep,debug),
393 msg_err,msg_sep,debug),
394 summary = ''
394 summary = ''
395 )
395 )
396
396
397 #-------------------------------------------------------------------------
397 #-------------------------------------------------------------------------
398 # Process user ipythonrc-type configuration files
398 # Process user ipythonrc-type configuration files
399
399
400 # turn on output trapping and log to msg.config
400 # turn on output trapping and log to msg.config
401 # remember that with debug on, trapping is actually disabled
401 # remember that with debug on, trapping is actually disabled
402 msg.config.trap_all()
402 msg.config.trap_all()
403
403
404 # look for rcfile in current or default directory
404 # look for rcfile in current or default directory
405 try:
405 try:
406 opts_all.rcfile = filefind(opts_all.rcfile,opts_all.ipythondir)
406 opts_all.rcfile = filefind(opts_all.rcfile,opts_all.ipythondir)
407 except IOError:
407 except IOError:
408 if opts_all.debug: IP.InteractiveTB()
408 if opts_all.debug: IP.InteractiveTB()
409 warn('Configuration file %s not found. Ignoring request.'
409 warn('Configuration file %s not found. Ignoring request.'
410 % (opts_all.rcfile) )
410 % (opts_all.rcfile) )
411
411
412 # 'profiles' are a shorthand notation for config filenames
412 # 'profiles' are a shorthand notation for config filenames
413 if opts_all.profile:
413 if opts_all.profile:
414
414
415 try:
415 try:
416 opts_all.rcfile = filefind('ipythonrc-' + opts_all.profile
416 opts_all.rcfile = filefind('ipythonrc-' + opts_all.profile
417 + rc_suffix,
417 + rc_suffix,
418 opts_all.ipythondir)
418 opts_all.ipythondir)
419 except IOError:
419 except IOError:
420 if opts_all.debug: IP.InteractiveTB()
420 if opts_all.debug: IP.InteractiveTB()
421 opts.profile = '' # remove profile from options if invalid
421 opts.profile = '' # remove profile from options if invalid
422 warn('Profile configuration file %s not found. Ignoring request.'
422 # We won't warn anymore, primary method is ipy_profile_PROFNAME
423 % (opts_all.profile) )
423 # which does trigger a warning.
424
425
424
426 # load the config file
425 # load the config file
427 rcfiledata = None
426 rcfiledata = None
428 if opts_all.quick:
427 if opts_all.quick:
429 print 'Launching IPython in quick mode. No config file read.'
428 print 'Launching IPython in quick mode. No config file read.'
430 elif opts_all.classic:
429 elif opts_all.classic:
431 print 'Launching IPython in classic mode. No config file read.'
430 print 'Launching IPython in classic mode. No config file read.'
432 elif opts_all.rcfile:
431 elif opts_all.rcfile:
433 try:
432 try:
434 cfg_loader = ConfigLoader(conflict)
433 cfg_loader = ConfigLoader(conflict)
435 rcfiledata = cfg_loader.load(opts_all.rcfile,typeconv,
434 rcfiledata = cfg_loader.load(opts_all.rcfile,typeconv,
436 'include',opts_all.ipythondir,
435 'include',opts_all.ipythondir,
437 purge = 1,
436 purge = 1,
438 unique = conflict['preserve'])
437 unique = conflict['preserve'])
439 except:
438 except:
440 IP.InteractiveTB()
439 IP.InteractiveTB()
441 warn('Problems loading configuration file '+
440 warn('Problems loading configuration file '+
442 `opts_all.rcfile`+
441 `opts_all.rcfile`+
443 '\nStarting with default -bare bones- configuration.')
442 '\nStarting with default -bare bones- configuration.')
444 else:
443 else:
445 warn('No valid configuration file found in either currrent directory\n'+
444 warn('No valid configuration file found in either currrent directory\n'+
446 'or in the IPython config. directory: '+`opts_all.ipythondir`+
445 'or in the IPython config. directory: '+`opts_all.ipythondir`+
447 '\nProceeding with internal defaults.')
446 '\nProceeding with internal defaults.')
448
447
449 #------------------------------------------------------------------------
448 #------------------------------------------------------------------------
450 # Set exception handlers in mode requested by user.
449 # Set exception handlers in mode requested by user.
451 otrap = OutputTrap(trap_out=1) # trap messages from magic_xmode
450 otrap = OutputTrap(trap_out=1) # trap messages from magic_xmode
452 IP.magic_xmode(opts_all.xmode)
451 IP.magic_xmode(opts_all.xmode)
453 otrap.release_out()
452 otrap.release_out()
454
453
455 #------------------------------------------------------------------------
454 #------------------------------------------------------------------------
456 # Execute user config
455 # Execute user config
457
456
458 # Create a valid config structure with the right precedence order:
457 # Create a valid config structure with the right precedence order:
459 # defaults < rcfile < command line. This needs to be in the instance, so
458 # defaults < rcfile < command line. This needs to be in the instance, so
460 # that method calls below that rely on it find it.
459 # that method calls below that rely on it find it.
461 IP.rc = rc_def.copy()
460 IP.rc = rc_def.copy()
462
461
463 # Work with a local alias inside this routine to avoid unnecessary
462 # Work with a local alias inside this routine to avoid unnecessary
464 # attribute lookups.
463 # attribute lookups.
465 IP_rc = IP.rc
464 IP_rc = IP.rc
466
465
467 IP_rc.update(opts_def)
466 IP_rc.update(opts_def)
468 if rcfiledata:
467 if rcfiledata:
469 # now we can update
468 # now we can update
470 IP_rc.update(rcfiledata)
469 IP_rc.update(rcfiledata)
471 IP_rc.update(opts)
470 IP_rc.update(opts)
472 IP_rc.update(rc_override)
471 IP_rc.update(rc_override)
473
472
474 # Store the original cmd line for reference:
473 # Store the original cmd line for reference:
475 IP_rc.opts = opts
474 IP_rc.opts = opts
476 IP_rc.args = args
475 IP_rc.args = args
477
476
478 # create a *runtime* Struct like rc for holding parameters which may be
477 # create a *runtime* Struct like rc for holding parameters which may be
479 # created and/or modified by runtime user extensions.
478 # created and/or modified by runtime user extensions.
480 IP.runtime_rc = Struct()
479 IP.runtime_rc = Struct()
481
480
482 # from this point on, all config should be handled through IP_rc,
481 # from this point on, all config should be handled through IP_rc,
483 # opts* shouldn't be used anymore.
482 # opts* shouldn't be used anymore.
484
483
485
484
486 # update IP_rc with some special things that need manual
485 # update IP_rc with some special things that need manual
487 # tweaks. Basically options which affect other options. I guess this
486 # tweaks. Basically options which affect other options. I guess this
488 # should just be written so that options are fully orthogonal and we
487 # should just be written so that options are fully orthogonal and we
489 # wouldn't worry about this stuff!
488 # wouldn't worry about this stuff!
490
489
491 if IP_rc.classic:
490 if IP_rc.classic:
492 IP_rc.quick = 1
491 IP_rc.quick = 1
493 IP_rc.cache_size = 0
492 IP_rc.cache_size = 0
494 IP_rc.pprint = 0
493 IP_rc.pprint = 0
495 IP_rc.prompt_in1 = '>>> '
494 IP_rc.prompt_in1 = '>>> '
496 IP_rc.prompt_in2 = '... '
495 IP_rc.prompt_in2 = '... '
497 IP_rc.prompt_out = ''
496 IP_rc.prompt_out = ''
498 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
497 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
499 IP_rc.colors = 'NoColor'
498 IP_rc.colors = 'NoColor'
500 IP_rc.xmode = 'Plain'
499 IP_rc.xmode = 'Plain'
501
500
502 # configure readline
501 # configure readline
503 # Define the history file for saving commands in between sessions
502 # Define the history file for saving commands in between sessions
504 if IP_rc.profile:
503 if IP_rc.profile:
505 histfname = 'history-%s' % IP_rc.profile
504 histfname = 'history-%s' % IP_rc.profile
506 else:
505 else:
507 histfname = 'history'
506 histfname = 'history'
508 IP.histfile = os.path.join(opts_all.ipythondir,histfname)
507 IP.histfile = os.path.join(opts_all.ipythondir,histfname)
509
508
510 # update exception handlers with rc file status
509 # update exception handlers with rc file status
511 otrap.trap_out() # I don't want these messages ever.
510 otrap.trap_out() # I don't want these messages ever.
512 IP.magic_xmode(IP_rc.xmode)
511 IP.magic_xmode(IP_rc.xmode)
513 otrap.release_out()
512 otrap.release_out()
514
513
515 # activate logging if requested and not reloading a log
514 # activate logging if requested and not reloading a log
516 if IP_rc.logplay:
515 if IP_rc.logplay:
517 IP.magic_logstart(IP_rc.logplay + ' append')
516 IP.magic_logstart(IP_rc.logplay + ' append')
518 elif IP_rc.logfile:
517 elif IP_rc.logfile:
519 IP.magic_logstart(IP_rc.logfile)
518 IP.magic_logstart(IP_rc.logfile)
520 elif IP_rc.log:
519 elif IP_rc.log:
521 IP.magic_logstart()
520 IP.magic_logstart()
522
521
523 # find user editor so that it we don't have to look it up constantly
522 # find user editor so that it we don't have to look it up constantly
524 if IP_rc.editor.strip()=='0':
523 if IP_rc.editor.strip()=='0':
525 try:
524 try:
526 ed = os.environ['EDITOR']
525 ed = os.environ['EDITOR']
527 except KeyError:
526 except KeyError:
528 if os.name == 'posix':
527 if os.name == 'posix':
529 ed = 'vi' # the only one guaranteed to be there!
528 ed = 'vi' # the only one guaranteed to be there!
530 else:
529 else:
531 ed = 'notepad' # same in Windows!
530 ed = 'notepad' # same in Windows!
532 IP_rc.editor = ed
531 IP_rc.editor = ed
533
532
534 # Keep track of whether this is an embedded instance or not (useful for
533 # Keep track of whether this is an embedded instance or not (useful for
535 # post-mortems).
534 # post-mortems).
536 IP_rc.embedded = IP.embedded
535 IP_rc.embedded = IP.embedded
537
536
538 # Recursive reload
537 # Recursive reload
539 try:
538 try:
540 from IPython import deep_reload
539 from IPython import deep_reload
541 if IP_rc.deep_reload:
540 if IP_rc.deep_reload:
542 __builtin__.reload = deep_reload.reload
541 __builtin__.reload = deep_reload.reload
543 else:
542 else:
544 __builtin__.dreload = deep_reload.reload
543 __builtin__.dreload = deep_reload.reload
545 del deep_reload
544 del deep_reload
546 except ImportError:
545 except ImportError:
547 pass
546 pass
548
547
549 # Save the current state of our namespace so that the interactive shell
548 # Save the current state of our namespace so that the interactive shell
550 # can later know which variables have been created by us from config files
549 # can later know which variables have been created by us from config files
551 # and loading. This way, loading a file (in any way) is treated just like
550 # and loading. This way, loading a file (in any way) is treated just like
552 # defining things on the command line, and %who works as expected.
551 # defining things on the command line, and %who works as expected.
553
552
554 # DON'T do anything that affects the namespace beyond this point!
553 # DON'T do anything that affects the namespace beyond this point!
555 IP.internal_ns.update(__main__.__dict__)
554 IP.internal_ns.update(__main__.__dict__)
556
555
557 #IP.internal_ns.update(locals()) # so our stuff doesn't show up in %who
556 #IP.internal_ns.update(locals()) # so our stuff doesn't show up in %who
558
557
559 # Now run through the different sections of the users's config
558 # Now run through the different sections of the users's config
560 if IP_rc.debug:
559 if IP_rc.debug:
561 print 'Trying to execute the following configuration structure:'
560 print 'Trying to execute the following configuration structure:'
562 print '(Things listed first are deeper in the inclusion tree and get'
561 print '(Things listed first are deeper in the inclusion tree and get'
563 print 'loaded first).\n'
562 print 'loaded first).\n'
564 pprint(IP_rc.__dict__)
563 pprint(IP_rc.__dict__)
565
564
566 for mod in IP_rc.import_mod:
565 for mod in IP_rc.import_mod:
567 try:
566 try:
568 exec 'import '+mod in IP.user_ns
567 exec 'import '+mod in IP.user_ns
569 except :
568 except :
570 IP.InteractiveTB()
569 IP.InteractiveTB()
571 import_fail_info(mod)
570 import_fail_info(mod)
572
571
573 for mod_fn in IP_rc.import_some:
572 for mod_fn in IP_rc.import_some:
574 if mod_fn == []: break
573 if mod_fn == []: break
575 mod,fn = mod_fn[0],','.join(mod_fn[1:])
574 mod,fn = mod_fn[0],','.join(mod_fn[1:])
576 try:
575 try:
577 exec 'from '+mod+' import '+fn in IP.user_ns
576 exec 'from '+mod+' import '+fn in IP.user_ns
578 except :
577 except :
579 IP.InteractiveTB()
578 IP.InteractiveTB()
580 import_fail_info(mod,fn)
579 import_fail_info(mod,fn)
581
580
582 for mod in IP_rc.import_all:
581 for mod in IP_rc.import_all:
583 try:
582 try:
584 exec 'from '+mod+' import *' in IP.user_ns
583 exec 'from '+mod+' import *' in IP.user_ns
585 except :
584 except :
586 IP.InteractiveTB()
585 IP.InteractiveTB()
587 import_fail_info(mod)
586 import_fail_info(mod)
588
587
589 for code in IP_rc.execute:
588 for code in IP_rc.execute:
590 try:
589 try:
591 exec code in IP.user_ns
590 exec code in IP.user_ns
592 except:
591 except:
593 IP.InteractiveTB()
592 IP.InteractiveTB()
594 warn('Failure executing code: ' + `code`)
593 warn('Failure executing code: ' + `code`)
595
594
596 # Execute the files the user wants in ipythonrc
595 # Execute the files the user wants in ipythonrc
597 for file in IP_rc.execfile:
596 for file in IP_rc.execfile:
598 try:
597 try:
599 file = filefind(file,sys.path+[IPython_dir])
598 file = filefind(file,sys.path+[IPython_dir])
600 except IOError:
599 except IOError:
601 warn(itpl('File $file not found. Skipping it.'))
600 warn(itpl('File $file not found. Skipping it.'))
602 else:
601 else:
603 IP.safe_execfile(os.path.expanduser(file),IP.user_ns)
602 IP.safe_execfile(os.path.expanduser(file),IP.user_ns)
604
603
605 # finally, try importing ipy_*_conf for final configuration
604 # finally, try importing ipy_*_conf for final configuration
606 try:
605 try:
607 import ipy_system_conf
606 import ipy_system_conf
608 except ImportError:
607 except ImportError:
608 if opts_all.debug: IP.InteractiveTB()
609 warn("Could not import 'ipy_system_conf'")
609 warn("Could not import 'ipy_system_conf'")
610 pass
610
611 if opts_all.profile:
611 if opts_all.profile:
612 profmodname = 'ipy_profile_' + opts_all.profile
612 profmodname = 'ipy_profile_' + opts_all.profile
613 try:
613 try:
614 __import__(profmodname)
614 __import__(profmodname)
615 except ImportError:
615 except ImportError:
616 warn("Could not import '%s'" % profmodname)
616 # only warn if ipythonrc-PROFNAME didn't exist
617 if opts.profile =='':
618 warn("Could not start with profile '%s'!\n ('%s/%s.py' does not exist?)" % (
619 opts_all.profile, ipythondir, profmodname)
620
621 )
617 try:
622 try:
618 import ipy_user_conf
623 import ipy_user_conf
619 except ImportError:
624 except ImportError:
620 warn('Could not import ipy_user_conf')
625 if opts_all.debug: IP.InteractiveTB()
626 warn("Could not import user config!\n ('%s/ipy_user_conf.py' does not exist?)" %
627 ipythondir)
621
628
622 # release stdout and stderr and save config log into a global summary
629 # release stdout and stderr and save config log into a global summary
623 msg.config.release_all()
630 msg.config.release_all()
624 if IP_rc.messages:
631 if IP_rc.messages:
625 msg.summary += msg.config.summary_all()
632 msg.summary += msg.config.summary_all()
626
633
627 #------------------------------------------------------------------------
634 #------------------------------------------------------------------------
628 # Setup interactive session
635 # Setup interactive session
629
636
630 # Now we should be fully configured. We can then execute files or load
637 # Now we should be fully configured. We can then execute files or load
631 # things only needed for interactive use. Then we'll open the shell.
638 # things only needed for interactive use. Then we'll open the shell.
632
639
633 # Take a snapshot of the user namespace before opening the shell. That way
640 # Take a snapshot of the user namespace before opening the shell. That way
634 # we'll be able to identify which things were interactively defined and
641 # we'll be able to identify which things were interactively defined and
635 # which were defined through config files.
642 # which were defined through config files.
636 IP.user_config_ns = IP.user_ns.copy()
643 IP.user_config_ns = IP.user_ns.copy()
637
644
638 # Force reading a file as if it were a session log. Slower but safer.
645 # Force reading a file as if it were a session log. Slower but safer.
639 if load_logplay:
646 if load_logplay:
640 print 'Replaying log...'
647 print 'Replaying log...'
641 try:
648 try:
642 if IP_rc.debug:
649 if IP_rc.debug:
643 logplay_quiet = 0
650 logplay_quiet = 0
644 else:
651 else:
645 logplay_quiet = 1
652 logplay_quiet = 1
646
653
647 msg.logplay.trap_all()
654 msg.logplay.trap_all()
648 IP.safe_execfile(load_logplay,IP.user_ns,
655 IP.safe_execfile(load_logplay,IP.user_ns,
649 islog = 1, quiet = logplay_quiet)
656 islog = 1, quiet = logplay_quiet)
650 msg.logplay.release_all()
657 msg.logplay.release_all()
651 if IP_rc.messages:
658 if IP_rc.messages:
652 msg.summary += msg.logplay.summary_all()
659 msg.summary += msg.logplay.summary_all()
653 except:
660 except:
654 warn('Problems replaying logfile %s.' % load_logplay)
661 warn('Problems replaying logfile %s.' % load_logplay)
655 IP.InteractiveTB()
662 IP.InteractiveTB()
656
663
657 # Load remaining files in command line
664 # Load remaining files in command line
658 msg.user_exec.trap_all()
665 msg.user_exec.trap_all()
659
666
660 # Do NOT execute files named in the command line as scripts to be loaded
667 # Do NOT execute files named in the command line as scripts to be loaded
661 # by embedded instances. Doing so has the potential for an infinite
668 # by embedded instances. Doing so has the potential for an infinite
662 # recursion if there are exceptions thrown in the process.
669 # recursion if there are exceptions thrown in the process.
663
670
664 # XXX FIXME: the execution of user files should be moved out to after
671 # XXX FIXME: the execution of user files should be moved out to after
665 # ipython is fully initialized, just as if they were run via %run at the
672 # ipython is fully initialized, just as if they were run via %run at the
666 # ipython prompt. This would also give them the benefit of ipython's
673 # ipython prompt. This would also give them the benefit of ipython's
667 # nice tracebacks.
674 # nice tracebacks.
668
675
669 if not embedded and IP_rc.args:
676 if not embedded and IP_rc.args:
670 name_save = IP.user_ns['__name__']
677 name_save = IP.user_ns['__name__']
671 IP.user_ns['__name__'] = '__main__'
678 IP.user_ns['__name__'] = '__main__'
672 # Set our own excepthook in case the user code tries to call it
679 # Set our own excepthook in case the user code tries to call it
673 # directly. This prevents triggering the IPython crash handler.
680 # directly. This prevents triggering the IPython crash handler.
674 old_excepthook,sys.excepthook = sys.excepthook, IP.excepthook
681 old_excepthook,sys.excepthook = sys.excepthook, IP.excepthook
675
682
676 save_argv = sys.argv[:] # save it for later restoring
683 save_argv = sys.argv[:] # save it for later restoring
677
684
678 sys.argv = args
685 sys.argv = args
679
686
680 try:
687 try:
681 IP.safe_execfile(args[0], IP.user_ns)
688 IP.safe_execfile(args[0], IP.user_ns)
682 finally:
689 finally:
683 # Reset our crash handler in place
690 # Reset our crash handler in place
684 sys.excepthook = old_excepthook
691 sys.excepthook = old_excepthook
685 sys.argv = save_argv
692 sys.argv = save_argv
686 IP.user_ns['__name__'] = name_save
693 IP.user_ns['__name__'] = name_save
687
694
688 msg.user_exec.release_all()
695 msg.user_exec.release_all()
689 if IP_rc.messages:
696 if IP_rc.messages:
690 msg.summary += msg.user_exec.summary_all()
697 msg.summary += msg.user_exec.summary_all()
691
698
692 # since we can't specify a null string on the cmd line, 0 is the equivalent:
699 # since we can't specify a null string on the cmd line, 0 is the equivalent:
693 if IP_rc.nosep:
700 if IP_rc.nosep:
694 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
701 IP_rc.separate_in = IP_rc.separate_out = IP_rc.separate_out2 = '0'
695 if IP_rc.separate_in == '0': IP_rc.separate_in = ''
702 if IP_rc.separate_in == '0': IP_rc.separate_in = ''
696 if IP_rc.separate_out == '0': IP_rc.separate_out = ''
703 if IP_rc.separate_out == '0': IP_rc.separate_out = ''
697 if IP_rc.separate_out2 == '0': IP_rc.separate_out2 = ''
704 if IP_rc.separate_out2 == '0': IP_rc.separate_out2 = ''
698 IP_rc.separate_in = IP_rc.separate_in.replace('\\n','\n')
705 IP_rc.separate_in = IP_rc.separate_in.replace('\\n','\n')
699 IP_rc.separate_out = IP_rc.separate_out.replace('\\n','\n')
706 IP_rc.separate_out = IP_rc.separate_out.replace('\\n','\n')
700 IP_rc.separate_out2 = IP_rc.separate_out2.replace('\\n','\n')
707 IP_rc.separate_out2 = IP_rc.separate_out2.replace('\\n','\n')
701
708
702 # Determine how many lines at the bottom of the screen are needed for
709 # Determine how many lines at the bottom of the screen are needed for
703 # showing prompts, so we can know wheter long strings are to be printed or
710 # showing prompts, so we can know wheter long strings are to be printed or
704 # paged:
711 # paged:
705 num_lines_bot = IP_rc.separate_in.count('\n')+1
712 num_lines_bot = IP_rc.separate_in.count('\n')+1
706 IP_rc.screen_length = IP_rc.screen_length - num_lines_bot
713 IP_rc.screen_length = IP_rc.screen_length - num_lines_bot
707
714
708 # configure startup banner
715 # configure startup banner
709 if IP_rc.c: # regular python doesn't print the banner with -c
716 if IP_rc.c: # regular python doesn't print the banner with -c
710 IP_rc.banner = 0
717 IP_rc.banner = 0
711 if IP_rc.banner:
718 if IP_rc.banner:
712 BANN_P = IP.BANNER_PARTS
719 BANN_P = IP.BANNER_PARTS
713 else:
720 else:
714 BANN_P = []
721 BANN_P = []
715
722
716 if IP_rc.profile: BANN_P.append('IPython profile: %s\n' % IP_rc.profile)
723 if IP_rc.profile: BANN_P.append('IPython profile: %s\n' % IP_rc.profile)
717
724
718 # add message log (possibly empty)
725 # add message log (possibly empty)
719 if msg.summary: BANN_P.append(msg.summary)
726 if msg.summary: BANN_P.append(msg.summary)
720 # Final banner is a string
727 # Final banner is a string
721 IP.BANNER = '\n'.join(BANN_P)
728 IP.BANNER = '\n'.join(BANN_P)
722
729
723 # Finalize the IPython instance. This assumes the rc structure is fully
730 # Finalize the IPython instance. This assumes the rc structure is fully
724 # in place.
731 # in place.
725 IP.post_config_initialization()
732 IP.post_config_initialization()
726
733
727 return IP
734 return IP
728 #************************ end of file <ipmaker.py> **************************
735 #************************ end of file <ipmaker.py> **************************
General Comments 0
You need to be logged in to leave comments. Login now