110
votes

I've been having trouble with Python, iPython and the libraries. The following points show the chain of the problematics. I'm running Python 2.7 on Mac Lion.

  1. iPython doesn't read the libraries of scipy, matplotlib, but it does read numpy.
  2. To fix this, I tried installing Python's source code version, and it only gave me more problems since now I have two different versions: 2.7.1 and 2.7.2
  3. I noticed that running Python, uses version 2.7.2 and does import scipy, matplotlib, and numpy, but on iPython the version is 2.7.1 which doesn't open scipy or matplotlib.

I've tried several things that I've encountered from other blogposts. But none of them have helped, and also unfortunately I don't quite know what I'm doing with some of them. For example: I tried uninstalling and reinstalling ipython with easy_install and pip. I also tried reinstalling everything through homebrew, and modifying the path .bash_profile.

12
The ipython script is "tied" to the specific Python version it was installed with – it won't automatically switch to what you installed last. If you first installed 2.7.1, then IPython, then 2.7.2 from source, your IPython will keep using 2.7.1. You need to either undo all your flailing, go back to your original Python version and figure out what the reason was behind point 1; alternately, reinstall IPython using whichever Python install can access the libraries you need. - millimoose
Could you be more specific?... thanks - Diego-MX
Specific about which part? How IPython startup works, or how to make the problem go away? - millimoose
Essentially, when you install any python "program", like IPython or even easy_install, the startup script for the program is set to always use the python executable it was installed with. So, if you had Python 2.7.1 without your libraries, and then install IPython, IPython is installed "into" the Python 2.7.1 installation, and a link to the ipython executable is placed on your PATH. If you then install Python 2.7.2 from source, it's a new, separate copy of Python it won't upgrade the existing 2.7.1 that has IPython in it. So IPython won't see the 2.7.2 copy, or any libraries in it. - millimoose
Libraries work the same. If you installed numpy etc. after installing Python 2.7.2 from source, they were likely installed into the 2.7.2 directory. This means that the Python 2.7.1 version wouldn't see those libraries at all. Since IPython was installed with 2.7.1, it couldn't see those libraries either. Basically, you can have as many completely separate copies of Python on your system as you want, but it can be hard keeping track of which one is used for what. Unless you know what you're doing, it's best to start with the built-in version of Python, and just reinstalling missing libraries - millimoose

12 Answers

154
votes

Okay quick fix:

which python

gives you /usr/bin/python, right? Do

which ipython

and I bet that'll be /usr/local/bin/ipython. Let's look inside:

Edit 9/7/16 -- The file now looks like this:

cat /usr/local/bin/ipython

#!/usr/bin/python

# -*- coding: utf-8 -*-
import re
import sys

from IPython import start_ipython

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())

And mine works properly like this, but my situation isn't exactly like the OP's.


Original answer -- 9/30/13:

cat /usr/local/bin/ipython

#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'ipython==0.12.1','console_scripts','ipython'
__requires__ = 'ipython==0.12.1'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('ipython==0.12.1', 'console_scripts', 'ipython')()
    )

Aha - open /usr/local/bin/ipython in your editor (with privileges), and change the first line to

#!/usr/local/bin/python

save, start iPython, should say it's using the version you want now.

32
votes

Posting @Matt's comment as an answer just so its more visible

python -m IPython

Loads ipython as a module with whatever python is accessible on the path first. In my case I had one pre-installed and one I added from brew. This just works perfectly.

10
votes

What about using a virtualenv? I really like it. Maybe it's not the faster way, but I think it's very clear.

When you create a virtualenv, you can specify the python path with the -p flag.

for python 2.7

$ virtualenv -p /usr/bin/python2.7 venv2.7
$ source venv2.7/bin/activate
(venv2.7)$ pip install ipython
(venv2.7)$ ipython

for python 3.4

$ virtualenv -p /usr/bin/python3.4 venv3.4
$ source venv3.4/bin/activate
(venv3.4)$ pip install ipython
(venv3.4)$ ipython
6
votes

First, I would make sure you're using the right python. At a command prompt type:

which python
python -V

The first will tell you the path, the second tells you the Python version you're using.

4
votes

My solution is simple, stupid but work.

I use python -V to make sure what version is

$ python -V
Python 2.7.10

and then make alias in .bash_profile

$ vi ~/.bash_profile

Add a line

alias ipython="python -m IPython"

