How to read history in ptpython console?

908 views Asked by At

I've been trying to figure out how to get save and read in the history of my Python commands in a ptpython console, but haven't been able to do so. All of my efforts have so far been variations of this answer. However, I still am not able to read in my history.

I would simply like to be able to press the and arrows to go through my Python commands from a previous console session (not the current console session that I'm in). Here's what I currently have in my $PYTHONSTARTUP file:

# 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=/home/user/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

import atexit
import os
import readline
import rlcompleter
import sys
try:
    from ptpython.repl import embed
except ImportError:
    print('ptpython is not available: falling back to standard prompt')
else:
    sys.exit(embed(globals(), locals()))

historyPath = os.path.expanduser("~/.ptpython/history")

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)
readline.parse_and_bind('tab: complete')
del os, atexit, readline, rlcompleter, save_history, historyPath

And my $PYTHONSTARTUP variable is:

$ echo $PYTHONSTARTUP 
/Users/[redacted]/.pystartup

I'm on Python 3.7.3, macOS 10.14.6, and ptpython 2.0.4.

Thanks

1

There are 1 answers

1
furas On BEST ANSWER

If you check source code for embed then you see option history_filename=

embed(globals(), locals(), history_filename=historyPath)

import os

try:
    from ptpython.repl import embed
except ImportError:
    print('ptpython is not available: falling back to standard prompt')
else:
    history_path = os.path.expanduser("~/.ptpython/history")
    embed(globals(), locals(), history_filename=history_path)

BTW: If folder ~/.ptpython doesn't exists then you will have to create it before run code.

EDIT (2022):

import os

try:
    from ptpython.repl import embed
except ImportError:
    print('ptpython is not available: falling back to standard prompt')
else:
    history_dir  = os.path.expanduser("~/.ptpython")
    history_path = os.path.join(history_dir, "history")
    
    if not os.path.exists(history_path):
        os.makedirs(history_dir, exist_ok=True)  # create folder if not exist
        open(history_path, 'a').close()          # create empty file
        
    embed(globals(), locals(), history_filename=history_path)