我认为这个问题可能与我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笔记本无法访问的包?
答案 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}(以及python
到python2
链接到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中为空白),因此您可以从运行脚本的同一文件夹中导入模块,而无需安装首先是您自己的文件夹。