ipython reads wrong python version
Question:
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.
- iPython doesn’t read the libraries of scipy, matplotlib, but it does read numpy.
- 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
- 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.
Answers:
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.
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.
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
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
extremely relevant: http://conda.pydata.org/docs/troubleshooting.html#shell-command-location.
td;lr problems are encountered because of shell ‘hashing’ and path variables.
The absolute simplest solution I could think of, which requires no fiddling with environments, installed files, or anything else, relies on the facts that
- The executable
ipython
is actually a Python script.
- 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:
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
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
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!
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.
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
- I CHANGED my system PATH in settings – environment variables
- was
C:UsersjoecoAppDataRoamingPythonPython38Scripts
- now
C:UsersjoecoAppDataRoamingPythonPython39Scripts
- MOVED the above value UP to the top of the path
- REBOOTED
RESULTS
- ipython now matches python
- ipython
from pywinauto import handleprops
SUCCEEDS
I had python2.7, python3.6 and python3.8 installed
sahil@rubeus:~$ 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
sahil@rubeus:~$ 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
sahil@rubeus:~$ 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
sahil@rubeus:~$ 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.
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.
- iPython doesn’t read the libraries of scipy, matplotlib, but it does read numpy.
- 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
- 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.
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.
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.
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
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
extremely relevant: http://conda.pydata.org/docs/troubleshooting.html#shell-command-location.
td;lr problems are encountered because of shell ‘hashing’ and path variables.
The absolute simplest solution I could think of, which requires no fiddling with environments, installed files, or anything else, relies on the facts that
- The executable
ipython
is actually a Python script. - 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:
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
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
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!
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.
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
- I CHANGED my system PATH in settings – environment variables
- was
C:UsersjoecoAppDataRoamingPythonPython38Scripts
- now
C:UsersjoecoAppDataRoamingPythonPython39Scripts
- MOVED the above value UP to the top of the path
- REBOOTED
RESULTS
- ipython now matches python
- ipython
from pywinauto import handleprops
SUCCEEDS
I had python2.7, python3.6 and python3.8 installed
sahil@rubeus:~$ 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
sahil@rubeus:~$ 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
sahil@rubeus:~$ 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
sahil@rubeus:~$ 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.