有一次遇到了一个不管在什么Python路径下,使用pip list都会出现一个系统目录下的所有的python源的问题,反复使用anaconda安装和卸载环境也不好用

发现问题的过程:

正常的python -m site输出

1
2
3
4
5
6
7
8
9
10
11
> python -m site # base环境下  
sys.path = [
   '/home/tipriest',
   '/home/tipriest/anaconda3/lib/python311.zip',
   '/home/tipriest/anaconda3/lib/python3.11',
   '/home/tipriest/anaconda3/lib/python3.11/lib-dynload',
   '/home/tipriest/anaconda3/lib/python3.11/site-packages',
]
USER_BASE: '/home/tipriest/.local' (exists)
USER_SITE: '/home/tipriest/.local/lib/python3.11/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
1
2
3
4
5
6
7
8
9
10
11
> python -m site  
sys.path = [
   '/home/tipriest',
   '/home/tipriest/anaconda3/envs/rag2/lib/python310.zip',
   '/home/tipriest/anaconda3/envs/rag2/lib/python3.10',
   '/home/tipriest/anaconda3/envs/rag2/lib/python3.10/lib-dynload',
   '/home/tipriest/anaconda3/envs/rag2/lib/python3.10/site-packages',
]
USER_BASE: '/home/tipriest/.local' (exists)
USER_SITE: '/home/tipriest/.local/lib/python3.10/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

不正常的python -m site输出

可以看到,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ls@ls:~$ conda activate open-mmlab  
(open-mmlab) ls@ls:~$ python -m site
sys.path = [
   '/home/ls',
   '/opt/ros/noetic/lib/python3/dist-packages',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python38.zip',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python3.8',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python3.8/lib-dynload',
   '/home/ls/.local/lib/python3.8/site-packages',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python3.8/site-packages',
]
USER_BASE: '/home/ls/.local' (exists)
USER_SITE: '/home/ls/.local/lib/python3.8/site-packages' (exists)
ENABLE_USER_SITE: True

临时解决方案

.bashrc中加入export PYTHONNOUSERSITE=1,加入之后的效果,之后再source的时候就对了,不同的环境不会都是一个pip 的源了,能够很好地解决问题

1
2
3
4
5
6
7
8
9
10
11
12
(open-mmlab) ls@ls:~$ python -m site  
sys.path = [
   '/home/ls',
   '/opt/ros/noetic/lib/python3/dist-packages',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python38.zip',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python3.8',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python3.8/lib-dynload',
   '/home/ls/anaconda3/envs/open-mmlab/lib/python3.8/site-packages',
]
USER_BASE: '/home/ls/.local' (exists)
USER_SITE: '/home/ls/.local/lib/python3.8/site-packages' (exists)
ENABLE_USER_SITE: False

python -m site命令的作用

python -m site 这条命令的作用是 输出当前 Python 解释器的站点配置信息,包括模块搜索路径(sys.path)、用户和系统级别的包安装目录(site-packages)等。以下是详细解释:

功能解析

  1. 显示模块搜索路径(sys.path

    • 执行命令后,会列出 Python 解释器在导入模块时搜索的所有路径,包括:

      • 标准库路径(如 /usr/lib/python3.x)。

      • 第三方库路径(如 /usr/local/lib/python3.x/site-packages)。

      • 用户自定义路径(如通过 PYTHONPATH 环境变量添加的路径)。

  2. 显示用户和系统站点目录

    • 输出用户专属的包安装目录(如 ~/.local/lib/python3.x/site-packages),以及系统全局的包安装目录(如 /usr/lib/python3.x/site-packages)。
  3. 启用或禁用用户站点目录

    • 根据配置,Python 可能会自动添加用户级别的 site-packages 目录到模块搜索路径。通过此命令可以检查该功能是否开启。
  4. 调试路径问题

    • 当模块导入失败或路径冲突时,此命令可帮助开发者快速定位路径配置问题。

示例输出

执行 python -m site 的典型输出如下:

1
2
3
4
5
6
7
8
9
sys.path = [  
  '/usr/lib/python3.x',
  '/usr/lib/python3.x/lib-dynload',
  '/home/user/.local/lib/python3.x/site-packages',
  '/usr/local/lib/python3.x/dist-packages',
]
USER_BASE: '/home/user/.local' (存在)
USER_SITE: '/home/user/.local/lib/python3.x/site-packages' (存在)
ENABLE_USER_SITE: True

输出中,sys.path 是模块搜索路径列表,USER_BASEUSER_SITE 是用户专属的包安装目录,ENABLE_USER_SITE 表示是否启用用户站点目录。


用途场景

  1. 检查虚拟环境配置 在虚拟环境中运行此命令,可确认是否成功隔离了全局路径。

  2. 验证自定义路径 若通过 PYTHONPATH 添加了自定义路径,可确认是否生效。

  3. 调试模块导入问题 当出现 ModuleNotFoundError 时,检查 sys.path 是否包含目标模块所在目录。


相关参数

  • --user-base:仅输出用户专属的包安装根目录(如 ~/.local)。

  • --user-site:仅输出用户专属的 site-packages 目录路径。

  • -s--no-site-packages):禁用系统级别的 site-packages(常用于虚拟环境)。


参考资料

  • 解释了 site 模块的作用及 python -m 的运行机制。