问题描述

        安装Anaconda后,在原环境、base环境和新创建的虚拟环境下使用 pip list 命令时发送混乱,比如在 yolov5_env 虚拟环境下使用 pip list ,会列很多未在该虚拟环境下安装的包。

问题分析

        首先使用  echo $PATH 命令查看环境变量:

(yolov5_env) wu@WP:~$ echo $PATH
/home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/bin:/home/wu/3rdparty/tool/anaconda3/condabin:/opt/ros/noetic/bin:/home/wu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

        /home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/bin 环境变量在最前方,说明在使用 pip 命令时,确实是最先在 /yolov5_env/bin 目录下寻找的可执行文件(包含 二进制可执行文件 和 有执行权限并且在头部指定了解释器的脚本文件),环境变量没有问题。

        使用文本编辑器打开 home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/bin 下的 pip 文件,内容如下:

#!/home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/bin/python3.10
# -*- coding: utf-8 -*-
import re
import sys

from pip._internal.cli.main import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

        该 pip 可执行文件的解释器的路径为  /home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/bin/python3.10,找到该 Python 解释器所在的环境下的默认包存储目录  /home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/lib/python3.10/site-packages (一般在 bin 同级目录的的 lib 目录下)。

        得到该路径后,pip 会在该目录下查找所有后缀为 .dist-info.egg-info 文件夹。通过读取 .dist-info/METADATA.egg-info/PKG-INFO 文件来提取包的相关信息(如包名称、版本、安装路径等)。

        以 numpy 包和 touch 包为例,/home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/lib/python3.10/site-packages/numpy-2.1.3.dist-info/METADATA文件 和 /home/wu/3rdparty/tool/anaconda3/envs/yolov5_env/lib/python3.10/site-packages/torch-2.5.1-py3.10.egg-info/PKG-INFO文件中的内容如下:

        经过检查,这部分也没有问题。 

Metadata-Version: 2.1
Name: numpy
Version: 2.1.3
Summary: Fundamental package for array computing in Python
Author: Travis E. Oliphant et al.
Metadata-Version: 2.1
Name: torch
Version: 2.5.1
Summary: Tensors and Dynamic neural networks in Python with strong GPU acceleration
Home-page: https://pytorch.org/
Download-URL: https://github.com/pytorch/pytorch/tags
Author: PyTorch Team
Author-email: packages@pytorch.org
License: BSD-3-Clause
Keywords: pytorch,machine learning

        打开~/.bashrc 文件查看,发现是因为该文件中包含自动加载 ROS 环境的命令,注释掉该命令,问题解决!

         此时使用 pip list 命令不会列出非该虚拟环境的包。

(yolov5_env) wu@WP:~$ pip list
Package            Version
------------------ ---------
Brotli             1.1.0
certifi            2024.8.30
cffi               1.17.1
charset-normalizer 3.4.0
filelock           3.16.1
gmpy2              2.1.5
h2                 4.1.0
hpack              4.0.0
hyperframe         6.0.1
idna               3.10
Jinja2             3.1.4
MarkupSafe         3.0.2
mpmath             1.3.0
networkx           3.4.2
numpy              2.1.3
pillow             11.0.0
pip                24.3.1
pycparser          2.22
PySocks            1.7.1
PyYAML             6.0.2
requests           2.32.3
setuptools         75.5.0
sympy              1.13.3
torch              2.5.1
torchaudio         2.5.1
torchvision        0.20.1
triton             3.1.0
typing_extensions  4.12.2
urllib3            2.2.3
wheel              0.45.0
zstandard          0.23.0

扩展

1.关于 pip

        pip 是一个与 Python 解释器绑定的工具,它总是基于当前它调用的 Python 解释器所在的环境来工作。

  • 当终端运行 pip list 时,pip 实际上是使用了当前 Python 解释器的路径。
  • 每个 Python 环境都有独立的 site-packages 目录,存储了该环境的包。pip 会根据绑定的 Python 环境找到该目录。

