在 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,但希望优先考虑在用户级别安装的包,因此用户站点应在前缀站点之前加载。
有多种选项可以避免加载用户级站点包。
环境变量PYTHONNOUSERSITE将切换用户级别的加载site-packages。即,
PYTHONNOUSERSITE=1 python -c "import sys; print(sys.path)"
Run Code Online (Sandbox Code Playgroud)
-s标志或者,Python 二进制文件有一个-s参数专门禁用用户级站点包。
python -s -c "import sys; print(sys.path)"
Run Code Online (Sandbox Code Playgroud)
Conda 建议完全避免pip install --user,这会被解释为应该~/.local/lib/python*从系统中删除这些文件夹。
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=1和PYTHONPATH=""环境变量,可以使用以下命令安装:
## set PYTHONNOUSERSITE=1
conda install merv::envvar-pythonnousersite-true
## clear PYTHONPATH
conda install merv::envvar-pythonpath-null
Run Code Online (Sandbox Code Playgroud)