then you will get an ipython in python 2.7. 🙂

(By the way, my ipython is install via homebrew, it default will got an ipython run in python 3.)

$ brew install ipython
3
votes

extremely relevant: http://conda.pydata.org/docs/troubleshooting.html#shell-command-location.

td;lr problems are encountered because of shell 'hashing' and path variables.

1
votes

A similar method using pyenv

pyenv install 3.4.5
pyenv local 3.4.5
pip install ipython
ipython

Now it will show correct version of python

Python 3.4.5
1
votes

The absolute simplest solution I could think of, which requires no fiddling with environments, installed files, or anything else, relies on the facts that

  1. The executable ipython is actually a Python script.
  2. The IPython package is installed separately for each interpreter that you ran pip intall with.

If the version of Python you are runninig with has an IPython package installed, you can just do

/path/to/desired/python $(which ipython)

This will run the ipython script with the interpreter you want instead of the one listed in the shebang.

0
votes

Your problem is basically making ipython use the right python.

so the fix to the problem is to make ipython use the right python (which has the libraries like scipy installed)

I have written a solution here:

How to make iPython use Python 2 instead of Python 3

0
votes

I came across the same issue but the following was the only solution what worked for me on OSX 12, Sierra.

ipython was always launching for python 3.6 but I needed it for 2.7. I could not find an ipython startup script for 2.7, nor could I find the IPython module to execute with python -m. None of brew instally ipython pip install ipython or pip2 install ipython could get me the 2.7 version. So I got it manually.

brew install ipython@5 installs the 2.7 version from here but won't put it on your $PATH because it knows the name conflicts with another package. ln -s /usr/local/Cellar/ipython@5/5.5.0_1/bin/ipython /usr/local/bin/ipython2 will fix this and let you just run ipython2 from your shell prompt

For me, because I was serious about using ipython for 2.7, I also ran the following commands.

ln -s /usr/local/Cellar/ipython/6.2.1/bin/ipython /usr/local/bin/ipython3
rm -f /usr/local/bin/ipython
ln -s /usr/local/bin/ipython2 /usr/local/bin/ipython
0
votes

All the answers mentioned here do not help in solving the issue if you are using anaconda or some other virtual environment wrapper.

This answer is based on the assumption that you are using anaconda.

Say you are in a python 3 environment and when creating a notebook on jupyter notebook it shows "Python 2" instead of "Python 3".

This is because "ipython" is essentially a script which is run and in this script it mentions which python version it is using to execute the command. All you need to do is change this line for ipython to use the version of python you want.

First stop the ipython server and get the location of the python executable of the current environment using the command "which python"

My output is :

/home/sourabh/anaconda2/envs/py3/bin/python

Now get the executable location of ipython use the command "which ipython"

mine is :

/home/sourabh/anaconda2/envs/py2/bin/python

Notice that it is using a different version of python ie. python from a specific environment running a different version of python ie running python from a different environment.

Now navigate to the directory anaconda2/bin(for anaconda 3 users it should be anaconda3/bin ) and search for "ipython" file. in this edit the first line to be point it to the current python version which you want. ie the output of "which python" i.e. :

#!/home/sourabh/anaconda2/envs/py3/bin/python

Notice that I changed my python environment from py2(running python 2.7) to py3(running python 3.5).

Save the file. And run jupyter notebook, now when creating a new notebook the "Python 3" option should be visible.

Cheers!

0
votes

For me, on windows 10, my ipython.exe did not match my python. I knew this because ipython said

----> 3 from pywinauto import handleprops
      4 from pywinauto import timings
      5 from pywinauto.application import Application

ModuleNotFoundError: No module named 'pywinauto'

However, this worked when I executed the containing program with > python

Here's the mis-match.

ipython info

Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:21:23) [MSC v.1916 32 bit (Intel)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.9.0 -- An enhanced Interactive Python. Type '?' for help.

[DOT DOT DOT]

python info

Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Here's my fix. I changed my reference to Python\...\Scripts, which is where ipython.exe is hiding

  1. I CHANGED my system PATH in settings - environment variables
  • was C:\Users\joeco\AppData\Roaming\Python\Python38\Scripts
  • now C:\Users\joeco\AppData\Roaming\Python\Python39\Scripts\
  1. MOVED the above value UP to the top of the path
  2. REBOOTED

RESULTS

  1. ipython now matches python
  2. ipython from pywinauto import handleprops SUCCEEDS