【发布时间】:2021-05-11 22:42:42
【问题描述】:
我注意到,当我使用 conda 创建新环境时,我可以在该环境中导入未安装的 python 模块。
以 keras 为例: 虽然模块不在那个环境中:
(py2) user@user-Precision-7920-Tower:~$ conda list keras
# packages in environment at /home/user/anaconda3/envs/py2:
#
# Name Version Build Channel
我仍然可以导入它,显然是从系统(用户)安装,在 conda 之外!
(py2) user@user-Precision-7920-Tower:~$ python
Python 2.7.15 | packaged by conda-forge | (default, Mar 5 2020, 14:56:06)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import keras
Using TensorFlow backend.
>>> keras.__file__
'/home/user/.local/lib/python2.7/site-packages/keras/__init__.pyc'
其实conda里面的python是可以访问非conda路径的!
>>> import sys
>>>
>>> sys.stdout.write("\n".join(sys.path))
/home/user/anaconda3/envs/py2/lib/python27.zip
/home/user/anaconda3/envs/py2/lib/python2.7
/home/user/anaconda3/envs/py2/lib/python2.7/plat-linux2
/home/user/anaconda3/envs/py2/lib/python2.7/lib-tk
/home/user/anaconda3/envs/py2/lib/python2.7/lib-old
/home/user/anaconda3/envs/py2/lib/python2.7/lib-dynload
/home/user/.local/lib/python2.7/site-packages <--
/home/user/anaconda3/envs/py2/lib/python2.7/site-packages>>>
Conda 应该保持隔离。这条路是怎么走到这里的,如何避免这种情况发生?
更新:
我的用户级 python 是 2.7,我注意到当我使用 python 2.7 创建新的 conda 环境时总是会发生这种行为,这只是自动将 .local/lib/python2.7/site-packages 添加到 PYTHONPATH。
如果我使用 python3.x 创建新的 conda 环境,则不会发生这种情况。
这是否意味着不能为与用户级 python 相同的 python 版本创建单独的隔离 conda 环境?
【问题讨论】:
-
“隔离”主要是为了防止 Conda 安装的软件包泄漏。 Python 总是在
.local中查找模块。这些是用户本地包,而不是系统范围的。我想您可以编写一个site.py将其从路径中删除,但这似乎适得其反。 -
@TimRoberts 但如果该路径始终存在,我们总是可以从 conda 环境之外导入模块,通常情况并非如此,对吧?我看到我的大多数 conda env 在环境中没有 .local 路径,所以这似乎是一个例外
-
我不知道 Conda 的详细信息。
.local在 Python 2.6 中添加。在site.py和sysconfig.py中添加;也许某些 Conda 版本会定制这些。 -
检查是否有任何 conda 激活脚本手动将此路径添加到 sys 路径。默认情况下不应该发生这种情况。
-
@hirschme 向 Tim 回答您的问题,Conda 仅查找具有匹配 Python major.minor 版本的那些包。如果您的其他 Conda 环境是 3.x,他们将找不到在用户级别安装的这些 2.7 包。