conda 环境中的意外 python 路径
Unexpected python paths in conda environment
在 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']
如你所见,我本地的非conda路径:
/export/home/db291g/.local/lib/python3.7/site-packages
在 conda 对应之前:
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages
这意味着如果在 .local/lib/python3.7/site-packages
中找到安装在 miniconda3/lib/python3.7/site-packages
中的软件包,它们将被忽略。事实上,在 .local/lib/python3.7/site-packages
中我有 numpy 1.20,但在 conda 环境中我需要 1.19,它已正确安装但已被 1.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
这是预期的行为(参见 PEP 370) and partially why Anaconda recommended against user-level package installations。
The site
module is responsible for setting the sys.path
when Python is initializing. The code in site.py
specifically appends the user site prior to appending the prefix site, which is what leads to this prioritization. The motivation according to PEP 370 是用户会在 system-level 安装 Python,但希望优先安装他们在用户级别安装的软件包,因此用户站点应该在前缀站点。
选项
有几个选项可以避免 user-level site-packages 被加载。
1: 环境变量
环境变量 PYTHONNOUSERSITE
将切换 user-level site-packages
的加载。即,
PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"
2: Python -s
标志
或者,Python 二进制文件有一个 -s
参数来专门禁用 user-level 站点包。
python -s -c "import sys; print(sys.path)"
3:删除(并避免将来)user-level 安装
The Conda recommendation 是为了完全避免 pip install --user
,这将被解释为应该从系统中删除 ~/.local/lib/python*
文件夹。
4: 自动化 Conda 环境变量
Conda Forge 包
The Conda Forge package conda-ecosystem-user-package-isolation
会在环境激活时自动设置PYTHONNOUSERSITE=1
。
如果您希望所有环境默认都具有这种隔离,请考虑将其添加到 create_default_packages
配置列表中:
conda config --add create_default_packages conda-ecosystem-user-package-isolation
请注意,此包还设置 R_LIBS_USER="-"
,将任何 R 环境与 user-level 包隔离。
备选套餐
如果您想要更精细的选项,我还创建了仅设置 PYTHONNOUSERSITE=1
and PYTHONPATH=""
环境变量的单独软件包,可以通过以下方式安装:
## set PYTHONNOUSERSITE=1
conda install merv::envvar-pythonnousersite-true
## clear PYTHONPATH
conda install merv::envvar-pythonpath-null
在 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']
如你所见,我本地的非conda路径:
/export/home/db291g/.local/lib/python3.7/site-packages
在 conda 对应之前:
/export/projects/III-data/wcmp_bioinformatics/db291g/miniconda3/lib/python3.7/site-packages
这意味着如果在 .local/lib/python3.7/site-packages
中找到安装在 miniconda3/lib/python3.7/site-packages
中的软件包,它们将被忽略。事实上,在 .local/lib/python3.7/site-packages
中我有 numpy 1.20,但在 conda 环境中我需要 1.19,它已正确安装但已被 1.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
这是预期的行为(参见 PEP 370) and partially why Anaconda recommended against user-level package installations。
The site
module is responsible for setting the sys.path
when Python is initializing. The code in site.py
specifically appends the user site prior to appending the prefix site, which is what leads to this prioritization. The motivation according to PEP 370 是用户会在 system-level 安装 Python,但希望优先安装他们在用户级别安装的软件包,因此用户站点应该在前缀站点。
选项
有几个选项可以避免 user-level site-packages 被加载。
1: 环境变量
环境变量 PYTHONNOUSERSITE
将切换 user-level site-packages
的加载。即,
PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"
2: Python -s
标志
或者,Python 二进制文件有一个 -s
参数来专门禁用 user-level 站点包。
python -s -c "import sys; print(sys.path)"
3:删除(并避免将来)user-level 安装
The Conda recommendation 是为了完全避免 pip install --user
,这将被解释为应该从系统中删除 ~/.local/lib/python*
文件夹。
4: 自动化 Conda 环境变量
Conda Forge 包
The Conda Forge package conda-ecosystem-user-package-isolation
会在环境激活时自动设置PYTHONNOUSERSITE=1
。
如果您希望所有环境默认都具有这种隔离,请考虑将其添加到 create_default_packages
配置列表中:
conda config --add create_default_packages conda-ecosystem-user-package-isolation
请注意,此包还设置 R_LIBS_USER="-"
,将任何 R 环境与 user-level 包隔离。
备选套餐
如果您想要更精细的选项,我还创建了仅设置 PYTHONNOUSERSITE=1
and PYTHONPATH=""
环境变量的单独软件包,可以通过以下方式安装:
## set PYTHONNOUSERSITE=1
conda install merv::envvar-pythonnousersite-true
## clear PYTHONPATH
conda install merv::envvar-pythonpath-null