How do you see the entire command history in interactive Python?

PythonMacos

Python Problem Overview


I'm working on the default python interpreter on Mac OS X, and I Cmd+K (cleared) my earlier commands. I can go through them one by one using the arrow keys. But is there an option like the --history option in bash shell, which shows you all the commands you've entered so far?

Python Solutions


Solution 1 - Python

Code for printing the entire history:

Python 3

One-liner (quick copy and paste):

import readline; print('\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())]))

(Or longer version...)

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))
Python 2

One-liner (quick copy and paste):

import readline; print '\n'.join([str(readline.get_history_item(i + 1)) for i in range(readline.get_current_history_length())])

(Or longer version...)

import readline
for i in range(readline.get_current_history_length()):
    print readline.get_history_item(i + 1)

Note: get_history_item() is indexed from 1 to n.

Solution 2 - Python

Solution 3 - Python

With python 3 interpreter the history is written to
~/.python_history

Solution 4 - Python

If you want to write the history to a file:

import readline
readline.write_history_file('python_history.txt')

The help function gives:

Help on built-in function write_history_file in module readline:

write_history_file(...)
    write_history_file([filename]) -> None
    Save a readline history file.
    The default filename is ~/.history.

Solution 5 - Python

In IPython %history -g should give you the entire command history. The default configuration also saves your history into a file named .python_history in your user directory.

Solution 6 - Python

Since the above only works for python 2.x for python 3.x (specifically 3.5) is similar but with a slight modification:

import readline
for i in range(readline.get_current_history_length()):
    print (readline.get_history_item(i + 1))

note the extra ()

(using shell scripts to parse .python_history or using python to modify the above code is a matter of personal taste and situation imho)

Solution 7 - Python

@Jason-V, it really help, thanks. then, i found this examples and composed to own snippet.

#!/usr/bin/env python3
import os, readline, atexit
python_history = os.path.join(os.environ['HOME'], '.python_history')
try:
  readline.read_history_file(python_history)
  readline.parse_and_bind("tab: complete")
  readline.set_history_length(5000)
  atexit.register(readline.write_history_file, python_history)
except IOError:
  pass
del os, python_history, readline, atexit 

Solution 8 - Python

A simple function to get the history similar to unix/bash version.

Hope it helps some new folks.

def ipyhistory(lastn=None):
	"""
	param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
		   Also takes -ve sequence for first n history records.
	"""
	import readline
	assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
	hlen = readline.get_current_history_length()
	is_neg = lastn is not None and lastn < 0
	if not is_neg:
		flen = len(str(hlen)) if not lastn else len(str(lastn))
		for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
			print(": ".join([str(r if not lastn else r + lastn - hlen ).rjust(flen), readline.get_history_item(r)]))
	else:
		flen = len(str(-hlen))
		for r in range(1, -lastn + 1):
			print(": ".join([str(r).rjust(flen), readline.get_history_item(r)]))

Snippet: Tested with Python3. Let me know if there are any glitches with python2. Samples:

> Full History : ipyhistory()

> Last 10 History: ipyhistory(10)

> First 10 History: ipyhistory(-10)

Hope it helps fellas.

Solution 9 - Python

This should give you the commands printed out in separate lines:

import readline
map(lambda p:print(readline.get_history_item(p)),
    map(lambda p:p, range(readline.get_current_history_length()))
)

Solution 10 - Python

Rehash of Doogle's answer that doesn't printline numbers, but does allow specifying the number of lines to print.

def history(lastn=None):
	"""
	param: lastn Defaults to None i.e full history. If specified then returns lastn records from history.
		   Also takes -ve sequence for first n history records.
	"""
	import readline
	assert lastn is None or isinstance(lastn, int), "Only integers are allowed."
	hlen = readline.get_current_history_length()
	is_neg = lastn is not None and lastn < 0
	if not is_neg:
		for r in range(1,hlen+1) if not lastn else range(1, hlen+1)[-lastn:]:
			print(readline.get_history_item(r))
	else:
		for r in range(1, -lastn + 1):
			print(readline.get_history_item(r))

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLavanyaView Question on Stackoverflow
Solution 1 - PythonDennis GolomazovView Answer on Stackoverflow
Solution 2 - PythonIgnacio Vazquez-AbramsView Answer on Stackoverflow
Solution 3 - PythonCandide Guevara MarinoView Answer on Stackoverflow
Solution 4 - PythonMartin ThomaView Answer on Stackoverflow
Solution 5 - PythonYossarian42View Answer on Stackoverflow
Solution 6 - PythonJeff CliffView Answer on Stackoverflow
Solution 7 - PythondzNETView Answer on Stackoverflow
Solution 8 - PythonDoogleView Answer on Stackoverflow
Solution 9 - PythonIdea4lifeView Answer on Stackoverflow
Solution 10 - PythonJosiah YoderView Answer on Stackoverflow