conda环境配置、pip安装位置问题与解决
零、踩坑问题汇总
- 在conda虚拟环境里使用pip, 并没有安装在虚拟环境目录下, 而是安装到了全局目录下;
- Pycharm创建不了conda环境, 点击没反应, 日志里报错
CondaPythonLegacy - Can't find python path to use, will use conda run instead
; - 多个环境使用相同版本的python, conda默认使用硬链接,
site.py
文件改动后影响多个虚拟环境。
一、安装与设置记录
-
下载安装miniconda
-
修改pip源: 在用户目录下新建
pip/pip.ini
, 内容是
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
- 修改conda源: 在用户目录下新建
.condarc
, 内容参考 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/, 如下
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
deepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
- 环境设置
这一步是为了解决在conda环境中使用pip安装位置的问题, 详见下文。
# conda默认使用了hardlink,如果同时使用conda和pip的情况下,我个人建议加上 --copy 选项
conda create --copy -n envname python=3.9 # 建议用普通用户权限执行, env存放位置在用户目录. 否则会装到系统目录下
查看conda环境安装位置
conda config --show # 或 conda info
打开新建环境下的lib文件夹的site.py
文件(C:\Users\username\.conda\envs\conda_env\Lib\site.py
), 找到USER_SITE
、USER_BASE
那两行, 默认是None
, 修改后如下:
USER_SITE = r"C:\Users\username\.conda\envs\conda_env\Lib\site-packages"
USER_BASE = r"C:\Users\username\.conda\envs\conda_env\Scripts"
记得加上r
抑制转义, 否则有可能因为非法转义报错, 导致进入不了虚拟环境。
二、问题与解决
- pip将软件包安装在了全局目录?
最初在使用conda时, 我发现在conda环境中使用pip
命令, 其安装位置并不是在env里(预期应该在C:\Users\username\.conda\envs\conda_env\Lib\site-packages
, 实际却安装到了全局的用户目录下)。
经过一番学习, 我搞明白了这段逻辑:
-
影响pip安装位置的设置在
Lib\site.py
文件里, 其中USER_SITE
、USER_BASE
两个变量分别指向了pip安装位置
和命令所在目录
, 默认是None, 就会找到全局设置。 -
首次用
conda create -n envname python=3.9
命令创建虚拟环境时, conda会下载一个对应版本的python3.9放在pkg目录下(C:\Users\username\.conda\pkgs\python-3.9.18-h1aa4202_0
), 每次新建该版本的python环境时, 就会从这里继承设置(USER_SITE
、USER_BASE
是None
), 导致pip安装位置指向了全局位置。
所以很简单, 把这两个变量改成虚拟环境中的安装位置就好了。
USER_SITE = r"C:\Users\username\.conda\envs\conda_env\Lib\site-packages"
USER_BASE = r"C:\Users\username\.conda\envs\conda_env\Scripts"
- Pycharm新建环境没反应,
conda create
命令也报错, pycharm日志报CondaPythonLegacy - Can’t find python path to use, will use conda run instead ?
因为前面的USER_SITE
、USER_BASE
反斜杠出现了错误转义, 所以执行到这里就报错了。
这些都正常, 最坑的是pycharm不报错, 一直点击没反应。直到我看了Pycahrm日志, 有一行报错:
CondaPythonLegacy - Can’t find python path to use, will use conda run instead
解决:在那两行修改前面中上r
, 抑制转义就好了。
- 两个python3.9环境, 共享了同一份
site.py
?
前面的设置我正常用了很久, 直到后来我建了两个python3.9的环境, 按照惯例也修改env2
的site.py
, 之后神奇地发现修改env2
的site.py
, 另一个env1
的site.py
也跟着变了, 按文件修改记录查了一下, C:\Users\username\.conda\pkgs\python-3.9.18-h1aa4202_0
也跟着变了!
怀疑这三个文件是同一个文件。用软件打开看看, 果然是硬链接:
上conda文档看了看, 确认了就是这个原因。
解决办法:在conda create
命令后加上--copy
选项, 直接拷贝而不使用链接。
缺点就是占点磁盘。
也不是大问题。
三、总结
我认为这确实是个麻烦, 不知道为什么conda官方不改善一下。
如果conda和pip不混着用, 就没有这些麻烦了, 但现实很多时候不得不混用。
每次创建新环境先手动修改, 记住就好了。