Autocompletion for your python shell|console|interpreter
October 2017
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
About
This site is an effort to share some of the base knowledge I have gathered through all this years working with Linux, FreeBSD, OpenBSD, Python or Zope, among others. So, take a look around and I hope you will find the contents useful.
Recent Entries
Recent Comments
Recent Trackbacks
Categories
OpenBSD (9 items)
BSD (0 items)
FreeBSD (19 items)
Linux (3 items)
Security (3 items)
Python (22 items)
Zope (13 items)
Daily (144 items)
e-shell (9 items)
Hacks (14 items)
PostgreSQL (3 items)
OSX (8 items)
Nintendo DS (0 items)
enlightenment (0 items)
Apache (3 items)
Nintendo Wii (1 items)
Django (24 items)
Music (12 items)
Plone (7 items)
Varnish (0 items)
Lugo (2 items)
Sendmail (0 items)
europython (7 items)
Cherokee (1 items)
self (1 items)
Nature (1 items)
Hiking (0 items)
uwsgi (0 items)
nginx (0 items)
cycling (9 items)
Networking (1 items)
DNS (0 items)
Archives

Syndicate this site (XML)

RSS/RDF 0.91

19 enero
2010

Autocompletion for your python shell|console|interpreter

this is an old one, but I would like to have it here as a reminder

One of the nice features of the django shell (that is, the python shell you get when you call ./manage.py shell inside a django project) is that it has tab autocompletion, that is, you can import a module and use tab-completion to see all the modules within it.

A lot of people are using iPython these days because of the lack of this feature on the default Python shell, but this is only by default, and if you are using iPython only because of the tab completion, forget about installing extra stuff, you only have to do this little trick:

import rlcompleter, readline
readline.parse_and_bind('tab:complete')

and you can use tab completion, for example:

>>> import smtplib
>>> smtplib.
smtplib.CRLF                      smtplib.SSLFakeFile               smtplib.__setattr__(
smtplib.LMTP                      smtplib.__all__                   smtplib.__sizeof__(
smtplib.LMTP_PORT                 smtplib.__class__(                smtplib.__str__(
smtplib.OLDSTYLE_AUTH             smtplib.__delattr__(              smtplib.__subclasshook__(
smtplib.SMTP                      smtplib.__dict__                  smtplib._have_ssl
smtplib.SMTPAuthenticationError(  smtplib.__doc__                   smtplib.base64
smtplib.SMTPConnectError(         smtplib.__file__                  smtplib.email
smtplib.SMTPDataError(            smtplib.__format__(               smtplib.encode_base64(
smtplib.SMTPException(            smtplib.__getattribute__(         smtplib.hmac
smtplib.SMTPHeloError(            smtplib.__hash__(                 smtplib.quoteaddr(
smtplib.SMTPRecipientsRefused(    smtplib.__init__(                 smtplib.quotedata(
smtplib.SMTPResponseException(    smtplib.__name__                  smtplib.re
smtplib.SMTPSenderRefused(        smtplib.__new__(                  smtplib.socket
smtplib.SMTPServerDisconnected(   smtplib.__package__               smtplib.ssl
smtplib.SMTP_PORT                 smtplib.__reduce__(               smtplib.stderr
smtplib.SMTP_SSL                  smtplib.__reduce_ex__(
smtplib.SMTP_SSL_PORT             smtplib.__repr__(

In this example, after importing smtplib I just wrote smtplib. in the shell and hit tab twice, to get all the available options in that module.

Nice, isn't it?

Ok, now it would be even nicer if we do not have to set tab completion each time we run the python shell, but this is an easy one.

Each time you run the python shell|console|interpreter, it will search for a variable in your environment called PYTHONSTARTUP, where you can set a file that will be executed after starting the shell (the perfect place to put some init-lines).

So, all you have to do is, first, add this two lines to a file, for example, called .pythonrc in your home:

$ cat ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')
$

Second, add the PYTHONSTARTUP variable to your shell profile file. If you are using csh, tcsh or similar shells, this will do it:

echo "setenv PYTHONSTARTUP ~/.pythonrc" >> ~/.cshrc

If your shell is sh, bash, ksh or similars, this will do it:

echo "export PYTHONSTARTUP=~/.pythonrc" >> ~/.profile

(check your OS info, perhaps instead of .profile it could be .kshrc, .bashrc or something like that).

After that, you will be able to use tab completion each time in your default python shell, with no additional dependencies!

NOTE: Of course, you should take a look at iPython anyway, as it has a lot more features than tab-completion, it is a powerful tool you may find very very useful.

Posted by wu at 10:04 | Comments (5) | Trackbacks (0)
<< A parabola do carballo e mais o eucalipto | Main | Hidden emails for comments in this COREBlog >>
Comments
Re: Autocompletion for your python shell|console|interpreter

IPython allows non-blocking interaction with Tkinter, GTK, Qt and WX. The standard Python shell only allows interaction with Tkinter. IPython can interactively manage parallel computing clusters using asynchronous status callbacks and/or MPI. IPython can be used as a system shell replacement, especially on Windows, which has a minimally capable shell. Its default behavior is largely familiar from Unix shells, but it allows customization and the flexibility of executing in a live Python environment

Posted by: double boiler at julio 27,2010 15:03
Re: Autocompletion for your python shell|console|interpreter

Hey "double boiler", thnx for the comment. I know IPython has a lot of features (you only have to check http://ipython.scipy.org to get more info about it.

Anyway, there are times when people don't need all those features, but just need some things like completion or history saving to the default python shell, those are the perfect audience for my post.

This last week, while attending the Europython 2010 conference, I found bpython, another really interesting alternative to the default python interpreter/shell/console. You should take a look at it.

Posted by: Wu at julio 27,2010 17:06
Not working for me.

Hi Wu,

This is not working for me.

I ran both the lines on the console and still can't get autocomplete to work.

I'm doing this on mac/iterm2 terminal.

Posted by: Swagat at agosto 22,2014 15:54
Re: Autocompletion for your python shell|console|interpreter

Thanks, just what I was looking for, very clear and simple. Good man.

Posted by: fault-tolerant at noviembre 29,2014 18:21
Re: Autocompletion for your python shell|console|interpreter

Same here.
Using Mac/iterm2 and the tweak doesn't do what it should...

Posted by: nadav at enero 07,2016 14:33
Re: Autocompletion for your python shell|console|interpreter

Hey nadav!

Which version of OSx and which version of python?

I had not tried in recent versions of OSx, but still works for me in 10.8.x with recent python versions (2.7.11 and 3.5.1).

Also, is it the python that comes preinstalled with OSx, or did you install it through macports or any other package system?

Posted by: Wu at enero 22,2016 08:14
Re: Autocompletion for your python shell|console|interpreter

The problem with this is that you cannot use tabs for indentation anymore, and copy-pasting code with tabs won't work

Posted by: alex at julio 31,2017 16:31
Trackbacks
Please send trackback to:http://blog.e-shell.org/221/tbping
There are no trackbacks.
Post a comment