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

npr*_*oss 41 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
Run Code Online (Sandbox Code Playgroud)

我曾经有过anaconda,但是从〜/ anaconda目录中删除了.现在,当我启动一个Jupyter笔记本时,我得到一个内核错误:

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' 
Run Code Online (Sandbox Code Playgroud)

我该怎么办?!

jak*_*vdp 133

这很容易修复,但它涉及到三个不同的概念:

  1. Unix/Linux/OSX如何$PATH用于查找可执行文件(%PATH%在Windows中)
  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/
Run Code Online (Sandbox Code Playgroud)

在窗户中 echo %path%

可能还有一些其他路径穿插.这意味着当您键入时python,系统将转到/usr/bin/python.当您键入ipython,在这个例子中,系统会去/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython,因为没有ipython/usr/bin/.

了解您正在使用的可执行文件始终很重要,尤其是当您在系统上安装了相同程序的这么多时.改变路径不是太复杂; 请参阅例如如何在Linux上永久设置$ PATH?.

Windows - 如何在Windows 10中设置环境变量

2. Python如何找到包

当你运行python并做类似的事情时import matplotlib,Python必须玩类似的游戏来找到你想到的包.与$PATHunix 类似,Python有sys.path指定这些:

$ python
>>> import sys
>>> sys.path
['',
 '/Users/jakevdp/anaconda/lib/python3.5', 
 '/Users/jakevdp/anaconda/lib/python3.5/site-packages',
 ...]
Run Code Online (Sandbox Code Playgroud)

一些重要的事情:默认情况下,第一个条目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版本相关联的内容/Library/Frameworks/Python.framework/Versions/3.5/bin/python!此外,这意味着您在运行时可以导入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
Run Code Online (Sandbox Code Playgroud)

其中每个都是一个包含一些元数据的目录,这些元数据指定了内核名称,可执行文件的路径以及其他相关信息.
您可以手动调整内核,编辑上面列出的目录中的元数据.

安装内核的命令可以根据内核而改变.IPython依赖于ipykernel包,它包含一个安装python内核的命令:例如

$  python -m ipykernel install
Run Code Online (Sandbox Code Playgroud)

它将创建与用于运行此命令的Python可执行文件关联的kernelspec.然后,您可以在Jupyter笔记本中选择此内核,以使用该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.
Run Code Online (Sandbox Code Playgroud)

注意:最近版本的anaconda附带了笔记本电脑的扩展,如果ipykernel安装了软件包,它将自动检测你的各种conda环境.

总结:解决您的问题

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

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

  2. 确保为该 python 安装了要使用的包.如果你正在使用conda,你可以输入,例如conda install jupyter matplotlib scikit-learn安装这些包anaconda/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>

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

  • 这是一个很好的答案。感谢您抽出宝贵的时间来编写它。 (2认同)
  • 对我来说这个命令有效:``python -m ipykernel install --user`` (2认同)

小智 9

@jakevdp解释得很好。

当我更新我的 ubuntu 时,我也遇到了同样的问题,我通过更改内核配置文件(kernel.json)解决了它。列出内核文件位置。使用

jupyter kernelspec list
Run Code Online (Sandbox Code Playgroud)

它会返回

Available kernels:
  python3    /home/user1/.local/share/jupyter/kernels/python3
  python2    /usr/local/share/jupyter/kernels/python2
Run Code Online (Sandbox Code Playgroud)

我使用的是 python3 所以我更改了文件

/home/user1/.local/share/jupyter/kernels/python3
Run Code Online (Sandbox Code Playgroud)

通过以下步骤

nano /home/user1/.local/share/jupyter/kernels/python3/kernel.json
Run Code Online (Sandbox Code Playgroud)

在里面 argv 我改变了第一个参数(即python3目录路径)形式

"/usr/bin/python3.5"
Run Code Online (Sandbox Code Playgroud)

"/usr/bin/python3"
Run Code Online (Sandbox Code Playgroud)

并保存 ctr+x 并重新启动 jupyter-notebook。