这是预期的行为(请参阅PEP 370 https://www.python.org/dev/peps/pep-0370/)以及部分原因Anaconda 建议不要安装用户级包 https://www.anaconda.com/blog/using-pip-in-a-conda-environment.
The site module https://docs.python.org/3/library/site.html#module-site负责设置sys.path
当Python初始化时。代码在site.py https://github.com/python/cpython/blob/e480def027b68a570dc0c2e235463842373dc741/Lib/site.py#L603在附加前缀站点之前专门附加用户站点,这就是导致这种优先级的原因。动机根据PEP 370 https://www.python.org/dev/peps/pep-0370/是用户将在系统级别安装Python,但希望优先考虑在用户级别安装的包,因此用户站点应在前缀站点之前加载。
Options
有多种选项可以避免加载用户级站点包。
1:环境变量
环境变量PYTHONNOUSERSITE
将切换用户级别的加载site-packages
。即,
PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"
2:Python-s
flag
或者,Python 二进制文件有一个-s
专门禁用用户级站点包的参数。
python -s -c "import sys; print(sys.path)"
3:删除(并避免将来)用户级安装
康达建议 https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#using-pip-in-an-environment是为了避免pip install --user
完全,这将被解释为应该删除~/.local/lib/python*
系统中的文件夹。
4:自动化Conda环境变量
康达锻造包
Conda Forge 包conda-ecosystem-user-package-isolation https://github.com/conda-forge/conda-ecosystem-user-package-isolation-feedstock会自动设置PYTHONNOUSERSITE=1
在环境激活期间。
如果您希望所有环境默认都具有这种隔离,请考虑将其添加到create_default_packages
配置清单:
conda config --add create_default_packages conda-ecosystem-user-package-isolation
请注意,这个包还设置了R_LIBS_USER="-"
,将任何 R 环境与用户级包隔离。
替代套餐
如果您想要更精细的选项,我还创建了单独的包,仅设置PYTHONNOUSERSITE=1 https://github.com/mfansler/envvar-pythonnousersite-true and PYTHONPATH="" https://github.com/mfansler/envvar-pythonpath-null环境变量,可以通过以下方式安装:
## set PYTHONNOUSERSITE=1
conda install merv::envvar-pythonnousersite-true
## clear PYTHONPATH
conda install merv::envvar-pythonpath-null