Skip to content

Jupyter Notebook is loading incorrect Python kernel #2563

Open
@rjtjs

Description

@rjtjs

I am on OSX Sierra (10.12.5), and am using Jupyter Notebook v 4.3.0. I have installed both Python2 and Python3 using Homebrew, and both kernels for Jupyter Notebook. Upon opening the notebook to use Python3 kernel, I find that it still uses Python2.

I might be missing something obvious in my installation, but I can't seem to figure out what it is.

Detailed Description

Installation:

I installed both Python2 and Python3 using Homebrew, and Jupyter Notebook on my system thus:
brew install python3
pip3 install --upgrade pip3 setuptools wheel
pip3 install jupyter

I ran all analogous commands for Python2 as well.

Configuration:

I generated the config file using
jupyter notebook --generate-config, and the only configurations I have "enabled" in my config file are:
c.NotebookApp.browser = u'safari'
c.NotebookApp.password = 'sha1:somepwd'

Both kernels installed:

Both kernels seem to be visible to kernelspec:

jupyter kernelspec list
Available kernels:
  python2    /usr/local/share/jupyter/kernels/python2
  python3    /usr/local/share/jupyter/kernels/python3

Both kernels are also available as options when I start execute jupyter notebook:
screen shot 2017-06-08 at 1 49 24 pm

As an additional check, pip list and pip3 list both include ipykernel.

Problem:

When I opened a new notebook using Python3 kernel, none of the packages I installed using pip3 were recognized when I used import. Furthermore, sys.path returns path to Python2:

screen shot 2017-06-08 at 1 59 32 pm

When I run print "Hello World", it gives me a successful output (which is true in Python2, but should throw an error in Python3).

However, when I use the (depreciated) command ipython3 notebook, things work as expected:
screen shot 2017-06-08 at 1 58 29 pm
and all my Python3 packages are successfully recognized.

It doesn't seem to be the biggest deal breaker, as I can continue working with ipython3 notebook, but I wonder what I am missing that causes jupyter notebook to not load Python3.

Activity

takluyver

takluyver commented on Jun 9, 2017

@takluyver
Member

Can you look at the kernel.json in each of those kernelspec directories you found?

rjtjs

rjtjs commented on Jun 9, 2017

@rjtjs
Author

kernel.json in python2 directory:

{
 "display_name": "Python 2", 
 "language": "python", 
 "argv": [
  "python", 
  "-m", 
  "ipykernel_launcher", 
  "-f", 
  "{connection_file}"
 ]
}

kernel.json in python3 directory:

{
 "argv": [
  "python",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "Python 3",
 "language": "python"
}
takluyver

takluyver commented on Jun 12, 2017

@takluyver
Member

This looks similar to jupyter/jupyter#270 . Ping @minrk - I think this is due to installing kernelspecs automatically as data files in the wheel.

takluyver

takluyver commented on Jun 12, 2017

@takluyver
Member

For now, you can probably work around it by changing the first item in argv to 'python3' in the Python 3 kernel.json file.

minrk

minrk commented on Jun 12, 2017

@minrk
Member

Yup, it's the same. Running ipython kernel install for Python 2 and 3 will resolve the ambiguity by installing with sys.executable's abspath that we can't do in data_files. While the new data_files work better in envs of all kinds and with just one Python, two Pythons running on the same prefix (e.g. --user on linux, but not mac) run into ambiguity.

rjtjs

rjtjs commented on Jun 12, 2017

@rjtjs
Author

I didn't fully understand what @minrk said above, but running ipython kernel install --name python3 didn't solve the issue, if that helps.

As @takluyver suggested, changing argv solved it for me, thank you. I changed the first argument of argv in python3 folder's kernel.json from python2 path to python3 path, and everything works as expected.

chapter09

chapter09 commented on Jul 28, 2017

@chapter09

I got a similar problem

messages image 3819428338

I solved it by sudo pip install --upgrade ipykernel

pjpjq

pjpjq commented on Aug 3, 2017

@pjpjq
nvdv

nvdv commented on Sep 19, 2017

@nvdv
Contributor

Solved this issue by executing

python3 -m ipykernel install --user
cbcoutinho

cbcoutinho commented on Jan 8, 2018

@cbcoutinho

I also am experiencing this issue, and editing the two kernel.json files has solved the problem. Will I have to do this every time I upgrade jupyter on my machine?

takluyver

takluyver commented on Jan 8, 2018

@takluyver
Member

Hopefully not. We've refined this behaviour in a new version of jupyter_client

actongorton

actongorton commented on Jan 19, 2018

@actongorton

This is also happening to me. Using ipython3 notebook works.

25 remaining items

mathieuboudreau

mathieuboudreau commented on Jul 21, 2020

@mathieuboudreau

I was on vacation last week. If I recall, it was working correctly before then, and isn't working now. I don't think made any upgrades, but I could try and delete anaconda and reinstall it.

JanGieseler

JanGieseler commented on Aug 31, 2020

@JanGieseler

I got the same issue!
For some reason the environment is not activated in jupyter notebook. If I activate the environment in the terminal conda activate myenv and run echo $PATH, I get /Users/$USER/anaconda3/envs/myenv/bin.
However, when I start the jupyter notebook and run !echo $PATH, I get /Users/$USER/anaconda3/bin.
Therefore, also if I run which pythonin the terminal I get the python version from the environment but if I run it in the notebook I get the default python.

This is on Mac Catalina.

kevin-bates

kevin-bates commented on Aug 31, 2020

@kevin-bates
Member

You might find something helpful here and in the referenced links.

elexira

elexira commented on Jan 15, 2021

@elexira

for the love of GOD, somebody please address this issue, none of the solutions work, and many have the same issue where changing the kernel does not point the python to the correct kernel environment. For me it always point into the same environment from which i ran the initial jupyter-notebook. I am stuck to that environment python, cannot change the kernel to any other one.
Within jupyter if i run this:

import sys
sys.executable

it points to the correct python environment and changes as expected, but
which python
inside the same damn jupyter notebook always point to the one directory even when i change the kernel.

kevin-bates

kevin-bates commented on Jan 15, 2021

@kevin-bates
Member

It seems like the crux of the issue is that the correct python is in use by the kernel, but the PATH (from the kernel) doesn't reflect the python in use. As a result, while python statements (e.g., import foo) produce the desire results, any shell commands (e.g., !pip install foo) do not. In such cases, you could fully-qualify the shell command and, I believe, get the desire results.

I found the IPython's documentation link in the Python Environments section of the troubleshooting documentation to be fairly helpful. In particular the portion about installing the kernel with the --prefix option to point at an env different that the current env.

Jupyter, by default, doesn't activate environments for a given kernel. This is why the PATH-based commands (sans prefixing) can be problematic. If you find that activation may resolve things for you, then perhaps taking a look at nb_conda_kernels may be helpful. This package updates your jupyter's configuration to use an alternate KernelSpecManager that is used for discovering kernels (which some find invasive). These kernel specifications contain information that, AFAIK, activate the environment associated with that kernel prior to its launch.

Here's a screenshot of a kernel I've started that uses a python from an environment other than the notebook server. The notebook server is launched in my activated notebook-dev env, while the kernel I want to run is in my enterprise-gateway-dev env. Aside from the PATH and sys.executable difference, you'll find that the import statement produces the desired result (my notebook-dev env doesn't have kubernetes installed). In addition, my EG env doesn't have nose installed until I fully qualify the pip command to install it into the kernel's env (i.e., enterprise-gateway-dev).

