В следующем примере показано, как использовать функции чтения и записи истории модуля readline
для автоматической загрузки и сохранения файла истории с именем .python_history
из домашнего каталога пользователя.
Приведенный ниже код обычно выполняется автоматически во время интерактивных сеансов из файла пользователя PYTHONSTARTUP
. Этот код фактически автоматически запускается, когда Python запускается в интерактивном режиме.
import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history") try: readline.read_history_file(histfile) # default history len is -1 (infinite), which may grow unruly readline.set_history_length(1000) except FileNotFoundError: pass atexit.register(readline.write_history_file, histfile)
Следующий пример достигает той же цели, но поддерживает параллельные интерактивные сеансы, только добавляя новую историю.
import atexit import os import readline histfile = os.path.join(os.path.expanduser("~"), ".python_history") try: readline.read_history_file(histfile) h_len = readline.get_current_history_length() except FileNotFoundError: open(histfile, 'wb').close() h_len = 0 def save(prev_h_len, histfile): new_h_len = readline.get_current_history_length() readline.set_history_length(1000) readline.append_history_file(new_h_len - prev_h_len, histfile) atexit.register(save, h_len, histfile)
Следующий пример расширяет класс code.InteractiveConsole
модуля code
для поддержки сохранения/восстановления истории.
import atexit import code import os import readline class HistoryConsole(code.InteractiveConsole): def __init__(self, locals=None, filename="<console>", histfile=os.path.expanduser("~/.console-history")): code.InteractiveConsole.__init__(self, locals, filename) self.init_history(histfile) def init_history(self, histfile): readline.parse_and_bind("tab: complete") if hasattr(readline, "read_history_file"): try: readline.read_history_file(histfile) except FileNotFoundError: pass atexit.register(self.save_history, histfile) def save_history(self, histfile): readline.set_history_length(1000) readline.write_history_file(histfile)