##// END OF EJS Templates
ask_yes_no on %%file overwrite
MinRK -
Show More
@@ -1,713 +1,725 b''
1 1 """Implementation of magic functions for interaction with the OS.
2 2
3 3 Note: this module is named 'osm' instead of 'os' to avoid a collision with the
4 4 builtin.
5 5 """
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (c) 2012 The IPython Development Team.
8 8 #
9 9 # Distributed under the terms of the Modified BSD License.
10 10 #
11 11 # The full license is in the file COPYING.txt, distributed with this software.
12 12 #-----------------------------------------------------------------------------
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Imports
16 16 #-----------------------------------------------------------------------------
17 17
18 18 # Stdlib
19 import io
19 20 import os
20 21 import re
21 22 import sys
22 23 from pprint import pformat
23 24
24 25 # Our own packages
25 26 from IPython.core import magic_arguments
26 27 from IPython.core import oinspect
27 28 from IPython.core import page
28 from IPython.core.error import UsageError
29 from IPython.core.error import UsageError, StdinNotImplementedError
29 30 from IPython.core.magic import (
30 31 Magics, compress_dhist, magics_class, line_magic, cell_magic
31 32 )
32 33 from IPython.testing.skipdoctest import skip_doctest
33 34 from IPython.utils.io import file_read, nlprint
34 35 from IPython.utils.path import get_py_filename, unquote_filename
35 36 from IPython.utils.process import abbrev_cwd
36 37 from IPython.utils.terminal import set_term_title
37 38 #-----------------------------------------------------------------------------
38 39 # Magic implementation classes
39 40 #-----------------------------------------------------------------------------
40 41 @magics_class
41 42 class OSMagics(Magics):
42 43 """Magics to interact with the underlying OS (shell-type functionality).
43 44 """
44 45
45 46 @skip_doctest
46 47 @line_magic
47 48 def alias(self, parameter_s=''):
48 49 """Define an alias for a system command.
49 50
50 51 '%alias alias_name cmd' defines 'alias_name' as an alias for 'cmd'
51 52
52 53 Then, typing 'alias_name params' will execute the system command 'cmd
53 54 params' (from your underlying operating system).
54 55
55 56 Aliases have lower precedence than magic functions and Python normal
56 57 variables, so if 'foo' is both a Python variable and an alias, the
57 58 alias can not be executed until 'del foo' removes the Python variable.
58 59
59 60 You can use the %l specifier in an alias definition to represent the
60 61 whole line when the alias is called. For example::
61 62
62 63 In [2]: alias bracket echo "Input in brackets: <%l>"
63 64 In [3]: bracket hello world
64 65 Input in brackets: <hello world>
65 66
66 67 You can also define aliases with parameters using %s specifiers (one
67 68 per parameter)::
68 69
69 70 In [1]: alias parts echo first %s second %s
70 71 In [2]: %parts A B
71 72 first A second B
72 73 In [3]: %parts A
73 74 Incorrect number of arguments: 2 expected.
74 75 parts is an alias to: 'echo first %s second %s'
75 76
76 77 Note that %l and %s are mutually exclusive. You can only use one or
77 78 the other in your aliases.
78 79
79 80 Aliases expand Python variables just like system calls using ! or !!
80 81 do: all expressions prefixed with '$' get expanded. For details of
81 82 the semantic rules, see PEP-215:
82 83 http://www.python.org/peps/pep-0215.html. This is the library used by
83 84 IPython for variable expansion. If you want to access a true shell
84 85 variable, an extra $ is necessary to prevent its expansion by
85 86 IPython::
86 87
87 88 In [6]: alias show echo
88 89 In [7]: PATH='A Python string'
89 90 In [8]: show $PATH
90 91 A Python string
91 92 In [9]: show $$PATH
92 93 /usr/local/lf9560/bin:/usr/local/intel/compiler70/ia32/bin:...
93 94
94 95 You can use the alias facility to acess all of $PATH. See the %rehash
95 96 and %rehashx functions, which automatically create aliases for the
96 97 contents of your $PATH.
97 98
98 99 If called with no parameters, %alias prints the current alias table."""
99 100
100 101 par = parameter_s.strip()
101 102 if not par:
102 103 aliases = sorted(self.shell.alias_manager.aliases)
103 104 # stored = self.shell.db.get('stored_aliases', {} )
104 105 # for k, v in stored:
105 106 # atab.append(k, v[0])
106 107
107 108 print "Total number of aliases:", len(aliases)
108 109 sys.stdout.flush()
109 110 return aliases
110 111
111 112 # Now try to define a new one
112 113 try:
113 114 alias,cmd = par.split(None, 1)
114 115 except:
115 116 print oinspect.getdoc(self.alias)
116 117 else:
117 118 self.shell.alias_manager.soft_define_alias(alias, cmd)
118 119 # end magic_alias
119 120
120 121 @line_magic
121 122 def unalias(self, parameter_s=''):
122 123 """Remove an alias"""
123 124
124 125 aname = parameter_s.strip()
125 126 self.shell.alias_manager.undefine_alias(aname)
126 127 stored = self.shell.db.get('stored_aliases', {} )
127 128 if aname in stored:
128 129 print "Removing %stored alias",aname
129 130 del stored[aname]
130 131 self.shell.db['stored_aliases'] = stored
131 132
132 133 @line_magic
133 134 def rehashx(self, parameter_s=''):
134 135 """Update the alias table with all executable files in $PATH.
135 136
136 137 This version explicitly checks that every entry in $PATH is a file
137 138 with execute access (os.X_OK), so it is much slower than %rehash.
138 139
139 140 Under Windows, it checks executability as a match against a
140 141 '|'-separated string of extensions, stored in the IPython config
141 142 variable win_exec_ext. This defaults to 'exe|com|bat'.
142 143
143 144 This function also resets the root module cache of module completer,
144 145 used on slow filesystems.
145 146 """
146 147 from IPython.core.alias import InvalidAliasError
147 148
148 149 # for the benefit of module completer in ipy_completers.py
149 150 del self.shell.db['rootmodules']
150 151
151 152 path = [os.path.abspath(os.path.expanduser(p)) for p in
152 153 os.environ.get('PATH','').split(os.pathsep)]
153 154 path = filter(os.path.isdir,path)
154 155
155 156 syscmdlist = []
156 157 # Now define isexec in a cross platform manner.
157 158 if os.name == 'posix':
158 159 isexec = lambda fname:os.path.isfile(fname) and \
159 160 os.access(fname,os.X_OK)
160 161 else:
161 162 try:
162 163 winext = os.environ['pathext'].replace(';','|').replace('.','')
163 164 except KeyError:
164 165 winext = 'exe|com|bat|py'
165 166 if 'py' not in winext:
166 167 winext += '|py'
167 168 execre = re.compile(r'(.*)\.(%s)$' % winext,re.IGNORECASE)
168 169 isexec = lambda fname:os.path.isfile(fname) and execre.match(fname)
169 170 savedir = os.getcwdu()
170 171
171 172 # Now walk the paths looking for executables to alias.
172 173 try:
173 174 # write the whole loop for posix/Windows so we don't have an if in
174 175 # the innermost part
175 176 if os.name == 'posix':
176 177 for pdir in path:
177 178 os.chdir(pdir)
178 179 for ff in os.listdir(pdir):
179 180 if isexec(ff):
180 181 try:
181 182 # Removes dots from the name since ipython
182 183 # will assume names with dots to be python.
183 184 self.shell.alias_manager.define_alias(
184 185 ff.replace('.',''), ff)
185 186 except InvalidAliasError:
186 187 pass
187 188 else:
188 189 syscmdlist.append(ff)
189 190 else:
190 191 no_alias = self.shell.alias_manager.no_alias
191 192 for pdir in path:
192 193 os.chdir(pdir)
193 194 for ff in os.listdir(pdir):
194 195 base, ext = os.path.splitext(ff)
195 196 if isexec(ff) and base.lower() not in no_alias:
196 197 if ext.lower() == '.exe':
197 198 ff = base
198 199 try:
199 200 # Removes dots from the name since ipython
200 201 # will assume names with dots to be python.
201 202 self.shell.alias_manager.define_alias(
202 203 base.lower().replace('.',''), ff)
203 204 except InvalidAliasError:
204 205 pass
205 206 syscmdlist.append(ff)
206 207 self.shell.db['syscmdlist'] = syscmdlist
207 208 finally:
208 209 os.chdir(savedir)
209 210
210 211 @skip_doctest
211 212 @line_magic
212 213 def pwd(self, parameter_s=''):
213 214 """Return the current working directory path.
214 215
215 216 Examples
216 217 --------
217 218 ::
218 219
219 220 In [9]: pwd
220 221 Out[9]: '/home/tsuser/sprint/ipython'
221 222 """
222 223 return os.getcwdu()
223 224
224 225 @skip_doctest
225 226 @line_magic
226 227 def cd(self, parameter_s=''):
227 228 """Change the current working directory.
228 229
229 230 This command automatically maintains an internal list of directories
230 231 you visit during your IPython session, in the variable _dh. The
231 232 command %dhist shows this history nicely formatted. You can also
232 233 do 'cd -<tab>' to see directory history conveniently.
233 234
234 235 Usage:
235 236
236 237 cd 'dir': changes to directory 'dir'.
237 238
238 239 cd -: changes to the last visited directory.
239 240
240 241 cd -<n>: changes to the n-th directory in the directory history.
241 242
242 243 cd --foo: change to directory that matches 'foo' in history
243 244
244 245 cd -b <bookmark_name>: jump to a bookmark set by %bookmark
245 246 (note: cd <bookmark_name> is enough if there is no
246 247 directory <bookmark_name>, but a bookmark with the name exists.)
247 248 'cd -b <tab>' allows you to tab-complete bookmark names.
248 249
249 250 Options:
250 251
251 252 -q: quiet. Do not print the working directory after the cd command is
252 253 executed. By default IPython's cd command does print this directory,
253 254 since the default prompts do not display path information.
254 255
255 256 Note that !cd doesn't work for this purpose because the shell where
256 257 !command runs is immediately discarded after executing 'command'.
257 258
258 259 Examples
259 260 --------
260 261 ::
261 262
262 263 In [10]: cd parent/child
263 264 /home/tsuser/parent/child
264 265 """
265 266
266 267 oldcwd = os.getcwdu()
267 268 numcd = re.match(r'(-)(\d+)$',parameter_s)
268 269 # jump in directory history by number
269 270 if numcd:
270 271 nn = int(numcd.group(2))
271 272 try:
272 273 ps = self.shell.user_ns['_dh'][nn]
273 274 except IndexError:
274 275 print 'The requested directory does not exist in history.'
275 276 return
276 277 else:
277 278 opts = {}
278 279 elif parameter_s.startswith('--'):
279 280 ps = None
280 281 fallback = None
281 282 pat = parameter_s[2:]
282 283 dh = self.shell.user_ns['_dh']
283 284 # first search only by basename (last component)
284 285 for ent in reversed(dh):
285 286 if pat in os.path.basename(ent) and os.path.isdir(ent):
286 287 ps = ent
287 288 break
288 289
289 290 if fallback is None and pat in ent and os.path.isdir(ent):
290 291 fallback = ent
291 292
292 293 # if we have no last part match, pick the first full path match
293 294 if ps is None:
294 295 ps = fallback
295 296
296 297 if ps is None:
297 298 print "No matching entry in directory history"
298 299 return
299 300 else:
300 301 opts = {}
301 302
302 303
303 304 else:
304 305 #turn all non-space-escaping backslashes to slashes,
305 306 # for c:\windows\directory\names\
306 307 parameter_s = re.sub(r'\\(?! )','/', parameter_s)
307 308 opts,ps = self.parse_options(parameter_s,'qb',mode='string')
308 309 # jump to previous
309 310 if ps == '-':
310 311 try:
311 312 ps = self.shell.user_ns['_dh'][-2]
312 313 except IndexError:
313 314 raise UsageError('%cd -: No previous directory to change to.')
314 315 # jump to bookmark if needed
315 316 else:
316 317 if not os.path.isdir(ps) or 'b' in opts:
317 318 bkms = self.shell.db.get('bookmarks', {})
318 319
319 320 if ps in bkms:
320 321 target = bkms[ps]
321 322 print '(bookmark:%s) -> %s' % (ps, target)
322 323 ps = target
323 324 else:
324 325 if 'b' in opts:
325 326 raise UsageError("Bookmark '%s' not found. "
326 327 "Use '%%bookmark -l' to see your bookmarks." % ps)
327 328
328 329 # strip extra quotes on Windows, because os.chdir doesn't like them
329 330 ps = unquote_filename(ps)
330 331 # at this point ps should point to the target dir
331 332 if ps:
332 333 try:
333 334 os.chdir(os.path.expanduser(ps))
334 335 if hasattr(self.shell, 'term_title') and self.shell.term_title:
335 336 set_term_title('IPython: ' + abbrev_cwd())
336 337 except OSError:
337 338 print sys.exc_info()[1]
338 339 else:
339 340 cwd = os.getcwdu()
340 341 dhist = self.shell.user_ns['_dh']
341 342 if oldcwd != cwd:
342 343 dhist.append(cwd)
343 344 self.shell.db['dhist'] = compress_dhist(dhist)[-100:]
344 345
345 346 else:
346 347 os.chdir(self.shell.home_dir)
347 348 if hasattr(self.shell, 'term_title') and self.shell.term_title:
348 349 set_term_title('IPython: ' + '~')
349 350 cwd = os.getcwdu()
350 351 dhist = self.shell.user_ns['_dh']
351 352
352 353 if oldcwd != cwd:
353 354 dhist.append(cwd)
354 355 self.shell.db['dhist'] = compress_dhist(dhist)[-100:]
355 356 if not 'q' in opts and self.shell.user_ns['_dh']:
356 357 print self.shell.user_ns['_dh'][-1]
357 358
358 359
359 360 @line_magic
360 361 def env(self, parameter_s=''):
361 362 """List environment variables."""
362 363
363 364 return dict(os.environ)
364 365
365 366 @line_magic
366 367 def pushd(self, parameter_s=''):
367 368 """Place the current dir on stack and change directory.
368 369
369 370 Usage:\\
370 371 %pushd ['dirname']
371 372 """
372 373
373 374 dir_s = self.shell.dir_stack
374 375 tgt = os.path.expanduser(unquote_filename(parameter_s))
375 376 cwd = os.getcwdu().replace(self.shell.home_dir,'~')
376 377 if tgt:
377 378 self.cd(parameter_s)
378 379 dir_s.insert(0,cwd)
379 380 return self.shell.magic('dirs')
380 381
381 382 @line_magic
382 383 def popd(self, parameter_s=''):
383 384 """Change to directory popped off the top of the stack.
384 385 """
385 386 if not self.shell.dir_stack:
386 387 raise UsageError("%popd on empty stack")
387 388 top = self.shell.dir_stack.pop(0)
388 389 self.cd(top)
389 390 print "popd ->",top
390 391
391 392 @line_magic
392 393 def dirs(self, parameter_s=''):
393 394 """Return the current directory stack."""
394 395
395 396 return self.shell.dir_stack
396 397
397 398 @line_magic
398 399 def dhist(self, parameter_s=''):
399 400 """Print your history of visited directories.
400 401
401 402 %dhist -> print full history\\
402 403 %dhist n -> print last n entries only\\
403 404 %dhist n1 n2 -> print entries between n1 and n2 (n1 not included)\\
404 405
405 406 This history is automatically maintained by the %cd command, and
406 407 always available as the global list variable _dh. You can use %cd -<n>
407 408 to go to directory number <n>.
408 409
409 410 Note that most of time, you should view directory history by entering
410 411 cd -<TAB>.
411 412
412 413 """
413 414
414 415 dh = self.shell.user_ns['_dh']
415 416 if parameter_s:
416 417 try:
417 418 args = map(int,parameter_s.split())
418 419 except:
419 420 self.arg_err(self.dhist)
420 421 return
421 422 if len(args) == 1:
422 423 ini,fin = max(len(dh)-(args[0]),0),len(dh)
423 424 elif len(args) == 2:
424 425 ini,fin = args
425 426 else:
426 427 self.arg_err(self.dhist)
427 428 return
428 429 else:
429 430 ini,fin = 0,len(dh)
430 431 nlprint(dh,
431 432 header = 'Directory history (kept in _dh)',
432 433 start=ini,stop=fin)
433 434
434 435 @skip_doctest
435 436 @line_magic
436 437 def sc(self, parameter_s=''):
437 438 """Shell capture - execute a shell command and capture its output.
438 439
439 440 DEPRECATED. Suboptimal, retained for backwards compatibility.
440 441
441 442 You should use the form 'var = !command' instead. Example:
442 443
443 444 "%sc -l myfiles = ls ~" should now be written as
444 445
445 446 "myfiles = !ls ~"
446 447
447 448 myfiles.s, myfiles.l and myfiles.n still apply as documented
448 449 below.
449 450
450 451 --
451 452 %sc [options] varname=command
452 453
453 454 IPython will run the given command using commands.getoutput(), and
454 455 will then update the user's interactive namespace with a variable
455 456 called varname, containing the value of the call. Your command can
456 457 contain shell wildcards, pipes, etc.
457 458
458 459 The '=' sign in the syntax is mandatory, and the variable name you
459 460 supply must follow Python's standard conventions for valid names.
460 461
461 462 (A special format without variable name exists for internal use)
462 463
463 464 Options:
464 465
465 466 -l: list output. Split the output on newlines into a list before
466 467 assigning it to the given variable. By default the output is stored
467 468 as a single string.
468 469
469 470 -v: verbose. Print the contents of the variable.
470 471
471 472 In most cases you should not need to split as a list, because the
472 473 returned value is a special type of string which can automatically
473 474 provide its contents either as a list (split on newlines) or as a
474 475 space-separated string. These are convenient, respectively, either
475 476 for sequential processing or to be passed to a shell command.
476 477
477 478 For example::
478 479
479 480 # Capture into variable a
480 481 In [1]: sc a=ls *py
481 482
482 483 # a is a string with embedded newlines
483 484 In [2]: a
484 485 Out[2]: 'setup.py\\nwin32_manual_post_install.py'
485 486
486 487 # which can be seen as a list:
487 488 In [3]: a.l
488 489 Out[3]: ['setup.py', 'win32_manual_post_install.py']
489 490
490 491 # or as a whitespace-separated string:
491 492 In [4]: a.s
492 493 Out[4]: 'setup.py win32_manual_post_install.py'
493 494
494 495 # a.s is useful to pass as a single command line:
495 496 In [5]: !wc -l $a.s
496 497 146 setup.py
497 498 130 win32_manual_post_install.py
498 499 276 total
499 500
500 501 # while the list form is useful to loop over:
501 502 In [6]: for f in a.l:
502 503 ...: !wc -l $f
503 504 ...:
504 505 146 setup.py
505 506 130 win32_manual_post_install.py
506 507
507 508 Similarly, the lists returned by the -l option are also special, in
508 509 the sense that you can equally invoke the .s attribute on them to
509 510 automatically get a whitespace-separated string from their contents::
510 511
511 512 In [7]: sc -l b=ls *py
512 513
513 514 In [8]: b
514 515 Out[8]: ['setup.py', 'win32_manual_post_install.py']
515 516
516 517 In [9]: b.s
517 518 Out[9]: 'setup.py win32_manual_post_install.py'
518 519
519 520 In summary, both the lists and strings used for output capture have
520 521 the following special attributes::
521 522
522 523 .l (or .list) : value as list.
523 524 .n (or .nlstr): value as newline-separated string.
524 525 .s (or .spstr): value as space-separated string.
525 526 """
526 527
527 528 opts,args = self.parse_options(parameter_s, 'lv')
528 529 # Try to get a variable name and command to run
529 530 try:
530 531 # the variable name must be obtained from the parse_options
531 532 # output, which uses shlex.split to strip options out.
532 533 var,_ = args.split('=', 1)
533 534 var = var.strip()
534 535 # But the command has to be extracted from the original input
535 536 # parameter_s, not on what parse_options returns, to avoid the
536 537 # quote stripping which shlex.split performs on it.
537 538 _,cmd = parameter_s.split('=', 1)
538 539 except ValueError:
539 540 var,cmd = '',''
540 541 # If all looks ok, proceed
541 542 split = 'l' in opts
542 543 out = self.shell.getoutput(cmd, split=split)
543 544 if 'v' in opts:
544 545 print '%s ==\n%s' % (var, pformat(out))
545 546 if var:
546 547 self.shell.user_ns.update({var:out})
547 548 else:
548 549 return out
549 550
550 551 @line_magic
551 552 def sx(self, parameter_s=''):
552 553 """Shell execute - run a shell command and capture its output.
553 554
554 555 %sx command
555 556
556 557 IPython will run the given command using commands.getoutput(), and
557 558 return the result formatted as a list (split on '\\n'). Since the
558 559 output is _returned_, it will be stored in ipython's regular output
559 560 cache Out[N] and in the '_N' automatic variables.
560 561
561 562 Notes:
562 563
563 564 1) If an input line begins with '!!', then %sx is automatically
564 565 invoked. That is, while::
565 566
566 567 !ls
567 568
568 569 causes ipython to simply issue system('ls'), typing::
569 570
570 571 !!ls
571 572
572 573 is a shorthand equivalent to::
573 574
574 575 %sx ls
575 576
576 577 2) %sx differs from %sc in that %sx automatically splits into a list,
577 578 like '%sc -l'. The reason for this is to make it as easy as possible
578 579 to process line-oriented shell output via further python commands.
579 580 %sc is meant to provide much finer control, but requires more
580 581 typing.
581 582
582 583 3) Just like %sc -l, this is a list with special attributes:
583 584 ::
584 585
585 586 .l (or .list) : value as list.
586 587 .n (or .nlstr): value as newline-separated string.
587 588 .s (or .spstr): value as whitespace-separated string.
588 589
589 590 This is very useful when trying to use such lists as arguments to
590 591 system commands."""
591 592
592 593 if parameter_s:
593 594 return self.shell.getoutput(parameter_s)
594 595
595 596
596 597 @line_magic
597 598 def bookmark(self, parameter_s=''):
598 599 """Manage IPython's bookmark system.
599 600
600 601 %bookmark <name> - set bookmark to current dir
601 602 %bookmark <name> <dir> - set bookmark to <dir>
602 603 %bookmark -l - list all bookmarks
603 604 %bookmark -d <name> - remove bookmark
604 605 %bookmark -r - remove all bookmarks
605 606
606 607 You can later on access a bookmarked folder with::
607 608
608 609 %cd -b <name>
609 610
610 611 or simply '%cd <name>' if there is no directory called <name> AND
611 612 there is such a bookmark defined.
612 613
613 614 Your bookmarks persist through IPython sessions, but they are
614 615 associated with each profile."""
615 616
616 617 opts,args = self.parse_options(parameter_s,'drl',mode='list')
617 618 if len(args) > 2:
618 619 raise UsageError("%bookmark: too many arguments")
619 620
620 621 bkms = self.shell.db.get('bookmarks',{})
621 622
622 623 if 'd' in opts:
623 624 try:
624 625 todel = args[0]
625 626 except IndexError:
626 627 raise UsageError(
627 628 "%bookmark -d: must provide a bookmark to delete")
628 629 else:
629 630 try:
630 631 del bkms[todel]
631 632 except KeyError:
632 633 raise UsageError(
633 634 "%%bookmark -d: Can't delete bookmark '%s'" % todel)
634 635
635 636 elif 'r' in opts:
636 637 bkms = {}
637 638 elif 'l' in opts:
638 639 bks = bkms.keys()
639 640 bks.sort()
640 641 if bks:
641 642 size = max(map(len, bks))
642 643 else:
643 644 size = 0
644 645 fmt = '%-'+str(size)+'s -> %s'
645 646 print 'Current bookmarks:'
646 647 for bk in bks:
647 648 print fmt % (bk, bkms[bk])
648 649 else:
649 650 if not args:
650 651 raise UsageError("%bookmark: You must specify the bookmark name")
651 652 elif len(args)==1:
652 653 bkms[args[0]] = os.getcwdu()
653 654 elif len(args)==2:
654 655 bkms[args[0]] = args[1]
655 656 self.shell.db['bookmarks'] = bkms
656 657
657 658 @line_magic
658 659 def pycat(self, parameter_s=''):
659 660 """Show a syntax-highlighted file through a pager.
660 661
661 662 This magic is similar to the cat utility, but it will assume the file
662 663 to be Python source and will show it with syntax highlighting.
663 664
664 665 This magic command can either take a local filename, an url,
665 666 an history range (see %history) or a macro as argument ::
666 667
667 668 %pycat myscript.py
668 669 %pycat 7-27
669 670 %pycat myMacro
670 671 %pycat http://www.example.com/myscript.py
671 672 """
672 673
673 674 try :
674 675 cont = self.shell.find_user_code(parameter_s)
675 676 except ValueError, IOError:
676 677 print "Error: no such file, variable, URL, history range or macro"
677 678 return
678 679
679 680 page.page(self.shell.pycolorize(cont))
680 681
681 682 @magic_arguments.magic_arguments()
682 683 @magic_arguments.argument(
683 684 '-f', '--force', action='store_true', default=False,
684 685 help='Whether to overwrite a file if it already exists'
685 686 )
686 687 @magic_arguments.argument(
687 688 'filename', type=unicode,
688 689 help='file to write'
689 690 )
690 691 @cell_magic
691 692 def file(self, line, cell):
692 693 """Write a cell to a file
693 694
694 695 %%file [-f] filename
695 696
696 697 Writes the contents of the cell to a file.
697 698
698 699 Will not overwrite existing files unless `-f` is specified.
699 700 """
700 701 args = magic_arguments.parse_argstring(self.file, line)
701 702 args.filename = unquote_filename(args.filename)
703 force = args.force
702 704
703 705 if os.path.exists(args.filename):
704 if args.force:
705 print("Overwriting %s" % args.filename)
706 else:
707 error("%s already exists! Force overwrite with %%%%file -f\n" % args.filename)
706 if not force:
707 try:
708 force = self.shell.ask_yes_no(
709 "%s exists, overwrite (y/[n])?",
710 default='n'
711 )
712 except StdinNotImplementedError:
713 force = True
714
715 if not force:
716 # prompted, but still no
717 print "Force overwrite with %%file -f " + args.filename
708 718 return
719
720 print("Overwriting %s" % args.filename)
709 721 else:
710 722 print("Writing %s" % args.filename)
711 723
712 724 with io.open(args.filename, 'w', encoding='utf-8') as f:
713 725 f.write(cell)
General Comments 0
You need to be logged in to leave comments. Login now