38

Is there a way to tell the interactive Python shell to preserve its history of executed commands between sessions?

While a session is running, after commands have been executed, I can arrow up and access said commands, I'm just wondering if there is some way for a certain number of these commands to be saved until the next time I use the Python shell.

This would be very useful since I find myself reusing commands in a session, that I used at the end of the last session.

1

3 Answers 3

44

Sure you can, with a small startup script. From Interactive Input Editing and History Substitution in the python tutorial:

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=~/.pystartup" in bash.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

From Python 3.4 onwards, the interactive interpreter supports autocompletion and history out of the box:

Tab-completion is now enabled by default in the interactive interpreter on systems that support readline. History is also enabled by default, and is written to (and read from) the file ~/.python-history.

Sign up to request clarification or add additional context in comments.

1 Comment

I have several python virtual environments and wanted to be able to enable persistent history. So used this approach, but changed the location of the .pyhistory file to the virtual environment folder instead of user home folder.
17

Use IPython.

You should, anyway, because it's awesome: persistent command history is just one of the many many ways it's better than the stock Python shell.

2 Comments

Extra awesome: I just noticed it has Python 3 support now!
Maybe different than in 2012: The installation for IPython links directly to Jupyter installation page docs.jupyter.org/en/latest/install.html. What do I need to do here?
1

This is also required for Python 3 when using a virtual environment.

I use a slightly different version which keeps a history file per virtual environment:

import sys

if sys.version_info >= (3, 0) and hasattr(sys, 'real_prefix'):  # in a VirtualEnv
    import atexit, os, readline, sys

    PYTHON_HISTORY_FILE = os.path.join(os.environ['VIRTUAL_ENV'], '.python_history')
    if os.path.exists(PYTHON_HISTORY_FILE):
        readline.read_history_file(PYTHON_HISTORY_FILE)
    atexit.register(readline.write_history_file, PYTHON_HISTORY_FILE)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.