It is sometimes useful to access the source of an external Python package in your current virtualenv, for example to inspect its code or to place breakpoints while debugging.
If you use virtualenv_wrapper
then you may use the cdsitepackages
command. However, this doesn't help much for packages that have been installed in "editable" mode (that is, typically in the <virtualenvpath>/src/
folder).
So I wrote a little bash & zshell script to quickly access any package, regardless of where they are installed in your virtualenv. This script also allows tab completion to make things even faster:
(myenv)$ goto <TAB>
admin_tools curses encodings feincmstools lib2to3 paramiko ratelimit
appconf dateutil example gargoyle logging password_reset requests
bsddb debug_toolbar example_module gunicorn markdown PIL setuptools
compiler distutils example_project hotshot modeldict pip sorl
compressor django fabfile idlelib mptt psycopg2 south
ctypes email feincms jsonfield nexus pyrepl
(myenv)$ goto d<TAB>
dateutil debug_toolbar distutils django
(myenv)$ goto django
(myenv)$ pwd
/home/vagrant/.virtualenvs/myenv/lib/python2.6/site-packages/django
Here's the source:
# Author: Julien Phalip
# License: BSD
# Description: Change the current directory to the path of the given Python package.
function goto {
cd `python -c "import pkgutil; print(pkgutil.get_loader('$1').filename)"`
}
function _top_level_packages {
python -c "import pkgutil; print('\n'.join([name for loader, name, ispkg in sorted(pkgutil.iter_modules()) if ispkg]))"
}
if [ -n "$BASH" ] ; then
_goto_complete () {
local cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "`_top_level_packages`" -- ${cur}) )
}
complete -o default -o nospace -F _goto_complete goto
elif [ -n "$ZSH_VERSION" ] ; then
_goto_complete () {
reply=( $(_top_level_packages) )
}
compctl -K _goto_complete goto
fi
To install this script in your user's bin/
folder, simply run the following:
(myenv)$ mkdir -p ~/bin/
(myenv)$ wget https://gist.github.com/jphalip/5967635/raw/goto.sh -P ~/bin/
(myenv)$ source ~/bin/goto.sh
To make this script accessible in all future terminal sessions, simply add source ~/bin/goto.sh
to your user's bash or zshell profile.
PS: Thanks to Carlos Nepomuceno for providing some useful tips about pkgutil
on the Python users mailing list.