#!/usr/bin/env python """ ptpython: Interactive Python shell. Usage: ptpython [ --vi ] [ --config-dir= ] [ --interactive= ] [--] [ ... ] ptpython -h | --help Options: --vi : Use Vi keybindings instead of Emacs bindings. --config-dir= : Pass config directory. By default '~/.ptpython/'. -i, --interactive= : Start interactive shell after executing this file. Other environment variables: PYTHONSTARTUP: file executed on interactive startup (no default) """ from __future__ import absolute_import, unicode_literals import docopt import os import six import sys from ptpython.repl import embed, enable_deprecation_warnings, run_config def run(): a = docopt.docopt(__doc__) vi_mode = bool(a['--vi']) config_dir = os.path.expanduser(a['--config-dir'] or '~/.ptpython/') # Create config directory. if not os.path.isdir(config_dir): os.mkdir(config_dir) # Startup path startup_paths = [] if 'PYTHONSTARTUP' in os.environ: startup_paths.append(os.environ['PYTHONSTARTUP']) # --interactive if a['--interactive']: startup_paths.append(a['--interactive']) sys.argv = [a['--interactive']] + a[''] # Add the current directory to `sys.path`. if sys.path[0] != '': sys.path.insert(0, '') # When a file has been given, run that, otherwise start the shell. if a[''] and not a['--interactive']: sys.argv = a[''] path = a[''][0] with open(path, 'rb') as f: code = compile(f.read(), path, 'exec') six.exec_(code) # Run interactive shell. else: enable_deprecation_warnings() # Apply config file def configure(repl): path = os.path.join(config_dir, 'config.py') if os.path.exists(path): run_config(repl, path) import __main__ embed(vi_mode=vi_mode, history_filename=os.path.join(config_dir, 'history'), configure=configure, locals=__main__.__dict__, globals=__main__.__dict__, startup_paths=startup_paths, title='Python REPL (ptpython)') if __name__ == '__main__': run()