conda环境已经访问系统模块,如何防止?

hir*_*hme 4 python anaconda conda

我注意到,当我使用 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
Run Code Online (Sandbox Code Playgroud)

我仍然可以导入它,显然是从系统(用户)安装,在 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'
Run Code Online (Sandbox Code Playgroud)

事实上,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>>> 
Run Code Online (Sandbox Code Playgroud)

Conda 应该使事物保持隔离。这条路是怎么走到这里的,又该如何避免这种情况的发生呢?

更新:

我的用户级 python 是 2.7,我注意到当我使用 python 2.7 创建新的 conda 环境时总是会发生这种行为,这只会自动将 .local/lib/python2.7/site-packages 添加到 PYTHONPATH。

如果我使用 python3.x 创建新的 conda 环境,则不会发生这种情况。

这是否意味着无法为与用户级 python 相同的 python 版本创建单独的隔离 conda 环境?

mer*_*erv 5

除了@VikashB 提到的之外,这些还可能是由随pip install --user. 正如 @TimRoberts 在评论中提到的,site填充sys.path变量的模块会搜索类似的路径~/.local/lib/python*/site-packages

临时选项

人们可以通过使用标志( ) 启动 Python 或设置环境变量 PYTHONNOUSERSITEsite来禁用模块加载此类包(请参阅PEP 370 ):-spython -s

export PYTHONNOUSERSITE=1
python
Run Code Online (Sandbox Code Playgroud)

长期选择

躲藏于site模块

如果出于某种原因需要保留这些包,一种选择是将它们移动到非默认位置,以便模块site找不到它们。例如,

export PYTHONNOUSERSITE=1
python
Run Code Online (Sandbox Code Playgroud)

这将有效地隐藏它们,并且如果需要,它们仍然可以通过 PYTHONPATH 使用。

移动

如果您不需要这些软件包,并且只使用 Conda,那么请考虑删除它们

mkdir ~/.local/lib/py_backup
mv ~/.local/lib/python* ~/.local/lib/py_backup
Run Code Online (Sandbox Code Playgroud)

作为参考,Conda 用户不鼓励使用Conda 文档--user中的标志。Conda 环境假设环境完全隔离,因此诸如 OP 报告之类的泄漏可能会导致未定义的行为。

实验:envvar-pythonnousersite-true

为了回答另一个问题,我整理了一个简单的 Conda 包PYTHONNOUSERSITE=1,它在环境激活时设置变量。还有其他方法可以设置环境变量,但这是一个快速且最小的补丁。

它可以安装:

rm -r ~/.local/lib/python*
Run Code Online (Sandbox Code Playgroud)