Conda 环境中出现意外的 Python 路径

dar*_*ber 7 python path conda

在 Conda 环境中(base此处),我对 Python 路径中的目录顺序感到惊讶:

python -c "import sys; print(sys.path)"
['', 
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python37.zip',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/lib-dynload',
'/export/home/db291g/.local/lib/python3.7/site-packages',
'/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages']
Run Code Online (Sandbox Code Playgroud)

如您所见,我本地的非 Conda 路径:

/export/home/db291g/.local/lib/python3.7/site-packages
Run Code Online (Sandbox Code Playgroud)

出现在 Conda 对应项之前:

/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages
Run Code Online (Sandbox Code Playgroud)

这意味着安装在 中的 Python 包miniconda3/lib/python3.7/site-packages如果也在.local/lib/python3.7/site-packages. 事实上,在.local/lib/python3.7/site-packages我有numpyv1.20,但在Conda环境中我需要v1.19,它已正确安装,但被v1.20取代。这似乎违背了使用 Conda 的意义。

我的配置有问题还是我在这里遗漏了一些东西?

一些信息:

which python
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/bin/python

python -V
Python 3.7.12

which conda
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/bin/conda

conda --version
conda 4.11.0
Run Code Online (Sandbox Code Playgroud)

mer*_*erv 10

这是预期行为(请参阅PEP 370),也是Anaconda 建议不要安装用户级软件包的部分原因。

site模块负责设置sys.pathPython 初始化的时间。中的代码在site.py附加前缀站点之前专门附加用户站点,这就是导致这种优先级的原因。根据PEP 370的动机是,用户将在系统级别安装 Python,但希望优先考虑在用户级别安装的包,因此用户站点应在前缀站点之前加载。

选项

有多种选项可以避免加载用户级站点包。

1:环境变量

环境变量PYTHONNOUSERSITE将切换用户级别的加载site-packages。即,

PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"
Run Code Online (Sandbox Code Playgroud)

2:Python-s标志

或者,Python 二进制文件有一个-s参数专门禁用用户级站点包。

python -s -c "import sys; print(sys.path)"
Run Code Online (Sandbox Code Playgroud)

3:删除(并避免将来)用户级安装

Conda 建议完全避免pip install --user,这会被解释为应该~/.local/lib/python*从系统中删除这些文件夹。

4:自动化Conda环境变量

康达锻造包

Conda Forge 包conda-ecosystem-user-package-isolation将在环境激活期间自动设置PYTHONNOUSERSITE=1

如果您希望所有环境默认都具有这种隔离,请考虑将其添加到create_default_packages配置列表中:

conda config --add create_default_packages conda-ecosystem-user-package-isolation
Run Code Online (Sandbox Code Playgroud)

请注意,此包还设置R_LIBS_USER="-",将任何 R 环境与用户级包隔离。

替代套餐

如果您想要更精细的选项,我还创建了单独的软件包,仅设置PYTHONNOUSERSITE=1PYTHONPATH=""环境变量,可以使用以下命令安装:

## set PYTHONNOUSERSITE=1
conda install merv::envvar-pythonnousersite-true

## clear PYTHONPATH
conda install merv::envvar-pythonpath-null
Run Code Online (Sandbox Code Playgroud)

  • @dariober 添加了另一个选项:通过 Conda 包自动设置环境变量。这是我一段时间以来一直想尝试的概念验证。对于那些仍然想要用户站点并想要快速解决方案来隔离其 Conda 环境的人来说可能有用。 (2认同)