【问题标题】:Running Jupyter with multiple Python and IPython paths使用多个 Python 和 IPython 路径运行 Jupyter
【发布时间】:2016-12-24 18:10:20
【问题描述】:

我想使用 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' 

我该怎么办?!

【问题讨论】:

  • 错误的完整回溯是什么?

标签: python ipython jupyter jupyter-notebook


【解决方案1】:

这很容易解决,但需要理解三个不同的概念:

  1. Unix/Linux/OSX 如何使用$PATH 查找可执行文件(Windows 中为%PATH%
  2. Python 如何安装和查找包
  3. 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 包与可以从命令行运行的独立脚本捆绑在一起(例如pipipythonjupyterpep8 等)默认情况下,这些可执行文件将与用于安装它们的 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 环境。

总结:解决您的问题

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

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

  2. 确保为 that python 安装了您要使用的软件包。如果你使用 conda,你可以输入,例如conda install jupyter matplotlib scikit-learnanaconda/bin/python 安装这些软件包。

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

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

希望这很清楚......祝你好运!

【讨论】:

  • 这是一个很好的答案。感谢您花时间编写它。
  • 在我的 Mac 上,解决所有 jupyter、ipython 相关问题的唯一方法是在我的 bashrc 中添加 /Library/Frameworks/Python.framework/Versions/3.5/bin/。谢谢
  • 仅供参考,我也必须运行pip3 install ipykernel
  • 我不清楚的一点是:问题是关于如何将 不同 Python 的内核安装到 Jupyter 中。因此,如果您只是运行python -m ipykernel install,那么它只会重新安装已添加的相同 Python,而如果您将 python 替换为您要添加的另一个 Python 的路径,我认为它会很难找到 Jupyter (因为 Jupyter 已安装到第一个 Python 中)。我错过了什么吗?
  • 哦,我想我在之前的评论中找到了我的问题的答案。看起来内核规范存储在全局位置,而不仅仅是在运行的特定 Python 的某些配置中。因此,您需要该 Python 中的 ipykernel 才能运行安装脚本,但它会转到全局可见的位置。就我而言,我使用--prefix /usr/local 运行,它进入/usr/local/share/jupyter/kernels/[kernel name chosen with name parameter]
【解决方案2】:

@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。

【讨论】:

    【解决方案3】:

    还发现不要将您的虚拟环境放在 git repo 中,因为读取 python 包变得不可读。读取和写入时使用的权限似乎不同(写入 - 安装包 - 使用 pip),如何无法读取。因此,对我来说,python 库是从系统安装而不是虚拟环境中读取的。

    【讨论】:

      【解决方案4】:

      @jakevdp 上面的答案和他的博客https://jakevdp.github.io/blog/2017/12/05/installing-python-packages-from-jupyter/ 给出了关于出了什么问题的相当好的想法,但是仅仅从 shell 更新路径对我不起作用,有两种方法对我有用

      使用魔术命令在笔记本上更新路径,在单元格上运行以下

      originalPath = %env PATH
      %env PATH = [local anaconda path]/kernels/[custom_kernel]/bin/:$originalPath
      

      或者您甚至可以更新 kernel.json 并在 env 中设置路径

      {
          "argv": [
              "[custom kernel path]/bin/python",
              "-m",
              "ipykernel_launcher",
              "-f",
              "{connection_file}"
          ],
          "env": {
              "PATH": "[custom kernel path]/bin/:[rest of the paths]"
          },
      
          "display_name": "custom_kerbel",
      
          "language": "python"
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-11
        • 2016-06-09
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 2017-12-14
        • 2017-08-19
        相关资源
        最近更新 更多