IPython uses a different $PATH environment than the shell

bash, ipython, python, shell, zsh

Solution

First of all, `sys.path` has little to do with this; it's just the list of locations in which the Python interpreter can look when importing modules, and does not determine where executable programs are found by the shell. Some elements of the `PATH` are seen in that list, though, because the interpreter uses the path of its executable to build certain entries on `sys.path`.

`os.environ['PATH']` is, unsurprisingly, the same as the `$PATH` variable from the environment in which IPython is running. `!echo $PATH` prints out the `$PATH` variable from the subshell started by IPython to execute the shell escape (`!`).

One possible cause is that IPython is executing the shell commands using the OS standard shell which has not been tailored to set its path in the same way that your `zsh` has. You can confirm this by executing the IPython command `!echo $SHELL`. Since you confirmed this was not the case then the difference can be accounted for by the differences between a login shell and an interactive shell.

I don't know of a configuration item that will tell IPython to use another shell, but it's possible there is one. As a workaround, just make sure the other shell has a correctly configured path, or that interactive shells also see the environment you require.

See @mklement0's extremely authoritative answer for the whole, gory, messy details.

Problem

I had some problems with calling pip within the IPython REPL, and after a while I noticed that IPython doesn't use the same $PATH environment as my shell. ``` $ echo $PATH /Users/jimmy/dev/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin $ ipython In [1]: !echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin:/Users/jimmy/dev/anaconda/bin ``` It does seem to scramble the path order, and I'm not quite sure what's wrong. I'm using ZSH installed through oh-my-zsh as shell, if it is of help. This is what `sys.path()` returns: ``` ['', '/Users/jimmy/dev/anaconda/bin', '/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/sparsesvd-0.2.2-py2.7-macosx-10.5-x86_64.egg', '/Users/jimmy/dev/projects/pyresult', '/Users/jimmy/dev/work/gavagai/userdata', '/Users/jimmy/dev/work/gavagai/gavapi', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python27.zip', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/plat-darwin', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/plat-mac', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/plat-mac/lib-scriptpackages', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/lib-tk', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/lib-old', '/Users/jimmy/dev/anaconda/python.app/Contents/lib/python2.7/lib-dynload', '/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/runipy-0.1.0-py2.7.egg', '/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/setuptools-3.6-py2.7.egg', '/Users/jimmy/dev/anaconda/lib/python2.7/site-packages', '/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/PIL', '/Users/jimmy/dev/anaconda/lib/python2.7/site-packages/IPython/extensions', '/Users/jimmy/.ipython'] ``` And this is what `os.environ['PATH']` returns: ``` '/Users/jimmy/dev/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/texbin' ``` Both seem to place it in the correct order. Grateful for all help.

Original source