conda list 默认显示当前环境包名、版本、构建号和channel来源,但pip安装的包仅标为pypi且无构建信息;混用conda与pip易导致环境不可复现,应优先用conda env export导出环境。

conda list 能列出所有包,但默认不显示安装来源
直接运行 conda list 是最常用方式,它会输出当前激活环境中的全部包名、版本、构建号和 channel 来源(比如 defaults 或 conda-forge)。但注意:如果某包是用 pip install 装的,它的 channel 列会显示为 pypi,且构建信息为空——这不是 bug,而是 Conda 的设计行为。
常见错误现象:执行 conda env export 后发现某些包没被导出,或者别人复现环境时报错缺包。根源往往就是混用了 pip 安装,而 conda list 本身不会警告你这点。
- 想快速过滤某个包,用
conda list | grep numpy(Linux/macOS)或conda list | findstr numpy(Windows) - 要查看包是否来自 conda-forge,重点看最后一列;若为空或为
pypi,说明不是通过 conda 安装的 - 避免在同一个环境中反复混用
conda install和pip install,尤其在需要导出可复现环境时
pip list 和 conda list 结果不一致?这是正常现象
pip list 只管 Python 包层级,不管底层依赖(如 CUDA、OpenMP),而 conda list 还会列出编译器、BLAS 实现、CUDA toolkit 等二进制依赖。比如你在 PyTorch-CUDA 镜像里运行两个命令,conda list 会显示 cudatoolkit 和 numpy,但 pip list 通常只显示后者。
使用场景差异明显:
- 调试 import 失败时,先跑
pip list确认 Python 模块是否存在 - 排查 CUDA 不可用、BLAS 性能差等问题,必须看
conda list中的cudatoolkit、openblas等项 - CI/CD 流水线中导出环境配置,应以
conda env export为准,而非pip freeze
conda list -n myenv 查指定环境比激活再查更安全
很多人习惯先 conda activate myenv 再 conda list,但如果你脚本里忘了 activate,或者终端窗口切换错了环境,结果就查偏了。直接加 -n 参数指定环境名,既明确又无副作用。
参数差异要注意:
-
conda list -n base查 root 环境(即使当前没激活) -
conda list -n myenv --revisions不起作用——--revisions只对conda list无参时有效,用于回溯历史安装状态 - 想导出干净的包列表(不含 build 字段),用
conda list --export > requirements.txt,但注意它仍会包含pypi包,需手动清理
conda info package_name 是查包元数据的唯一可靠方式
当 conda list 显示某个包存在,但 import 仍失败,或者版本看起来对不上,就该用 conda info。它读的是 conda-meta 目录下的 JSON 文件,比 conda list 更底层,能确认包是否真正被 Conda 管理、安装路径在哪、依赖了哪些其他包。
例如:conda info pytorch 会告诉你它链接的是哪个 CUDA 版本、是否与当前 cudatoolkit 兼容、安装路径是否在 site-packages 下——这些信息在 conda list 里完全看不到。
- 若输出为空,说明该包根本不在 Conda 的包管理系统中(很可能是 pip 装的)
- 输出里的
files字段能帮你定位__init__.py实际位置,对调试路径问题极有用 - 不要依赖
python -c "import pkg; print(pkg.__version__)"来验证版本,因为可能从非当前环境的 site-packages 导入
conda list 和 pip list 的覆盖范围不同,且二者没有自动同步机制**。一个环境里同时存在 conda 安装的 numpy 和 pip 安装的 numpy,Conda 不会报错,但 import 时加载的是谁,取决于 sys.path 顺序——这个顺序又受 PYTHONPATH、.pth 文件、site-packages 排序影响,非常隐蔽。











