Show More
@@ -27,6 +27,8 import re | |||||
27 | import sys |
|
27 | import sys | |
28 | import tempfile |
|
28 | import tempfile | |
29 | import types |
|
29 | import types | |
|
30 | import threading | |||
|
31 | import time | |||
30 | from contextlib import nested |
|
32 | from contextlib import nested | |
31 |
|
33 | |||
32 | from IPython.config.configurable import Configurable |
|
34 | from IPython.config.configurable import Configurable | |
@@ -129,6 +131,23 class SeparateStr(Str): | |||||
129 | class MultipleInstanceError(Exception): |
|
131 | class MultipleInstanceError(Exception): | |
130 | pass |
|
132 | pass | |
131 |
|
133 | |||
|
134 | class HistorySaveThread(threading.Thread): | |||
|
135 | """Thread to save history periodically""" | |||
|
136 | ||||
|
137 | def __init__(self, IPython_object, time_interval, exit_now): | |||
|
138 | threading.Thread.__init__(self) | |||
|
139 | self.IPython_object = IPython_object | |||
|
140 | self.time_interval = time_interval | |||
|
141 | self.exit_now = exit_now | |||
|
142 | ||||
|
143 | def run(self): | |||
|
144 | while 1: | |||
|
145 | if self.exit_now==True: | |||
|
146 | break | |||
|
147 | time.sleep(self.time_interval) | |||
|
148 | #printing for debug | |||
|
149 | #print "Saving..." | |||
|
150 | self.IPython_object.save_history() | |||
132 |
|
151 | |||
133 | #----------------------------------------------------------------------------- |
|
152 | #----------------------------------------------------------------------------- | |
134 | # Main IPython class |
|
153 | # Main IPython class | |
@@ -293,6 +312,8 class InteractiveShell(Configurable, Magic): | |||||
293 | self.init_payload() |
|
312 | self.init_payload() | |
294 | self.hooks.late_startup_hook() |
|
313 | self.hooks.late_startup_hook() | |
295 | atexit.register(self.atexit_operations) |
|
314 | atexit.register(self.atexit_operations) | |
|
315 | self.history_thread = HistorySaveThread(self, 1, False) | |||
|
316 | self.history_thread.start() | |||
296 |
|
317 | |||
297 | # While we're trying to have each part of the code directly access what it |
|
318 | # While we're trying to have each part of the code directly access what it | |
298 | # needs without keeping redundant references to objects, we have too much |
|
319 | # needs without keeping redundant references to objects, we have too much | |
@@ -2523,7 +2544,6 class InteractiveShell(Configurable, Magic): | |||||
2523 | except OSError: |
|
2544 | except OSError: | |
2524 | pass |
|
2545 | pass | |
2525 |
|
2546 | |||
2526 |
|
||||
2527 | self.save_history() |
|
2547 | self.save_history() | |
2528 |
|
2548 | |||
2529 | # Clear all user namespaces to release all references cleanly. |
|
2549 | # Clear all user namespaces to release all references cleanly. |
@@ -24,6 +24,7 import sys | |||||
24 | from IPython.core.error import TryNext |
|
24 | from IPython.core.error import TryNext | |
25 | from IPython.core.usage import interactive_usage, default_banner |
|
25 | from IPython.core.usage import interactive_usage, default_banner | |
26 | from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC |
|
26 | from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC | |
|
27 | from IPython.core.interactiveshell import HistorySaveThread | |||
27 | from IPython.lib.inputhook import enable_gui |
|
28 | from IPython.lib.inputhook import enable_gui | |
28 | from IPython.lib.pylabtools import pylab_activate |
|
29 | from IPython.lib.pylabtools import pylab_activate | |
29 | from IPython.utils.terminal import toggle_set_term_title, set_term_title |
|
30 | from IPython.utils.terminal import toggle_set_term_title, set_term_title | |
@@ -496,10 +497,16 class TerminalInteractiveShell(InteractiveShell): | |||||
496 | """Handle interactive exit. |
|
497 | """Handle interactive exit. | |
497 |
|
498 | |||
498 | This method calls the ask_exit callback.""" |
|
499 | This method calls the ask_exit callback.""" | |
|
500 | self.shell.history_thread.exit_now=True | |||
|
501 | self.shell.history_thread.join() | |||
499 | if self.confirm_exit: |
|
502 | if self.confirm_exit: | |
500 | if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'): |
|
503 | if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'): | |
501 | self.ask_exit() |
|
504 | self.ask_exit() | |
502 | else: |
|
505 | else: | |
|
506 | self.shell.history_thread = HistorySaveThread(self.shell, 1, | |||
|
507 | False) | |||
|
508 | self.shell.history_thread.start() | |||
|
509 | else: | |||
503 | self.ask_exit() |
|
510 | self.ask_exit() | |
504 |
|
511 | |||
505 | #------------------------------------------------------------------------ |
|
512 | #------------------------------------------------------------------------ |
General Comments 0
You need to be logged in to leave comments.
Login now