ipython reads wrong python version

Each Answer to this Q is separated by one/two green lines.

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.

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.

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.

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

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.

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

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

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

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

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.

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

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 [email protected] 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/[email protected]/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

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!

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

I had python2.7, python3.6 and python3.8 installed

[email protected]:~$ ls -ls /usr/bin/python*
   0 lrwxrwxrwx 1 root root       9 Apr 16  2018 /usr/bin/python -> python2.7
   0 lrwxrwxrwx 1 root root       9 Apr 16  2018 /usr/bin/python2 -> python2.7
3548 -rwxr-xr-x 1 root root 3633000 Feb 27 20:40 /usr/bin/python2.7
   0 lrwxrwxrwx 1 root root       9 Oct 25  2018 /usr/bin/python3 -> python3.6
4424 -rwxr-xr-x 2 root root 4526456 Jan 26 21:03 /usr/bin/python3.6
5016 -rwxr-xr-x 1 root root 5134032 Jun  3 23:23 /usr/bin/python3.8

I had ipython file located at this location

[email protected]:~$ which ipython
/home/sahil/.local/bin/ipython

It was having below content

#!/usr/bin/python2

# -*- 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())

So I just made two copies of that file at the same location with name ipython3.6 and ipython3.8 and updated the first line to point to specific python version, /usr/bin/python3.6 and /usr/bin/python3.8 in my case.

So there are now 3 files each pointing to specific python version

[email protected]:~$ ls ~/.local/bin/ipython*
/home/sahil/.local/bin/ipython  
/home/sahil/.local/bin/ipython3.6  
/home/sahil/.local/bin/ipython3.8

Now when I need to start python2 I just run ipython from terminal and same way to get ipython in python3.8, I run ipython3.8

[email protected]:~$ ipython3.8
Python 3.8.11 (default, Jul  3 2021, 17:53:42) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.25.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: 

Note: you may need to install ipython for specific python version using command python3.6 -m pip install IPython or python3.8 -m pip install IPython. I am not sure whether it was installed with python or I installed separately.


The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published.