包的导入在 IPython shell 中有效,但在 Jupyter notebook 中无效

Import of package works in IPython shell but not in Jupyter notebook

我认为这个问题可能与我的 密切相关,但我不确定最好的通用答案是什么。

在我的笔记本电脑上,如果我登录 IPython shell,我可以执行

In [1]: import matplotlib

没有错误。

但是如果我尝试在 Jupyter notebook 中做同样的事情,我会收到以下错误:

---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-2-82be63b7783c> in <module>()
----> 1 import matplotlib

ModuleNotFoundError: No module named 'matplotlib'

这是怎么解释的?我应该怎么做才能解决这个问题?为什么 IPython shell 可以访问 Jupyter notebook 无法访问的包?

问题似乎是我的 jupyter notebook 版本默认使用 python 3,而我的 ipython shell 版本使用 python 2.

我按照 these instructions 安装了一个 python 2 内核用于 jupyter notebook。

然后我通过在笔记本中选择内核 > 更改内核将我的笔记本切换为使用 python 2 内核。

这让我可以导入我能够导入到 shell 中的所有包。

在我看来,您遇到的问题实际上与软件包无关,如果您在 Jupyter 上工作的环境与 IPython 彼此不同,您可能会面临这个问题。

您可以做的第一件事是检查环境是否为 运行 命令:

which python3

which jupyter

终端上的命令。然后您可以查看它们是否显示相同的环境。

另一个问题可能是软件包 "matplotlib" 没有安装到您在 Jupyter 上工作的环境中,假设您使用的是 Anaconda。 检查你的包是否安装到你在Anaconda上实际运行的环境

如之前的回答所述,似乎 jupyter 使用的 python 解释器与您在启动 python shell 时得到的解释器不同。 稍微解释一下;
在 Linux 中,所有 python 安装都在 /usr/bin 中,其中 python3 是 python3.{SUBVERSION-NUMBER} 维护版本的符号链接(和pythonpython2,后者又链接到 python2 的维护版本。{SUBVERSION-NUMBER})
例如在我的机器上

$ ll /usr/bin/python*
lrwxrwxrwx 1 root root    7 Mar  4 10:48 /usr/bin/python -> python2*
lrwxrwxrwx 1 root root    9 Mar  4 10:48 /usr/bin/python2 -> python2.7*
-rwxr-xr-x 1 root root 3.6M Apr  5 21:42 /usr/bin/python2.7*
lrwxrwxrwx 1 root root    9 Mar 26 06:25 /usr/bin/python3 -> python3.7*
-rwxr-xr-x 2 root root 4.4M Oct 22  2018 /usr/bin/python3.6*
-rwxr-xr-x 2 root root 4.4M Oct 22  2018 /usr/bin/python3.6m*
-rwxr-xr-x 2 root root 4.7M Apr  3 01:39 /usr/bin/python3.7*
lrwxrwxrwx 1 root root   33 Apr  3 01:39 /usr/bin/python3.7-config -> x86_64-linux-gnu-python3.7-config*
-rwxr-xr-x 2 root root 4.7M Apr  3 01:39 /usr/bin/python3.7m*
lrwxrwxrwx 1 root root   34 Apr  3 01:39 /usr/bin/python3.7m-config -> x86_64-linux-gnu-python3.7m-config*
lrwxrwxrwx 1 root root   16 Mar 26 06:25 /usr/bin/python3-config -> python3.7-config*
lrwxrwxrwx 1 root root   10 Mar 26 06:25 /usr/bin/python3m -> python3.7m*
lrwxrwxrwx 1 root root   17 Mar 26 06:25 /usr/bin/python3m-config -> python3.7m-config*

运行 python3.7 会给你一个 python3.7 shell 就像 运行 python3。 他们所有的 pre-installed 包都在相应的 /usr/lib/python{VERSION-NUMBER}/dist-packages
用户安装的包将在 ~/.local/lib/python{VERSION-NUMBER}/site-packages
如果您来自使用 venv 创建的虚拟环境 运行 python,则软件包将位于 {VENV-FOLDER}/lib/python{PYTHON_VERSION_USED_TO_CREATE_ENV}/site-packages.
正如您提到的,检查 python shell 中的 sys.path 将向您显示解释器正在寻找包的位置

>>> import sys
>>> sys.path
['',
 '/usr/lib/python37.zip',
 '/usr/lib/python3.7',
 '/usr/lib/python3.7/lib-dynload',
 '/home/{USER}/.local/lib/python3.7/site-packages',
 '/usr/local/lib/python3.7/dist-packages',
 '/usr/lib/python3/dist-packages']

在这种情况下,使用来自虚拟环境 venv 的 shell,sys.path 看起来像这样

>>> sys.path
['',
 '/usr/lib/python36.zip',
 '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload',
 '/home/{USER}/{PATH-TO-VENV}/lib/python{PYTHON_VERSION_USED_TO_CREATE_ENV}/site-packages']

第一个条目 ''__file__ 的目录(在 repl shell 中是空白的)因此您可以从 [=59] 所在的同一文件夹中导入模块=] 无需先安装自己的文件夹的脚本。