##// END OF EJS Templates
Provide "realistic" sys.argv for scripts run via ipython...
vivainio -
Show More

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

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