这很容易解决,但需要理解三个不同的概念:
- Unix/Linux/OSX 如何使用
$PATH 查找可执行文件(Windows 中为%PATH%)
- Python 如何安装和查找包
- Jupyter 如何知道使用什么 Python
为了完整起见,我将尝试对每一个进行快速 ELI5,以便您知道如何以最适合您的方式解决此问题。
1。 Unix/Linux/OSX $PATH
当您在提示符下键入任何命令(例如,python)时,系统将有一个明确定义的位置序列,用于查找可执行文件。此序列在名为PATH 的系统变量中定义,用户可以指定该变量。要查看您的PATH,您可以输入echo $PATH。
结果是您计算机上的目录列表,系统会按顺序搜索所需的可执行文件。从上面的输出中,我假设它包含以下内容:
$ echo $PATH
/usr/bin/:/Library/Frameworks/Python.framework/Versions/3.5/bin/:/usr/local/bin/
在窗口echo %path%
可能还穿插了其他一些路径。这意味着当您键入python 时,系统将转到/usr/bin/python。当你输入ipython时,在这个例子中,系统会转到/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython,因为/usr/bin/中没有ipython。
了解您正在使用的可执行文件始终很重要,尤其是当您在系统上安装了如此多的同一程序时。改变路径并不太复杂;参见例如How to permanently set $PATH on Linux?.
Windows - How to set environment variables in Windows 10
2。 Python 如何查找包
当您运行 python 并执行import matplotlib 之类的操作时,Python 必须玩类似的游戏才能找到您心目中的包。与 unix 中的 $PATH 类似,Python 有 sys.path 指定这些:
$ python
>>> import sys
>>> sys.path
['',
'/Users/jakevdp/anaconda/lib/python3.5',
'/Users/jakevdp/anaconda/lib/python3.5/site-packages',
...]
一些重要的事情:默认情况下,sys.path 中的第一个条目是当前目录。此外,除非你修改它(除非你确切地知道你在做什么,否则你不应该这样做)你通常会在路径中找到名为 site-packages 的东西:这是 Python 在安装包时放置包的默认位置使用python setup.py install,或pip,或conda,或类似方式。
需要注意的重要一点是,每个 Python 安装都有自己的站点包,其中安装了针对特定 Python 版本的包。换句话说,如果你安装一些东西,例如/usr/bin/python,然后是~/anaconda/bin/python 不能使用那个包,因为它安装在不同的 Python 上!这就是为什么在我们的 Twitter 交流中我建议您专注于一个 Python 安装,并修复您的$PATH,以便您只使用您想要使用的那个。
还有另一个组成部分:一些 Python 包与可以从命令行运行的独立脚本捆绑在一起(例如pip、ipython、jupyter、pep8 等)默认情况下,这些可执行文件将与用于安装它们的 Python 放置在相同的目录路径中,并且设计为仅适用于该 Python 安装。
这意味着,当您的系统设置完成时,当您运行python 时,您会得到/usr/bin/python,但是当您运行ipython 时,您会得到/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython,它与@ 的Python 版本相关联987654358@!此外,这意味着运行 python 时可以导入的包与运行 ipython 或 Jupyter 笔记本时可以导入的包完全不同:您使用的是两个完全独立的 Python 安装。
那么如何解决这个问题?好吧,首先确保您的 $PATH 变量正在执行您想要的操作。您可能有一个名为 ~/.bash_profile 或 ~/.bashrc 之类的启动脚本来设置此 $PATH 变量。在 Windows 上,您可以修改用户特定的环境变量。如果您希望系统以不同的顺序搜索事物,您可以手动修改它。当您第一次安装 anaconda/miniconda 时,会有一个自动执行此操作的选项(将 Python 添加到 PATH):对此说是,然后 python 将始终指向 ~/anaconda/python,这可能是您想要的。
3。 Jupyter 如何知道使用什么 Python
我们还没有完全脱离困境。您提到在 Jupyter 笔记本中遇到内核错误:这表明 Jupyter 正在寻找不存在的 Python 版本。
Jupyter 设置为能够使用各种“内核”或代码执行引擎。这些可以是 Python 2、Python 3、R、Julia、Ruby……有许多可能的内核可供使用。但是为了实现这一点,Jupyter 需要知道 在哪里 来查找相关的可执行文件:也就是说,它需要知道 python 所在的路径。
这些路径在 jupyter 的 kernelspec 中指定,用户可以根据自己的需要调整它们。例如,这是我系统上的内核列表:
$ jupyter kernelspec list
Available kernels:
python2.7 /Users/jakevdp/.ipython/kernels/python2.7
python3.3 /Users/jakevdp/.ipython/kernels/python3.3
python3.4 /Users/jakevdp/.ipython/kernels/python3.4
python3.5 /Users/jakevdp/.ipython/kernels/python3.5
python2 /Users/jakevdp/Library/Jupyter/kernels/python2
python3 /Users/jakevdp/Library/Jupyter/kernels/python3
其中每一个都是一个目录,其中包含一些元数据,这些元数据指定内核名称、可执行文件的路径以及其他相关信息。
您可以手动调整内核,在上面列出的目录中编辑元数据。
安装内核的命令会因内核而异。 IPython 依赖于ipykernel package,其中包含一个安装 python 内核的命令:例如
$ python -m ipykernel install
它将创建一个与用于运行此命令的 Python 可执行文件相关联的内核规范。然后,您可以在 Jupyter 笔记本中选择此内核,以使用该 Python 运行您的代码。
您可以使用帮助命令查看 ipykernel 提供的其他选项:
$ python -m ipykernel install --help
usage: ipython-kernel-install [-h] [--user] [--name NAME]
[--display-name DISPLAY_NAME] [--prefix PREFIX]
[--sys-prefix]
Install the IPython kernel spec.
optional arguments:
-h, --help show this help message and exit
--user Install for the current user instead of system-wide
--name NAME Specify a name for the kernelspec. This is needed to
have multiple IPython kernels at the same time.
--display-name DISPLAY_NAME
Specify the display name for the kernelspec. This is
helpful when you have multiple IPython kernels.
--prefix PREFIX Specify an install prefix for the kernelspec. This is
needed to install into a non-default location, such as
a conda/virtual-env.
--sys-prefix Install to Python's sys.prefix. Shorthand for
--prefix='/Users/bussonniermatthias/anaconda'. For use
in conda/virtual-envs.
注意:最新版本的 anaconda 附带了一个笔记本扩展,如果在其中安装了 ipykernel 包,它应该会自动检测您的各种 conda 环境。
总结:解决您的问题
因此,在这样的背景下,您的问题很容易解决:
设置您的PATH,以便首先使用所需的 Python 版本。例如,您可以运行 export PATH="/path/to/python/bin:$PATH" 来指定(一次)您想使用哪个 Python。要永久执行此操作,请将该行添加到您的.bash_profile/.bashrc(请注意,anaconda 可以在您安装它时自动为您执行此操作)。我建议使用 anaconda 或 miniconda 附带的 Python:这将允许您 conda install 所有您需要的工具。
确保为 that python 安装了您要使用的软件包。如果你使用 conda,你可以输入,例如conda install jupyter matplotlib scikit-learn 为anaconda/bin/python 安装这些软件包。
确保您的 Jupyter 内核指向您要使用的 Python 版本。当您conda install jupyter 时,它应该自动为anaconda/bin/python 设置它。否则,您可以使用jupyter kernelspec 命令或python -m ipykernel install 命令调整现有内核或安装新内核。
要将模块安装到其他不受 Anaconda 管理的 Python Jupyter 内核中,您需要将路径复制到内核的 Python 可执行文件并运行 /path/to/python -m pip install <package>
希望这很清楚......祝你好运!