我想使用Jupyter笔记本,但是在进行基本导入时遇到了困难(例如导入matplotlib)。我想这是因为我有几个用户管理的python安装。例如:
> which -a python
/usr/bin/python
/usr/local/bin/python
> which -a ipython
/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
/usr/local/bin/ipython
> which -a jupyter
/Library/Frameworks/Python.framework/Versions/3.5/bin/jupyter
/usr/local/bin/jupyter
我曾经有过anaconda,但是从〜/ anaconda目录中删除了。现在,当我启动一个Jupyter Notebook时,我得到一个内核错误:
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py",
line 947, in init restore_signals, start_new_session)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py",
line 1551, in _execute_child raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2]
No such file or directory: '/Users/npr1/anaconda/envs/py27/bin/python'
我该怎么办?!
答案 0 :(得分:120)
这很容易解决,但它涉及理解三个不同的概念:
$PATH
查找可执行文件(Windows中为%PATH%
)为了完整起见,我会尝试对其中的每一个进行快速ELI5,因此您将知道如何以最佳方式解决此问题。
当您在提示符下键入任何命令(例如,python
)时,系统会有一个明确定义的位置序列,以查找可执行文件。此序列在名为PATH
的系统变量中定义,用户可以指定。要查看PATH
,您可以输入echo $PATH
。
结果是计算机上的目录列表,将按按顺序搜索所需的可执行文件。从上面的输出中,我假设它包含这个:
$ echo $PATH
/usr/bin/:/Library/Frameworks/Python.framework/Versions/3.5/bin/:/usr/local/bin/
在Windows echo %path%
也可能还有一些其他路径。这意味着当您键入python
时,系统将转到/usr/bin/python
。当您键入ipython
时,在此示例中,系统将转到/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
,因为ipython
中没有/usr/bin/
。
了解您正在使用的可执行文件始终很重要,尤其是当您在系统上安装了相同程序的许多内容时。改变路径不是太复杂;见例如How to permanently set $PATH on Linux?
Windows - How to set environment variables in Windows 10
当您运行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 setup.py install
,pip
或conda
或类似方法安装软件包时,Python会将软件包放入。
需要注意的重要一点是每个python安装都有自己的站点包,其中包安装用于特定的Python版本。换句话说,如果你安装了一些东西,例如/usr/bin/python
,然后~/anaconda/bin/python
无法使用该软件包,因为它安装在不同的Python上!这就是为什么在我们的Twitter交流中,我建议您专注于一个Python安装,并修复您的$PATH
,以便您只使用您想要使用的那个。
还有另一个组件:一些Python软件包捆绑了可以从命令行运行的独立脚本(例如pip
,ipython
,{{1} },jupyter
等。默认情况下,这些可执行文件将放在与用于安装它们的Python相同的相同的目录路径中,并且只能用于 Python安装。
这意味着,在您的系统设置时,当您运行pep8
时,您会获得python
,但是当您运行/usr/bin/python
时,您会获得ipython
与/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython
的Python版本相关联!此外,这意味着运行/Library/Frameworks/Python.framework/Versions/3.5/bin/python
时可以导入的软件包与运行python
或Jupyter笔记本时可以导入的软件包完全分开:您使用两个完全独立的Python安装。
那么如何解决这个问题呢?好吧,首先确保你的ipython
变量正在按照你的意愿行事。您可能有一个名为$PATH
或~/.bash_profile
的启动脚本,用于设置此~/.bashrc
变量。在Windows上,您可以修改特定于用户的环境变量。如果您希望系统以不同的顺序搜索事物,您可以手动修改它。当你第一次安装anaconda / miniconda时,会有一个选项自动执行此操作(将Python添加到PATH中):对此说“是”,然后$PATH
将始终指向python
,这可能是你想要什么。
我们还没有完全脱离水面。你提到在Jupyter笔记本中,你得到了一个内核错误:这表明Jupyter正在寻找一个不存在的Python版本。
Jupyter的设置是为了能够使用各种各样的内核"或代码的执行引擎。这些可以是Python 2,Python 3,R,Julia,Ruby ......有许多可能的内核可供使用。但为了实现这一点,Jupyter需要知道 where 以查找相关的可执行文件:也就是说,它需要知道~/anaconda/python
所在的路径。
这些路径在jupyter的python
中指定,用户可以根据自己的需要进行调整。例如,这是我系统上的内核列表:
kernelspec
其中每个都是一个包含一些元数据的目录,这些元数据指定内核名称,可执行文件的路径以及其他相关信息。
您可以手动调整内核,编辑上面列出的目录中的元数据。
安装内核的命令可能会因内核而异。 IPython依赖于ipykernel package,其中包含安装python内核的命令:例如
$ 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
它将创建与用于运行此命令的Python可执行文件关联的kernelspec。然后,您可以在Jupyter笔记本中选择此内核,以使用该Python运行代码。
您可以使用help命令查看ipykernel提供的其他选项:
$ python -m ipykernel install
注意: anaconda 的最新版本附带了笔记本电脑的扩展程序,如果安装了$ 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.
软件包,它应自动检测各种conda环境。
因此,在此背景下,您的问题很容易解决:
设置ipykernel
,以便首先获得所需的Python版本。例如,您可以运行PATH
来指定(一次)您要使用的Python。要永久执行此操作,请将该行添加到export PATH="/path/to/python/bin:$PATH"
/ .bash_profile
(请注意,anaconda可以在您安装时自动执行此操作)。我建议使用anaconda或miniconda附带的Python:这将允许您.bashrc
所需的所有工具。
确保为那个 python安装了要使用的软件包。如果你正在使用conda,你可以输入,例如conda install
为conda install jupyter matplotlib scikit-learn
安装这些软件包。
确保您的Jupyter内核指向您要使用的Python版本。当您anaconda/bin/python
时,它应自动为conda install jupyter
设置此项。否则,您可以使用anaconda/bin/python
命令或jupyter kernelspec
命令调整现有内核或安装新内核。
要将模块安装到不受Anaconda管理的其他Python Jupyter内核中,您需要复制内核的Python可执行文件的路径并运行python -m ipykernel install
希望明白......祝你好运!
答案 1 :(得分:1)
@jakevdp解释得很好。
更新ubuntu时,我也遇到了同样的问题,我通过更改内核配置文件(kernel.json)来解决了这个问题。 列出内核文件的位置。 使用
jupyter kernelspec list
它将返回
Available kernels:
python3 /home/user1/.local/share/jupyter/kernels/python3
python2 /usr/local/share/jupyter/kernels/python2
我使用的是python3,所以我在处更改了文件
/home/user1/.local/share/jupyter/kernels/python3
通过以下步骤
nano /home/user1/.local/share/jupyter/kernels/python3/kernel.json
里面有
argv
我更改了第一个参数(即python3目录路径)形式
"/usr/bin/python3.5"
到
"/usr/bin/python3"
并保存为
ctr+x
并重新启动了jupyter-notebook。
答案 2 :(得分:0)
还发现不要将您的虚拟环境放入 git repo 中,因为读取 python 包变得不可读。读写时使用的权限似乎不同(写入 - 安装包 - 使用 pip),如何无法读取。因此,对我来说,python 库是从系统安装而不是虚拟环境中读取的。