如果你使用Anaconda作为你的Python管理系统,而且如果你有不同的conda environment,那么接下来我讲的事情你可能会有同感。

我打算在一个新的conda环境里安装tensorflow,我是这么做的:
(Mac OS X, GPU enabled, Python 2.7)

用下面的代码创建一个新的环境:

1
$ conda env create -n tensorflow python=2.7

之后activate它:

1
$ source activate tensorflow

接着安装tensorflow:

1
2
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow-0.10.0-py2-none-any.whl
(tensorflow)$ pip install --ignore-installed --upgrade $TF_BINARY_URL

成功之后,我很高兴,所以我二话不说就打开了jupyter notebook:

1
(tensorflow)$ jupyter notebook

结果,系统报错: No module named tensorflow
于是我退出,用

1
(tensorflow)$ which jupyter
查看了一下我正在使用的jupyter, 结果令人失望:
1
/Users/jasontang/anaconda/bin/jupyter

根本没有使用tensorflow env里的jupyter,怪不得报错!

可是我明明转换了环境呀,如果转换环境不能转换executable的路径的话,转换环境又有什么用呢?

解决方法

首先运行:

1
python -m IPython kernelspec install-self

然后:

1
vi /usr/local/share/jupyter/kernels/python2/kernel.json

1
2
3
4
5
6
7
8
9
10
11
{
"display_name": "Python 2",
"language": "python",
"argv": [
"/Users/yourname/anaconda/bin/python",  <-- Change this line
"-m",
"ipykernel",
"-f",
"{connection_file}"
]
}

改成

1
2
3
4
5
6
7
8
9
10
11
{
"display_name": "Python 2",
"language": "python",
"argv": [
"python",  <-- Change this line
"-m",
"ipykernel",
"-f",
"{connection_file}"
]
}

为什么

首先,要怪的话就怪jupyter的设计。jupyter使用的kernel是根据kernel.json里定义的python路径来选择,而当我们使用source activate tensorflow的时候,这份kernel.json并没有被改变。
当我们将”/Users/yourname/anaconda/bin/python”改成”python”时, 系统会自动去PATH里寻找默认的python executable,这时它会找到环境里的python。