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

标签 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' 

我该怎么办?!

最佳答案

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

  • 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 ,因为没有 ipython/usr/bin/ .

    了解您正在使用的可执行文件总是很重要的,尤其是当您的系统上安装了如此多的相同程序时。改变路径并不太复杂;见例如How to permanently set $PATH on Linux? .

    window - How to set environment variables in Windows 10

    2. Python 如何查找包

    当您运行 python 并执行类似 import matplotlib 的操作时,Python要玩类似的游戏才能找到你心目中的包。类似于 $PATH在 unix 中,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 安装包时 Python 放置包的默认位置, 或 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它与 /Library/Frameworks/Python.framework/Versions/3.5/bin/python 处的 Python 版本相关联!此外,这意味着您可以在运行时导入的包 python与运行时可以导入的包完全分开 ipython或 Jupyter 笔记本:您正在使用两个完全独立的 Python 安装。

    那么如何解决这个问题呢?好吧,首先确定您的$PATH变量正在做你想做的事。您可能有一个名为 ~/.bash_profile 的启动脚本。或 ~/.bashrc设置此 $PATH多变的。在 Windows 上,您可以修改用户特定的环境变量。如果您希望系统以不同的顺序搜索内容,您可以手动修改它。当您第一次安装 anaconda/miniconda 时,将有一个选项可以自动执行此操作(将 Python 添加到 PATH):对此说 yes,然后 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 可执行文件相关联的 kernelspec。然后,您可以在 Jupyter Notebook 中选择此内核以使用该 Python 运行您的代码。

    您可以使用 help 命令查看 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您需要的所有工具。
  • 确保为 安装了您要使用的软件包那个 Python。如果您使用的是 conda,则可以键入,例如conda install jupyter matplotlib scikit-learnanaconda/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>

  • 希望这很清楚……祝你好运!

    关于python - 使用多个 Python 和 IPython 路径运行 Jupyter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007571/

    相关文章:

    python - 如何保存<ipython.core.display.image对象>

    ipython - 打开 'ipython notebook' 为 : IPython notebook vs Jupyter

    docker - 部署 jupyterhub 时无法从 config.yaml 运行生命周期命令

    python - Scrapy 和代理

    python - Pandas 在 Windows 终端中绘图

    python - 使用 xarray 在大 dask 数组上重新采样和分组 - 使用 map_blocks?

    python - 无法在 macOS 上的 ipython3 中创建多行语句 block

    jupyter - Jupyter 笔记本的更好命名约定

    Python 打印错误消息 io.UnsupportedOperation : not readable

    Python:检测变量何时超过阈值区间