![](/img/trans.png)
[英]ImportError: No module named IPython.paths when running jupyter notebook?
[英]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/python3.5/subprocess.py",
line 947, in init restore_signals, start_new_session)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.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'
我應該怎么辦?!
這很容易解決,但它涉及理解三個不同的概念:
$PATH
查找可執行文件(Windows 中的%PATH%
)為完整起見,我將嘗試對其中的每一個進行快速 ELI5,以便您知道如何以最適合您的方式解決此問題。
當您在提示符下鍵入任何命令(例如, 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 中設置環境變量
當您運行 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 包與您可以從命令行運行的獨立腳本捆綁在一起(例如pip
、 ipython
、 jupyter
、 pep8
等)默認情況下,這些可執行文件將放在同一目錄中路徑作為用於安裝它們的 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
,這可能是您想要的。
我們還沒有完全脫離水面。 您提到在 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
環境。
因此,在這種背景下,您的問題很容易解決:
設置您的PATH
以便所需的 Python 版本是第一個。 例如,您可以運行export PATH="/path/to/python/bin:$PATH"
來指定(一次)您想要使用的 Python。 要永久執行此操作,請將該行添加到您的.bash_profile
/ .bashrc
(請注意,anaconda 可以在您安裝時自動為您執行此操作)。 我建議使用 anaconda 或 miniconda 附帶的 Python:這將允許您 conda conda install
您需要的所有工具。
確保為該python 安裝了要使用的軟件包。 如果你使用 conda,你可以輸入,例如conda install jupyter matplotlib scikit-learn
來安裝anaconda/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>
希望這很清楚……祝你好運!
@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.