Show More
@@ -2429,7 +2429,7 b' class InteractiveShell(SingletonConfigurable, Magic):' | |||||
2429 | self.showtraceback() |
|
2429 | self.showtraceback() | |
2430 | warn('Unknown failure executing module: <%s>' % mod_name) |
|
2430 | warn('Unknown failure executing module: <%s>' % mod_name) | |
2431 |
|
2431 | |||
2432 | def run_cell(self, raw_cell, store_history=False): |
|
2432 | def run_cell(self, raw_cell, store_history=False, silent=False): | |
2433 | """Run a complete IPython cell. |
|
2433 | """Run a complete IPython cell. | |
2434 |
|
2434 | |||
2435 | Parameters |
|
2435 | Parameters | |
@@ -2440,10 +2440,16 b' class InteractiveShell(SingletonConfigurable, Magic):' | |||||
2440 | If True, the raw and translated cell will be stored in IPython's |
|
2440 | If True, the raw and translated cell will be stored in IPython's | |
2441 | history. For user code calling back into IPython's machinery, this |
|
2441 | history. For user code calling back into IPython's machinery, this | |
2442 | should be set to False. |
|
2442 | should be set to False. | |
|
2443 | silent : bool | |||
|
2444 | If True, avoid side-effets, such as implicit displayhooks, history, | |||
|
2445 | and logging. silent=True forces store_history=False. | |||
2443 | """ |
|
2446 | """ | |
2444 | if (not raw_cell) or raw_cell.isspace(): |
|
2447 | if (not raw_cell) or raw_cell.isspace(): | |
2445 | return |
|
2448 | return | |
2446 |
|
2449 | |||
|
2450 | if silent: | |||
|
2451 | store_history = False | |||
|
2452 | ||||
2447 | for line in raw_cell.splitlines(): |
|
2453 | for line in raw_cell.splitlines(): | |
2448 | self.input_splitter.push(line) |
|
2454 | self.input_splitter.push(line) | |
2449 | cell = self.input_splitter.source_reset() |
|
2455 | cell = self.input_splitter.source_reset() | |
@@ -2467,7 +2473,7 b' class InteractiveShell(SingletonConfigurable, Magic):' | |||||
2467 | if store_history: |
|
2473 | if store_history: | |
2468 | self.history_manager.store_inputs(self.execution_count, |
|
2474 | self.history_manager.store_inputs(self.execution_count, | |
2469 | cell, raw_cell) |
|
2475 | cell, raw_cell) | |
2470 |
|
2476 | if not silent: | ||
2471 | self.logger.log(cell, raw_cell) |
|
2477 | self.logger.log(cell, raw_cell) | |
2472 |
|
2478 | |||
2473 | if not prefilter_failed: |
|
2479 | if not prefilter_failed: | |
@@ -2489,11 +2495,15 b' class InteractiveShell(SingletonConfigurable, Magic):' | |||||
2489 | self.execution_count += 1 |
|
2495 | self.execution_count += 1 | |
2490 | return None |
|
2496 | return None | |
2491 |
|
2497 | |||
|
2498 | interactivity = "none" if silent else "last_expr" | |||
2492 | self.run_ast_nodes(code_ast.body, cell_name, |
|
2499 | self.run_ast_nodes(code_ast.body, cell_name, | |
2493 |
interactivity= |
|
2500 | interactivity=interactivity) | |
2494 |
|
2501 | |||
2495 | # Execute any registered post-execution functions. |
|
2502 | # Execute any registered post-execution functions. | |
2496 | for func, status in self._post_execute.iteritems(): |
|
2503 | # unless we are silent | |
|
2504 | post_exec = [] if silent else self._post_execute.iteritems() | |||
|
2505 | ||||
|
2506 | for func, status in post_exec: | |||
2497 | if self.disable_failing_post_execute and not status: |
|
2507 | if self.disable_failing_post_execute and not status: | |
2498 | continue |
|
2508 | continue | |
2499 | try: |
|
2509 | try: |
@@ -255,6 +255,61 b' class InteractiveShellTestCase(unittest.TestCase):' | |||||
255 | # ZeroDivisionError |
|
255 | # ZeroDivisionError | |
256 | self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}") |
|
256 | self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}") | |
257 |
|
257 | |||
|
258 | def test_silent_nopostexec(self): | |||
|
259 | """run_cell(silent=True) doesn't invoke post-exec funcs""" | |||
|
260 | ip = get_ipython() | |||
|
261 | ||||
|
262 | d = dict(called=False) | |||
|
263 | def set_called(): | |||
|
264 | d['called'] = True | |||
|
265 | ||||
|
266 | ip.register_post_execute(set_called) | |||
|
267 | ip.run_cell("1", silent=True) | |||
|
268 | self.assertFalse(d['called']) | |||
|
269 | # double-check that non-silent exec did what we expected | |||
|
270 | # silent to avoid | |||
|
271 | ip.run_cell("1") | |||
|
272 | self.assertTrue(d['called']) | |||
|
273 | # remove post-exec | |||
|
274 | ip._post_execute.pop(set_called) | |||
|
275 | ||||
|
276 | def test_silent_noadvance(self): | |||
|
277 | """run_cell(silent=True) doesn't advance execution_count""" | |||
|
278 | ip = get_ipython() | |||
|
279 | ||||
|
280 | ec = ip.execution_count | |||
|
281 | # silent should force store_history=False | |||
|
282 | ip.run_cell("1", store_history=True, silent=True) | |||
|
283 | ||||
|
284 | self.assertEquals(ec, ip.execution_count) | |||
|
285 | # double-check that non-silent exec did what we expected | |||
|
286 | # silent to avoid | |||
|
287 | ip.run_cell("1", store_history=True) | |||
|
288 | self.assertEquals(ec+1, ip.execution_count) | |||
|
289 | ||||
|
290 | def test_silent_nodisplayhook(self): | |||
|
291 | """run_cell(silent=True) doesn't trigger displayhook""" | |||
|
292 | ip = get_ipython() | |||
|
293 | ||||
|
294 | d = dict(called=False) | |||
|
295 | ||||
|
296 | trap = ip.display_trap | |||
|
297 | save_hook = trap.hook | |||
|
298 | ||||
|
299 | def failing_hook(*args, **kwargs): | |||
|
300 | d['called'] = True | |||
|
301 | ||||
|
302 | try: | |||
|
303 | trap.hook = failing_hook | |||
|
304 | ip.run_cell("1", silent=True) | |||
|
305 | self.assertFalse(d['called']) | |||
|
306 | # double-check that non-silent exec did what we expected | |||
|
307 | # silent to avoid | |||
|
308 | ip.run_cell("1") | |||
|
309 | self.assertTrue(d['called']) | |||
|
310 | finally: | |||
|
311 | trap.hook = save_hook | |||
|
312 | ||||
258 | @skipif(sys.version_info[0] >= 3, "softspace removed in py3") |
|
313 | @skipif(sys.version_info[0] >= 3, "softspace removed in py3") | |
259 | def test_print_softspace(self): |
|
314 | def test_print_softspace(self): | |
260 | """Verify that softspace is handled correctly when executing multiple |
|
315 | """Verify that softspace is handled correctly when executing multiple |
General Comments 0
You need to be logged in to leave comments.
Login now