问题描述
我已将 jupyter 配置为在远程计算机上使用,并在初始 anaconda 设置时为其设置密码。然后在修复 this issue 后,我被困在另一个。 sys.path
和 sys.executable
在 jupyter 中不正确,但在 python 和 正确强>ipython。请参阅下面的详细信息。 /opt/anaconda3
中的所有用户都安装了 Anaconda3,我的程序使用环境 zud
。
背景
上述问题解决后,我尝试在 jupyter 中 import igraph
但它给出了 ModuleNotFoundError
如下:
import igraph
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-2-73ffca960e68> in <module>
----> 1 import igraph
ModuleNotFoundError: No module named 'igraph'
然后我很快使用我的环境 zud
检查了以下详细信息,这些都是正确的。
(zud) zuddler@silp252-dl360:~$ which python
/home/zuddler/.conda/envs/zud/bin/python
(zud) zuddler@silp252-dl360:~$ which ipython
/home/zuddler/.conda/envs/zud/bin/ipython
(zud) zuddler@silp252-dl360:~$ which jupyter
/home/zuddler/.conda/envs/zud/bin/jupyter
(zud) zuddler@silp252-dl360:~$ which conda
/opt/anaconda3/bin/conda
(zud) zuddler@silp252-dl360:~$ conda env list
# conda environments:
#
zud * /home/zuddler/.conda/envs/zud
base /opt/anaconda3
然后我在 python、ipython 和 jupyter notebook/lab 中检查了 sys.path
和 sys.executable
:
在 Python 中:
>>> import sys
>>> sys.path
['','/home/zuddler/.conda/envs/zud/lib/python39.zip','/home/zuddler/.conda/envs/zud/lib/python3.9','/home/zuddler/.conda/envs/zud/lib/python3.9/lib-dynload','/home/zuddler/.conda/envs/zud/lib/python3.9/site-packages']
>>> sys.executable
'/home/zuddler/.conda/envs/zud/bin/python'
在 ipython 中:
**In [1]: import sys
In [2]: sys.path
Out[2]:
['/home/zuddler/.conda/envs/zud/bin','','/home/zuddler/.conda/envs/zud/lib/python3.9/site-packages','/home/zuddler/.conda/envs/zud/lib/python3.9/site-packages/IPython/extensions','/home/zuddler/.ipython']
In [3]: sys.executable
Out[3]: '/home/zuddler/.conda/envs/zud/bin/python'**
在 Jupyter 笔记本/实验室中:
[1]: import sys
[2]: sys.path
[2]:
['/home/zuddler/python scripts','/opt/anaconda3/lib/python38.zip','/opt/anaconda3/lib/python3.8','/opt/anaconda3/lib/python3.8/lib-dynload','/opt/anaconda3/lib/python3.8/site-packages','/opt/anaconda3/lib/python3.8/site-packages/IPython/extensions','/home/zuddler/.ipython']
[3]: sys.executable
[3]: '/opt/anaconda3/bin/python'
sys.path
和 sys.executable
在 Jupyter Notebook/Lab 中不同,但在 Python 和 ipython 中是正确的。
此外,为了确认当前 jupyter 是否正在运行,我在 jupyter notebook 中运行了 !which jupyter
并收到了 /home/zuddler/.conda/envs/zud/bin/jupyter
,这确认了正确的 jupyter notebook 正在运行。
尝试过的补救措施
补救措施 1:我尝试了提到的 here 和 here 的修复,并在 /home/zuddler/.ipython/profile_default/ipython_config.py
文件中添加了以下行
c.InteractiveShellApp.exec_lines = [
'import sys; sys.path.append("/home/zuddler/.conda/envs/zud/lib/python3.9/site-packages")'
]
然后重新启动 jupyter notebook 并尝试再次导入 igraph 并得到略有不同 ModuleNotFoundError
import igraph
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-2-73ffca960e68> in <module>
----> 1 import igraph
~/.conda/envs/zud/lib/python3.9/site-packages/igraph/__init__.py in <module>
32 # pylint: disable-msg=W0401
33 # W0401: wildcard import
---> 34 from igraph._igraph import *
35 from igraph.clustering import *
36 from igraph.cut import *
ModuleNotFoundError: No module named 'igraph._igraph'
我很快检查了 sys.path
和 sys.executable
:
[1]: sys.path
[1]:
['/home/zuddler/python scripts','/home/zuddler/.ipython','/home/zuddler/.conda/envs/zud/lib/python3.9/site-packages']
[2]: sys.executable
[2]: '/opt/anaconda3/bin/python'
这似乎是一个死胡同,所以我回滚了这个修复。
补救措施 2:我尝试了 fix given on this post 并替换了 kernel.json 中正确的可执行路径
列出的内核是:
(zud) zuddler@silp252-dl360:~$ jupyter kernelspec list
Available kernels:
python3 /opt/anaconda3/share/jupyter/kernels/python3
我在 /opt/anaconda3/share/jupyter/kernels/python3/kernel.json
{
"argv": [
"/opt/anaconda3/bin/python","/home/zuddler/.conda/envs/zud/bin/python",
"-m","ipykernel_launcher","-f","{connection_file}"
],"display_name": "Python 3","language": "python"
}
在那之后,我重新启动了 jupyter notebook/lab 并且它适用于环境 zud
,但我注意到对于 base
环境它导入了 igraph
,它甚至没有安装在base
。我从他们那里检查了以下值,which jupyter
对 base
[1]: !which jupyter
[1]: /opt/anaconda3/bin/jupyter
但它从 sys.path
获取 sys.executable
和 zud
,这意味着每个人都将被迫使用 zud
环境。
[2]: sys.path
[2]:
['/home/zuddler/python scripts','/home/zuddler/.ipython']
[3]: sys.executable
[3]: '/home/zuddler/.conda/envs/zud/bin/python'
这又是一个死胡同,所以我回滚了这个修复。
补救措施 3: 应用 this post 中的以下步骤也没有解决问题,并给出了错误的 sys.path
和 sys.executable
- 从系统中删除 IPython 和 Jupyter
rm -rf ~/.local/share/ipython
- 重新安装 IPython 和 Jupyter
补救措施 4:我尝试按照 this post 中的建议打开 ~/.conda/envs/zud/bin/jupyter lab --no-browser
,但它也给出了错误的 sys.path
和 sys.executable
。
PS:我注意到 this post 也提到了我的一个相关问题,但没有解决。
我将对此进行更多研究,希望能找到解决方案,如果您能提供解决方案,我将不胜感激。
解决方法
这个问题我也有一段时间了。这是我解决它的方法。
创建并进入虚拟环境后,您可能做了类似的事情
pip install ipykernel
ipython kernel install --user --name=myenv
以使其在 jupyter 实验室/笔记本中可见。
在 /home/user/.local/share/jupyter/kernels/myenv/kernel.json
中有这个 ipykernel 映射文件
它应该看起来像这样:
{
"argv": [
"/usr/bin/python3","-m","ipykernel_launcher","-f","{connection_file}"
],"language": "python","display_name": "myenv"
}
这里的问题是虚拟环境python由于某种原因映射到系统python。您想将 python 指针更改为指向您的虚拟环境 python,这类似于 /home/user/.virtualenvs/myenv/bin/python3
。
TL;博士:
cat /home/user/.local/share/jupyter/kernels/myenv/kernel.json
如果里面有/usr/bin/python3
,把它改成/home/user/.virtualenvs/myenv/bin/python3
您可能需要重新启动 Jupyter Lab/Notebook 才能使更改生效。
我不完全理解为什么有时会发生有时不会,但希望此修复程序也能帮助您。