jupyter 中的 sys.path 和 sys.executable 不正确,但应用的修复不起作用

the*_*ngh 6 python ipython sys jupyter jupyter-notebook

我已将 jupyter 配置为从远程计算机使用,并在初始 anaconda 设置时为其设置密码。然后解决这个问题后,我又陷入了另一个问题。在jupyter中不正确sys.pathsys.executable但在pythonipython正确。请参阅下面的详细信息。Anaconda3 已为所有用户安装,并且我正在为我的程序使用一个环境。/opt/anaconda3zud

背景

解决上述问题后,我尝试import igraphjupyter中进行操作,但结果ModuleNotFoundError如下:

import igraph
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-2-73ffca960e68> in <module>
----> 1 import igraph

ModuleNotFoundError: No module named 'igraph'
Run Code Online (Sandbox Code Playgroud)

然后我很快使用我的环境检查了以下详细信息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
Run Code Online (Sandbox Code Playgroud)

然后我检查了sys.pathpython ipythonjupyter notebook/labsys.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'
Run Code Online (Sandbox Code Playgroud)

在 ipython 中:

**In [1]: import sys

In [2]: sys.path
Out[2]:
['/home/zuddler/.conda/envs/zud/bin',
 '/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',
 '/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'**
Run Code Online (Sandbox Code Playgroud)

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

sys.pathsys.executableJupyter Notebook/Lab中不同,但在Pythonipython中是正确的。

另外,为了确认当前的 jupyter 是否正在运行,我!which jupyter在 jupyter 笔记本中运行并收到/home/zuddler/.conda/envs/zud/bin/jupyter确认正确的 jupyter 笔记本正在运行的信息。

尝试过的补救措施

补救措施 1:我尝试了此处此处提到的修复,并在/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")'
]
Run Code Online (Sandbox Code Playgroud)

然后重新启动jupyter笔记本并尝试再次导入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'
Run Code Online (Sandbox Code Playgroud)

我很快检查了sys.path一下sys.executable

[1]: sys.path
[1]:
['/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',
 '/home/zuddler/.conda/envs/zud/lib/python3.9/site-packages']
[2]: sys.executable
[2]: '/opt/anaconda3/bin/python'
Run Code Online (Sandbox Code Playgroud)

这似乎是一个死胡同,所以我回滚了这个修复。

补救措施 2:我尝试了这篇文章中给出的修复,并替换了 kernel.json 中正确的可执行路径

列出的内核有:

(zud) zuddler@silp252-dl360:~$ jupyter kernelspec list
Available kernels:
  python3    /opt/anaconda3/share/jupyter/kernels/python3
Run Code Online (Sandbox Code Playgroud)

我做了以下更改/opt/anaconda3/share/jupyter/kernels/python3/kernel.json

{
"argv": [
Run Code Online (Sandbox Code Playgroud)
“/opt/anaconda3/bin/python”,“/home/zuddler/.conda/envs/zud/bin/python”,
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Python 3",
"language": "python"
}
Run Code Online (Sandbox Code Playgroud)

之后,我重新启动了 jupyter 笔记本/实验室,它适用于环境zud,但我注意到,对于base它导入的环境igraph,它甚至没有安装在base. 我从他们那里检查了以下值,which jupyter是正确的base

[1]: !which jupyter
[1]: /opt/anaconda3/bin/jupyter
Run Code Online (Sandbox Code Playgroud)

但它正在回升,sys.path这意味着每个人都将被迫使用环境。sys.executablezudzud

[2]: sys.path
[2]:
['/home/zuddler/python scripts',
 '/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',
 '/home/zuddler/.conda/envs/zud/lib/python3.9/site-packages/IPython/extensions',
 '/home/zuddler/.ipython']
[3]: sys.executable
[3]: '/home/zuddler/.conda/envs/zud/bin/python'
Run Code Online (Sandbox Code Playgroud)

这又是一个死胡同,所以我回滚了这个修复。

补救措施 3:应用这篇文章中的以下步骤也没有解决问题,并给出了错误sys.pathsys.executable

  1. 从系统中删除 IPython 和 Jupyter
  2. rm -rf ~/.local/share/ipython
  3. 重新安装 IPython 和 Jupyter

补救措施4:我尝试~/.conda/envs/zud/bin/jupyter lab --no-browser按照这篇文章中的建议打开,但它也给出了错误sys.pathsys.executable

其他补救措施:我读过这篇文章,但没有找到解决方案。

PS:我注意到这篇文章也提到了一个与我相关的问题,但没有得到解决。

我将对此进行更多研究,希望找到解决方案,如果您能提供解决方案,我将不胜感激。

小智 4

我也遇到这个问题有一段时间了。这是我解决问题的方法。

创建并进入虚拟环境后,您可能会执行以下操作

pip install ipykernel

ipython kernel install --user --name=myenv为了使其在 jupyter 实验室/笔记本中可见。

这个 ipykernel 映射文件位于/home/user/.local/share/jupyter/kernels/myenv/kernel.json

它应该看起来像这样:

{
 "argv": [
  "/usr/bin/python3",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "language": "python",
 "display_name": "myenv"
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是虚拟环境 python 由于某种原因映射到系统 python。您想要更改 python 指针以指向您的虚拟环境 python,这类似于/home/user/.virtualenvs/myenv/bin/python3.

长话短说:

cat /home/user/.local/share/jupyter/kernels/myenv/kernel.json
Run Code Online (Sandbox Code Playgroud)

如果/usr/bin/python3里面有,则将其更改为/home/user/.virtualenvs/myenv/bin/python3

您可能需要重新启动 Jupyter Lab/Notebook 才能使更改生效。

我不完全理解为什么有时会发生有时不会,但希望这个修复也能对您有所帮助。