【问题标题】:conda environment has access to system modules, how to prevent?conda环境有访问系统模块,如何防止?
【发布时间】: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.pysysconfig.py中添加;也许某些 Conda 版本会定制这些。
  • 检查是否有任何 conda 激活脚本手动将此路径添加到 sys 路径。默认情况下不应该发生这种情况。
  • @hirschme 向 Tim 回答您的问题,Conda 仅查找具有匹配 Python major.minor 版本的那些包。如果您的其他 Conda 环境是 3.x,他们将找不到在用户级别安装的这些 2.7 包。

标签: python anaconda conda


【解决方案1】:

除了what @VikashB mentioned,这些可能是由使用pip install --user 安装的软件包产生的。正如@TimRoberts 在 cmets 中提到的那样,填充sys.path 变量的site 模块默认搜索类似~/.local/lib/python*/site-packages 的路径。

临时选项

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

export PYTHONNOUSERSITE=1
python

长期选择

隐藏site模块

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

mkdir ~/.local/lib/py_backup
mv ~/.local/lib/python* ~/.local/lib/py_backup

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

删除

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

rm -r ~/.local/lib/python*

作为参考,不鼓励 Conda 用户在 the Conda documentation 中使用 --user 标志。 Conda 环境假定环境完全隔离,因此 OP 报告等泄漏可能导致未定义的行为。

实验性:envvar-pythonnousersite-true

为了响应another question,我将a simple Conda package 放在一起,在环境激活时设置PYTHONNOUSERSITE=1 变量。还有其他方法可以设置环境变量,但这是一个快速且最小的补丁。

可以安装:

conda install merv::envvar-pythonnousersite-true

【讨论】:

    【解决方案2】:

    发生这种情况的原因有多种。

    检查您是否有任何activation scripts 手动添加这些路径。

    另一个选项是检查您是否设置了环境变量,例如 PYTHONPATHPYTHONHOME。如果是,请检查它们的设置位置并删除它们。

    您可以在激活的环境中使用conda info -a 来显示所有相关变量/信息。

    【讨论】:

    • 我没有手动添加这些路径的激活脚本,也没有设置任何环境变量,如 PYTHONPATH。我没有自定义或更改干净 conda 安装的任何内容。每次我用 python2 创建一个新的 conda 环境时,它都会自动访问我的用户级 python2.7 包
    • 您可能没有设置它,但您是否在激活 conda 环境后检查它们是否已设置/可用?如果没有任何效果,只需删除该路径中的所有用户级包并让 conda 管理所有 python 版本
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2021-01-09
    • 2016-10-18
    • 2019-01-31
    相关资源
    最近更新 更多