在Jupyter同時使用Python2 + Python3

2018/03/18 posted in  python comments

(Updated on 2018-08-15)

Jupyter Notebook (前身ipython notebook)是個很好用的coding工具,它可以:

  1. 用作快速prototyping:分段execute、即時修改memory中的variables
  2. 用作寫報告:內容可以包括code、執行結果、圖表等等

以下會如何解釋分別以pipconda處理 Jupyter 的 python environment。

1. 安裝Jupyter Notebook

如果你已安裝Jupyter,可以跳到下一部分。

以pip安裝

# python2
$ pip install --upgrade pip
$ pip install jupyter

# python3
$ brew install python3  # macOS
$ pip3 install --upgrade pip
$ pip3 install jupyter

以Conda安裝

Conda 是一個package manager + environment manager,就像是pip + virtualenv,可以裝package,也可以用作管理python的versions。

安裝Conda

Conda 安裝文檔

Anaconda版本包含了>720個常用的packages,如果不想安裝太多可以選擇先裝Miniconda,只包括conda的dependencies,日後可以conda install anaconda

(conda不是本篇重點所以先輕輕帶過了)

安裝Jupyter

Anaconda已經自帶了Jupyter,如果你裝了Miniconda,可以執行conda install jupyter安裝。

Jupyter Documentation

2. 加入python2 / python3 kernel

Kernel 決定了Jupyter上的code用甚麼去execute,例如可以是python2、python3,甚至是其他語言。

打開Jupyter看一看: jupyter notebook

這時browser應該已經出現了Jupyter的介面,右上角按New可以新增notebook,應該可以看到kernel的選擇。

因為我安裝的conda是python2,所以只有一個python2的kernel。

使用ipykernel

歷史:Jupyter原名叫ipython notebook,之後分拆成為獨立工具,但只代表web UI的部分,背後其實依然依賴ipython來執行code。

所以要改動Jupyter的kernel,就代表需要改動ipython的kernel,而ipython提供了ipykernel的工具來管理kernel。

ipykernel install的用法:

$ python -m ipykernel install  --help
usage: __main__.py [-h] [--user] [--name NAME] [--display-name DISPLAY_NAME]
                   [--prefix PREFIX]

Install the IPython kernel spec.

optional arguments:
  -h, --help            show this help message and exit
  --user                Install for the current user instead of system-wide
  --name NAME           Specify a name for the kernelspec. This is needed to
                        have multiple IPython kernels at the same time.
  --display-name DISPLAY_NAME
                        Specify the display name for the kernelspec. This is
                        helpful when you have multiple IPython kernels.
  --prefix PREFIX       Specify an install prefix for the kernelspec. This is
                        needed to install into a non-default location, such as
                        a conda/virtual-env.

官方Doc

修改使用ipykernel

(a) 以pip安裝python3

  1. 先安裝python3,例如brew install python3
  2. 安裝ipykernel到pip3
    • python3 -m pip install ipykernel
  3. 使用pip3安裝python3到jupyter
    • python3 -m ipykernel install --user

現在打開jupyter notebook,應該已經有python2python3兩個kernel了。

(b) 以conda安裝python3

  1. 新增一個python3 environment (或python2),conda會自動順便幫你安裝python3
  2. 安裝這個env的kernel到jupyter
# conda
$ conda create -n py36 python=3.6 ipykernel # 新增名為py36的python3.6 environment,在裡面安裝ipykernel
$ source activate py36 # 進入env (activate是conda提供的command)
$ python -m ipykernel install --user --name py36 # 安裝kernel
$ source deactivate # 離開env

現在打開jupyter notebook,應該已經有python2py36兩個kernel了。

管理不同env的kernel

可能你有兩個project的virtual environment,各自都在使用python 2.7,那麼在jupyter就要用不同命名去分辨兩個env。

source activate myenv
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"

source activate other-env
python -m ipykernel install --user --name other-env --display-name "Python (other-env)"
  • --name是jupyter內部用的env名稱,如果已存在,會直接overwrite重覆的env
  • --display-name就是顯示在jupyter介面的名稱

下筆時的versions:

  • conda 4.3.30
  • python 2.7.13