Show More
@@ -992,25 +992,31 b' python-profiler package from non-free.""")' | |||
|
992 | 992 | print macro, |
|
993 | 993 | |
|
994 | 994 | @magic_arguments.magic_arguments() |
|
995 |
@magic_arguments.argument(' |
|
|
996 |
help="""The name of the variable in which to store |
|
|
995 | @magic_arguments.argument('output', type=str, default='', nargs='?', | |
|
996 | help="""The name of the variable in which to store output. | |
|
997 | This is a utils.io.CapturedIO object with stdout/err attributes | |
|
998 | for the text of the captured output. | |
|
997 | 999 | |
|
998 | If unspecified: stdout is discarded | |
|
999 | """ | |
|
1000 | ) | |
|
1001 | @magic_arguments.argument('-e', '--err', type=str, | |
|
1002 | help="""The name of the variable in which to store stderr | |
|
1000 | CapturedOutput also has a show() method for displaying the output, | |
|
1001 | and __call__ as well, so you can use that to quickly display the | |
|
1002 | output. | |
|
1003 | 1003 | |
|
1004 |
If unspecified |
|
|
1004 | If unspecified, captured output is discarded. | |
|
1005 | 1005 | """ |
|
1006 | 1006 | ) |
|
1007 | @magic_arguments.argument('--no-stderr', action="store_true", | |
|
1008 | help="""Don't capture stderr.""" | |
|
1009 | ) | |
|
1010 | @magic_arguments.argument('--no-stdout', action="store_true", | |
|
1011 | help="""Don't capture stdout.""" | |
|
1012 | ) | |
|
1007 | 1013 | @cell_magic |
|
1008 | 1014 | def capture(self, line, cell): |
|
1009 | 1015 | """run the cell, capturing stdout/err""" |
|
1010 | 1016 | args = magic_arguments.parse_argstring(self.capture, line) |
|
1011 | with capture_output() as io: | |
|
1017 | out = not args.no_stdout | |
|
1018 | err = not args.no_stderr | |
|
1019 | with capture_output(out, err) as io: | |
|
1012 | 1020 | self.shell.run_cell(cell) |
|
1013 | if args.out: | |
|
1014 |
self.shell.user_ns[args.out] = io |
|
|
1015 | if args.err: | |
|
1016 | self.shell.user_ns[args.err] = io.stderr | |
|
1021 | if args.output: | |
|
1022 | self.shell.user_ns[args.output] = io |
@@ -328,26 +328,50 b' class CapturedIO(object):' | |||
|
328 | 328 | """Simple object for containing captured stdout/err StringIO objects""" |
|
329 | 329 | |
|
330 | 330 | def __init__(self, stdout, stderr): |
|
331 |
self.stdout |
|
|
332 |
self.stderr |
|
|
331 | self._stdout = stdout | |
|
332 | self._stderr = stderr | |
|
333 | 333 | |
|
334 | 334 | @property |
|
335 | 335 | def stdout(self): |
|
336 |
|
|
|
336 | if not self._stdout: | |
|
337 | return '' | |
|
338 | return self._stdout.getvalue() | |
|
337 | 339 | |
|
338 | 340 | @property |
|
339 | 341 | def stderr(self): |
|
340 |
|
|
|
342 | if not self._stderr: | |
|
343 | return '' | |
|
344 | return self._stderr.getvalue() | |
|
345 | ||
|
346 | def show(self): | |
|
347 | """write my output to sys.stdout/err as appropriate""" | |
|
348 | sys.stdout.write(self.stdout) | |
|
349 | sys.stderr.write(self.stderr) | |
|
350 | sys.stdout.flush() | |
|
351 | sys.stderr.flush() | |
|
352 | ||
|
353 | __call__ = show | |
|
341 | 354 | |
|
342 | 355 | |
|
343 | 356 | class capture_output(object): |
|
344 | 357 | """context manager for capturing stdout/err""" |
|
358 | stdout = True | |
|
359 | stderr = True | |
|
360 | ||
|
361 | def __init__(self, stdout=True, stderr=True): | |
|
362 | self.stdout = stdout | |
|
363 | self.stderr = stderr | |
|
345 | 364 | |
|
346 | 365 | def __enter__(self): |
|
347 | 366 | self.sys_stdout = sys.stdout |
|
348 | 367 | self.sys_stderr = sys.stderr |
|
349 | stdout = sys.stdout = StringIO() | |
|
350 |
stderr = |
|
|
368 | ||
|
369 | stdout = stderr = False | |
|
370 | if self.stdout: | |
|
371 | stdout = sys.stdout = StringIO() | |
|
372 | if self.stderr: | |
|
373 | stderr = sys.stderr = StringIO() | |
|
374 | ||
|
351 | 375 | return CapturedIO(stdout, stderr) |
|
352 | 376 | |
|
353 | 377 | def __exit__(self, exc_type, exc_value, traceback): |
@@ -47,13 +47,13 b'' | |||
|
47 | 47 | { |
|
48 | 48 | "cell_type": "markdown", |
|
49 | 49 | "source": [ |
|
50 |
"If you specify |
|
|
50 | "If you specify a name, then stdout and stderr will be stored in an object in your namespace." | |
|
51 | 51 | ] |
|
52 | 52 | }, |
|
53 | 53 | { |
|
54 | 54 | "cell_type": "code", |
|
55 | 55 | "input": [ |
|
56 |
"%%capture |
|
|
56 | "%%capture captured", | |
|
57 | 57 | "print 'hi, stdout'", |
|
58 | 58 | "print >> sys.stderr, 'hi, stderr'" |
|
59 | 59 | ], |
@@ -63,7 +63,21 b'' | |||
|
63 | 63 | { |
|
64 | 64 | "cell_type": "code", |
|
65 | 65 | "input": [ |
|
66 |
" |
|
|
66 | "captured" | |
|
67 | ], | |
|
68 | "language": "python", | |
|
69 | "outputs": [] | |
|
70 | }, | |
|
71 | { | |
|
72 | "cell_type": "markdown", | |
|
73 | "source": [ | |
|
74 | "Calling the object writes the output to stdout/err as appropriate." | |
|
75 | ] | |
|
76 | }, | |
|
77 | { | |
|
78 | "cell_type": "code", | |
|
79 | "input": [ | |
|
80 | "captured()" | |
|
67 | 81 | ], |
|
68 | 82 | "language": "python", |
|
69 | 83 | "outputs": [] |
@@ -71,9 +85,7 b'' | |||
|
71 | 85 | { |
|
72 | 86 | "cell_type": "code", |
|
73 | 87 | "input": [ |
|
74 |
" |
|
|
75 | "print 'hi again, stdout'", | |
|
76 | "print >> sys.stderr, 'hi there, stderr'" | |
|
88 | "captured.stdout" | |
|
77 | 89 | ], |
|
78 | 90 | "language": "python", |
|
79 | 91 | "outputs": [] |
@@ -81,8 +93,7 b'' | |||
|
81 | 93 | { |
|
82 | 94 | "cell_type": "code", |
|
83 | 95 | "input": [ |
|
84 | "sys.stdout.write(my_stdout2)", | |
|
85 | "sys.stderr.write(my_stderr)" | |
|
96 | "captured.stderr" | |
|
86 | 97 | ], |
|
87 | 98 | "language": "python", |
|
88 | 99 | "outputs": [] |
@@ -104,7 +115,7 b'' | |||
|
104 | 115 | { |
|
105 | 116 | "cell_type": "code", |
|
106 | 117 | "input": [ |
|
107 |
"%%capture |
|
|
118 | "%%capture wontshutup", | |
|
108 | 119 | "", |
|
109 | 120 | "print \"setting up X\"", |
|
110 | 121 | "x = np.linspace(0,5,1000)", |
@@ -120,7 +131,47 b'' | |||
|
120 | 131 | { |
|
121 | 132 | "cell_type": "code", |
|
122 | 133 | "input": [ |
|
123 |
" |
|
|
134 | "wontshutup()" | |
|
135 | ], | |
|
136 | "language": "python", | |
|
137 | "outputs": [] | |
|
138 | }, | |
|
139 | { | |
|
140 | "cell_type": "markdown", | |
|
141 | "source": [ | |
|
142 | "And you can selectively disable capturing stdout or stderr by passing `--no-stdout/err`." | |
|
143 | ] | |
|
144 | }, | |
|
145 | { | |
|
146 | "cell_type": "code", | |
|
147 | "input": [ | |
|
148 | "%%capture cap --no-stderr", | |
|
149 | "print 'hi, stdout'", | |
|
150 | "print >> sys.stderr, \"hello, stderr\"" | |
|
151 | ], | |
|
152 | "language": "python", | |
|
153 | "outputs": [] | |
|
154 | }, | |
|
155 | { | |
|
156 | "cell_type": "code", | |
|
157 | "input": [ | |
|
158 | "cap.stdout" | |
|
159 | ], | |
|
160 | "language": "python", | |
|
161 | "outputs": [] | |
|
162 | }, | |
|
163 | { | |
|
164 | "cell_type": "code", | |
|
165 | "input": [ | |
|
166 | "cap.stderr" | |
|
167 | ], | |
|
168 | "language": "python", | |
|
169 | "outputs": [] | |
|
170 | }, | |
|
171 | { | |
|
172 | "cell_type": "code", | |
|
173 | "input": [ | |
|
174 | "" | |
|
124 | 175 | ], |
|
125 | 176 | "language": "python", |
|
126 | 177 | "outputs": [] |
General Comments 0
You need to be logged in to leave comments.
Login now