Skip to content

asmeurer/mypython

Folders and files

NameName
Last commit message
Last commit date

Latest commit

a1611a3 · Mar 18, 2025
Oct 6, 2022
Mar 23, 2023
Mar 13, 2025
Apr 13, 2018
Feb 27, 2021
May 1, 2017
Oct 19, 2023
Oct 7, 2024
Feb 7, 2017
Mar 13, 2025
Aug 26, 2017
Sep 29, 2018
Aug 18, 2017
Mar 18, 2025

Repository files navigation

mypython

A Python REPL the way I like it.

What? Why?

I was unsatisfied with all the existing Python interpreter options. None quite worked the way I liked them to, even after attempting to configure them (often a frustrating experience).

So instead I wrote my own. Turns out it's really easy.

prompt-toolkit is a nice framework for creating custom REPLs. It took under an hour to create a basic Python REPL, and only a few days to add most of the features I like to it. REPLs created with prompt-toolkit are really nice. They support advanced features like syntax highlighting, multiline editing, and popup tab completion without any additional work (unlike REPLs based on readline).

Features

  • Fancy emoji numbered prompts.
  • Multiline input, which "just works"
  • Keyboard shortcuts configured exactly the way I like them.
  • History search (M-Up/Down Arrow) can be used to combine multiple things from the history.
  • Up/down automatically go to the top/bottom of multiline inputs from the history. Up+Enter intelligently executes.
  • Outputs saved as _1, _2, etc.. Previous outputs saved in _, __, and ___.
  • Support for bracketed paste (pasting stuff in the terminal "just works" without the need for any %paste magic or a special "paste" mode).
  • prompts are stripped automatically from pasted text.
  • Emacs command editing keybindings.
  • Automatic syntax highlighting.
  • Automatic highlighting of errors via pyflakes.
  • On syntax error, the cursor is moved to the error.
  • Matching and mismatching parentheses highlighting.
  • Tracebacks for stuff defined interactively show the code line.
  • Tab completion using Jedi and dir().
  • Per-terminal history.
  • A nice theme (the same one I use in emacs, called "1am", based on XCode's "midnight").
  • stuff? shows the help for stuff. Works even if stuff is a complex expression. Does the right thing for NumPy ufuncs.
  • stuff?? shows the source for stuff. Works even if stuff was defined interactively.
  • %time and %timeit magic commands.
  • %doctest mode to emulate standard Python REPL (for copy-paste purposes).
  • %sympy magic (works like sympy.init_session().
  • %pyinstrument magic to run code with pyinstrument.
  • %line_profiler magic to run code with line_profiler.
  • %pudb magic to run code in PuDB.
  • Debugging functions defined interactively works.
  • Integration as a custom shell for PuDB.
  • SymPy objects automatically pretty print.
  • Shell integration with iTerm2.
  • GUI Matplotlib plots on macOS work correctly.

And some other stuff that I haven't implemented yet.

Most of this stuff either comes for free from prompt-toolkit or was really easy to implement, in some cases by modifying some code from other libraries (ptpython, ipython, sympy, the Python standard library).

Installation

I haven't packaged it yet. For now you can clone the repo and run ./bin/mypython.

It requires the following packages, which can be installed from conda-forge:

  • prompt_toolkit
  • pygments
  • iterm2_tools (on Mac)
  • parso
  • jedi
  • pyflakes
  • setproctitle

As well as some optional dependencies that are needed for some %magic commands:

  • pudb
  • pyinstrument
  • matplotlib
  • sympy

You can install them using the requirements.txt file.

Configuration

There is none. It's already configured the way I like it.

Features and bugs and stuff

I wrote this for me. You can request features, submit PRs, and report bugs, but be aware that I won't accept any PR unless it's a feature I want. I'm really not designing this to be used by other people.

Acknowledgments

Thanks to Jonathan Slenders for prompt-toolkit and ptpython (which I borrowed some of the more tricky things like Python multiline and Jedi completion from). Basically all the fancy stuff here is coming from prompt-toolkit. I just combined it together into a REPL that I like. Thanks to the IPython guys for figuring out the matplotlib eventloop stuff (which I could never do on my own), and for inspiring many of the features I've implemented.

License

MIT.

Licenses for code taken and modified from ptpython, IPython, prompt-toolkit, SymPy, and the Python standard library are at the top of the respective files.

Releases

No releases published

Packages

No packages published

Languages