正如前面的答案中提到的,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 的 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 中为空白),因此您可以从运行脚本的同一文件夹中导入模块,而无需先安装自己的文件夹.