包的导入在IPython shell中工作,但在Jupyter笔记本中不起作用

时间:2018-01-10 18:20:32

标签: python ipython jupyter-notebook python-import

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

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

In [1]: import matplotlib

没有错误。

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

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

ModuleNotFoundError: No module named 'matplotlib'

这解释了什么?我该怎么做才能解决这个问题?为什么IPython shell可以访问Jupyter笔记本无法访问的包?

3 个答案:

答案 0 :(得分:2)

在我看来,您遇到的问题实际上与软件包无关,如果您在Jupyter和IPython上工作的环境相互之间,则可能会遇到问题。

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

which jupyter

{{1}}
终端上的

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

另一个问题可能是,假设您使用Anaconda,在您使用Jupyter的环境中未安装软件包“ matplotlib”。 检查是否已将软件包安装到实际在Anaconda上运行的环境中。

答案 1 :(得分:1)

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

我跟随these instructions安装了python 2内核,供jupyter笔记本使用。

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

这使我能够导入所有能够在shell中导入的软件包。

答案 2 :(得分:1)

如先前的答案中所述,似乎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一样。 他们所有的预装软件包都将位于相应的/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的外壳,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中为空白),因此您可以从运行脚本的同一文件夹中导入模块,而无需安装首先是您自己的文件夹。