簡體   English   中英

使用多個 Python 和 IPython 路徑運行 Jupyter

[英]Running Jupyter with multiple Python and IPython paths

我想使用 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 時,我收到 Kernel 錯誤:

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' 

我應該怎么辦?!

這很容易解決,但它涉及理解三個不同的概念:

  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/

在 Windows 中echo %path%

可能還穿插了一些其他路徑。 這意味着當您鍵入python ,系統將轉到/usr/bin/python 當您輸入ipython ,在本例中,系統將轉到/Library/Frameworks/Python.framework/Versions/3.5/bin/ipython ,因為/usr/bin/沒有ipython

了解您正在使用的可執行文件總是很重要的,尤其是當您的系統上安裝了如此多的相同程序時。 改變路徑並不太復雜; 參見例如如何在 Linux 上永久設置 $PATH? .

Windows - 如何在 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 安裝都有自己的 site-packages ,其中安裝了針對特定 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 notebook 時可以導入的包完全分開:您正在使用兩個完全獨立的 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 包,其中包含安裝 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包,它應該會自動檢測您的各種ipykernel環境。

總結:解決您的問題

因此,在這種背景下,您的問題很容易解決:

  1. 設置您的PATH以便所需的 Python 版本是第一個。 例如,您可以運行export PATH="/path/to/python/bin:$PATH"來指定(一次)您想要使用的 Python。 要永久執行此操作,請將該行添加到您的.bash_profile / .bashrc (請注意,anaconda 可以在您安裝時自動為您執行此操作)。 我建議使用 anaconda 或 miniconda 附帶的 Python:這將允許您 conda 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>

希望這很清楚……祝你好運!

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

還發現不要將您的虛擬環境放在 git repo 中,因為讀取 python 包變得不可讀。 讀寫時使用的權限似乎不同(寫入 - 安裝包 - 使用 pip),如何無法讀取。 因此,對我來說,python 庫是從系統安裝而不是虛擬環境中讀取的。

@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"
}

如果您只想將 package 安裝到當前環境中以便能夠導入它,您可以使用%pip%conda conda 魔法。

正如您提到的 anaconda,您可能應該使用conda安裝:

# Install a conda package in the current Jupyter kernel
%conda install <dependency_name>

或者,如果您需要使用pip

# Install a pip package in the current Jupyter kernel
%pip install <python_package_name>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM