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