使用多个Python和IPython路径运行Jupyter

时间:2016-08-17 23:06:13

标签: python ipython jupyter jupyter-notebook

我想使用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/pytho‌n3.5/subprocess.py",
line 947, in init restore_signals, start_new_session)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/pytho‌n3.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' 

我该怎么办?!

3 个答案:

答案 0 :(得分:120)

这很容易解决,但它涉及理解三个不同的概念:

  1. Unix / Linux / OSX如何使用$PATH查找可执行文件(Windows中为%PATH%
  2. Python如何安装和查找软件包
  3. Jupyter如何知道使用什么Python
  4. 为了完整起见,我会尝试对其中的每一个进行快速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/
    

    在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

    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 setup.py installpipconda或类似方法安装软件包时,Python会将软件包放入。

    需要注意的重要一点是每个python安装都有自己的站点包,其中包安装用于特定的Python版本。换句话说,如果你安装了一些东西,例如/usr/bin/python,然后~/anaconda/bin/python 无法使用该软件包,因为它安装在不同的Python上!这就是为什么在我们的Twitter交流中,我建议您专注于一个Python安装,并修复您的$PATH,以便您只使用您想要使用的那个。

    还有另一个组件:一些Python软件包捆绑了可以从命令行运行的独立脚本(例如pipipython,{{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,这可能是你想要什么。

    3。 Jupyter如何知道使用什么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环境。

    总结:修复你的问题

    因此,在此背景下,您的问题很容易解决:

    1. 设置ipykernel,以便首先获得所需的Python版本。例如,您可以运行PATH来指定(一次)您要使用的Python。要永久执行此操作,请将该行添加到export PATH="/path/to/python/bin:$PATH" / .bash_profile(请注意,anaconda可以在您安装时自动执行此操作)。我建议使用anaconda或miniconda附带的Python:这将允许您.bashrc所需的所有工具。

    2. 确保为那个 python安装了要使用的软件包。如果你正在使用conda,你可以输入,例如conda installconda install jupyter matplotlib scikit-learn安装这些软件包。

    3. 确保您的Jupyter内核指向您要使用的Python版本。当您anaconda/bin/python时,它应自动为conda install jupyter设置此项。否则,您可以使用anaconda/bin/python命令或jupyter kernelspec命令调整现有内核或安装新内核。

    4. 要将模块安装到不受Anaconda管理的其他Python Jupyter内核中,您需要复制内核的Python可执行文件的路径并运行python -m ipykernel install

    5. 希望明白......祝你好运!

答案 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 库是从系统安装而不是虚拟环境中读取的。