2.关于 dist-packages 和 site-packages

    2.1 /usr/lib/python3/dist-packages

  • 位置:全局目录,通常位于 /usr/lib/python3 下。
  • 用途
    • 用于存放由系统包管理器(如 apt)安装的 Python 包。
    • 例如,通过 sudo apt-get install python3-numpy 安装的包会存放在这里。
  • 特点
    • 由操作系统维护,用户不应手动修改或安装包到此目录。
    • 包版本通常是经过操作系统测试的稳定版本。
    • 系统关键组件(如某些工具或服务)可能依赖这些包。
  • 适用场景
    • 使用系统包管理器安装的包:
      sudo apt-get install python3-package_name
  • 注意事项
    • 不建议手动修改或删除此目录下的文件,可能会导致系统功能失效。
    • 由于系统包管理器管理,这里的包可能不是最新版本。

    2.2/usr/local/lib/python3.8/dist-packages

  • 位置:全局目录,通常位于 /usr/local/lib 下。
  • 用途
    • 用于存放通过手动安装或非系统包管理器安装的全局 Python 包。
    • 例如,使用 pip install 或从源码安装时,可能会将包安装到这里。
  • 特点
    • 对所有用户可用
    • 不由系统包管理器(如 apt)管理。
    • 通常是 pip 的默认全局安装目录(若未使用 --user 参数)。
  • 适用场景
    • 全局安装的软件和库需要供所有用户使用时。
    • 使用管理员权限进行安装:
      sudo pip install package_name
  • 注意事项
    • 包的管理和更新需要小心,以免覆盖系统重要文件或引起版本冲突。

        2.3 /home/<username>/.local/lib/python3.8/site-packages

  • 位置:位于当前用户的主目录下。
  • 用途
    • 用于存放以用户权限安装的 Python 包。
    • 包括使用 pip install --user 安装的包。
  • 特点
    • 只影响当前用户,与系统的其他用户和全局环境无关。
    • 不需要管理员权限即可安装或修改。
    • 避免了对全局环境的干扰。
  • 适用场景
    • 当没有管理员权限或不希望影响系统全局时,使用 --user 参数安装 Python 包:
      pip install --user package_name
  • 优点
    • 独立性强,不会干扰其他用户的包或系统的全局 Python 环境。
    • 更安全,因为修改只限当前用户范围。

        2.4 /usr/local/bin

         /usr/local/bin是 sudo make install 编译安装软件的默认安装目录。

3.符号链接(symbolic link)

        查看符号链接:ls -l

wu@WP:/usr/bin$ ls -l python*
lrwxrwxrwx 1 root root       9 5月  15  2024 python3 -> python3.8
-rwxr-xr-x 1 root root 5478168 9月  12 00:02 python3.8
lrwxrwxrwx 1 root root      33 9月  12 00:02 python3.8-config -> x86_64-linux-gnu-python3.8-config
lrwxrwxrwx 1 root root      16 3月  13  2020 python3-config -> python3.8-config

        解析:

输出解析

lrwxrwxrwx 1 root root 9 5月 15 2024 python3 -> python3.8
  • lrwxrwxrwxl 表示这是一个符号链接(symbolic link)。
  • 1:硬链接数,符号链接通常为 1
  • root root:文件的所有者和所属组。
  • 9:符号链接的长度(目标路径的字符数:python3.8)。
  • 5月 15 2024:最后修改时间。
  • python3 -> python3.8:链接名是 python3,它指向文件 python3.8
-rwxr-xr-x 1 root root 5478168 9月 12 00:02 python3.8
  • -rwxr-xr-x:普通文件,权限为:
    • 所有者(rwx):可读、可写、可执行。
    • 所属组(r-x):可读、可执行,不可写。
    • 其他用户(r-x):可读、可执行,不可写。
  • 5478168:文件大小为 5,478,168 字节(约 5.2 MB)。
  • 9月 12 00:02:最后修改时间。
  • python3.8:文件名。

参考

        anaconda创建新虚拟环境后,pip总是定位到全局Python的pip路径中(无法定位到虚拟环境的pip)

         

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