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 环境?
除了@VikashB 提到的之外,这些还可能是由随pip install --user
. 正如 @TimRoberts 在评论中提到的,site
填充sys.path
变量的模块会搜索类似的路径~/.local/lib/python*/site-packages
。
人们可以通过使用标志( ) 启动 Python 或设置环境变量 PYTHONNOUSERSITEsite
来禁用模块加载此类包(请参阅PEP 370 ):-s
python -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 报告之类的泄漏可能会导致未定义的行为。
为了回答另一个问题,我整理了一个简单的 Conda 包PYTHONNOUSERSITE=1
,它在环境激活时设置变量。还有其他方法可以设置环境变量,但这是一个快速且最小的补丁。
它可以安装:
rm -r ~/.local/lib/python*
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2716 次 |
最近记录: |