Screen Shot 2021-01-15 at 10 39 43 AM

I hope you find this helpful and apologize for the frustration.

yasirroni

yasirroni commented on Mar 1, 2021

@yasirroni

It seems like the crux of the issue is that the correct python is in use by the kernel, but the PATH (from the kernel) doesn't reflect the python in use. As a result, while python statements (e.g., import foo) produce the desire results, any shell commands (e.g., !pip install foo) do not. In such cases, you could fully-qualify the shell command and, I believe, get the desire results.

I found this exact behavior when trying having jupyterlab to manage multiple env.

  1. Each kernel have different kernel.json, each pointing different env.
  2. import behave exacty as expected, only import from the pointed env
  3. All !system command including !pip install and python3 --version will only point to the main kernel (in my case, default ubuntu python 3.8)

Is there any work around to install package diractly to env without leaving jupyterlab?

kevin-bates

kevin-bates commented on Mar 1, 2021

@kevin-bates
Member

Hi @yasirroni - try using the %pip magic. This is exactly the problem it resolves.

himanshu-irl

himanshu-irl commented on Mar 9, 2021

@himanshu-irl

ipython kernel install --user worked for me

jianboy

jianboy commented on Apr 19, 2021

@jianboy

2021-04-19_185943

What do I need to do to install dependency?

run pip install pandas, it installed to /usr/bin/python2 instead of /opt/python3.9

murata100

murata100 commented on Jun 7, 2022

@murata100

@jianboy I solved it with this

run pip install pandas, it installed to /usr/bin/python2 instead of /opt/python3.9

import sys
! {sys.executable} -m pip install pandas
import pandas

You may need to restart the kernel

nemusa

nemusa commented on Aug 16, 2022

@nemusa

The problem with which python inside notebook not pointing to the same as sys.executable is caused by a difference in system paths. In order to make sure they are pointing to the same executable:

  • make sure you are using the right python version and it's pip when creating the ipykernel - ensured by python -m ...
  • set up paths for your ipykernel by passing --env PATH=...

For my setup with virtualenv it looks like this

/home/user/venv/bin/python -m pip install ipython ipykernel
/home/user/venv/bin/python -m ipykernel install --user --name=kernel-name --env PATH /home/user/venv/bin:$PATH

In general:

<YOUR_PYTHON_EXECUTABLE> -m pip install ipython ipykernel
<YOUR_PYTHON_EXECUTABLE> -m ipykernel install --user --name=kernel-name --env PATH <YOUR_PYTHON_BIN_DIRECTORY>:$PATH
aeciorc

aeciorc commented on Dec 29, 2022

@aeciorc

@nemusa Thank you so much, this worked for me! It was driving me crazy that I couldn't figure out why the PATH inside the shell didn't match my $PATH

GregHilston

GregHilston commented on Sep 27, 2023

@GregHilston

@nemusa 's approach was the only thing that worked for me running the jupyter/minimal-notebook docker contaner

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @minrk@takluyver@chapter09@nvdv@mathieuboudreau

        Issue actions

          Jupyter Notebook is loading incorrect Python kernel · Issue #2563 · jupyter/notebook