[Python-Dev] save()/load()

Skip Montanaro skip at pobox.com
Mon Dec 1 17:10:15 EST 2003

    >> My readline history is stored in ~/.pyhist.  I can't use
    >> readline.get_history_length() to mark the start of a session for
    >> reasons which are not obvious to me.

    Phillip> get_history_length() is the length you've set for truncation,
    Phillip> not the actual length.  You want get_current_history_length(),
    Phillip> IIRC.

Yes, thanks.  I decided to dispense with accessing the "start" of the
session and force the user to simply mark() where a session is to start.
That's one extra function to remember, but seems a lot more flexible.

Appended is my current incarnation.  Still doesn't load() right, though
save() seems to work.  Usage is:

    ... bunch of commands at the interpreter prompt ...

Any clues about what I'm doing wrong in load()?  I want to stuff the
evaluated objects into the globals() of the caller (that is, the globals for
the interactive session in most situations).


import readline
import os
import sys

# needs to match the filename the user uses!
_histfile = os.path.expanduser("~/.pyhist")

# where we save sessions
_session_file = os.path.expanduser("~/.pysession")

# mark with something valid at the interpreter but unlikely to be executed
# by the user
_marker = '((1.0+999.0j, "mark", 999.0-1.0j))'

def save():
    end = readline.get_current_history_length() - 1
    session = []
    item = readline.get_history_item(end)
    while item != _marker:
        session.insert(0, item+"\n")
        end -= 1
        item = readline.get_history_item(end)
    file(_session_file, 'w').writelines(session)
    print >> sys.stderr, "saved session to", _session_file

def load():
    execfile(_session_file, sys._getframe(-1).f_globals)
    print >> sys.stderr, "loaded session from", _session_file

def mark():

import __builtin__
__builtin__.save = save
__builtin__.load = load
__builtin__.mark = mark

More information about the Python-Dev mailing list